PHP Class Neos\Eel\FlowQuery\FlowQuery
It is specifically implemented for being used inside Eel, the Embedded Expression
Language for Flow.
Essentially, a FlowQuery object is a container for an *ordered set* of objects
of a certain type. On this container, *operations* can be applied (like
filter(), children(), ...).
All of these operations work on a *set*, that is, an operation usually expands
or shrinks the set of objects.
An operation normally returns a new FlowQuery instance with the operation applied,
but there are also some operations like is(...) or count(), which return simple
types like boolean or numbers. We call these operations *final operations*.
Internal Workings
=================
To allow for optimization, calling operations are not immediately executed.
Instead, they are appended to a *list of operations*. Only if one tries to
iterate over the FlowQuery object or calls a final operation, the operations
get executed and the result is computed.
Implementation of Operations
----------------------------
Operations are implemented by implementing the {@link OperationInterface} or,
more commonly, subclassing the {@link Operations/AbstractOperation}.
An operation must be *equivalence preserving*, that is, the following equation
must always hold:
applyAllOperations(context) = applyRemainingOperations(applyOperation(context))
While an operation is running, it can *add new operations* to the front of the
operation queue (with {@link pushOperation()}), so for example count($filter)
can first apply filter($filter), followed by count(). However, when doing this,
great care must be applied by the operation developer in order to still have
finite runs, and to make sure the operation is *equivalence preserving*.
Furthermore, an operation can *pop* its following operations from the operation
stack, and *peek* what the next operation is. It is up to the operation developer
to ensure equivalence preservation.
An operation may *never* invoke __call() on the FlowQuery object it receives;
as this might lead to an undefined state; i.e. you are not allowed to do:
$flowQuery->someOtherOperation() *inside* an operation.
Final Operations
----------------
If an operation is final, it should return the resulting value directly.
Show file
Open project: neos/flow-development-collection
Class Usage Examples
Protected Properties
Property |
Type |
Description |
|
$context |
array | Traversable |
the objects this FlowQuery object wraps |
|
$operationResolver |
Neos\Eel\FlowQuery\OperationResolverInterface |
|
|
$operations |
array |
..', 'arguments' => array(...))
whereas the name is a string like 'children' and the arguments
are a numerically-indexed array |
|
Public Methods
Method |
Description |
|
__call ( string $operationName, array $arguments ) : FlowQuery |
Add a new operation to the operation list and return the new FlowQuery
object. If the operation is final, we directly compute the result and
return the value. |
|
__construct ( array | Traversable $context, array $operations = [] ) |
Construct a new FlowQuery object from $context and $operations. |
|
allowsCallOfMethod ( string $methodName ) : boolean |
|
|
count ( ) : integer |
Implementation of the countable() interface, which is mapped to the "count" operation. |
|
getContext ( ) : array | Traversable |
Get the current context. |
|
getIterator ( ) : ArrayIterator |
Called when iterating over this FlowQuery object, triggers evaluation. |
|
peekOperationName ( ) : string |
Peek onto the next operation name, if any, or NULL otherwise. |
|
popOperation ( ) : array |
Pop the topmost operation from the stack and return it; i.e. the
operation which should be executed next. The returned array has
the form:
array('name' => '. |
|
pushOperation ( string $operationName, array $arguments ) |
Push a new operation onto the operations stack. |
|
setContext ( array | Traversable $context ) |
Set the updated context with the operation result applied. |
|
setOperationResolver ( Neos\Eel\FlowQuery\OperationResolverInterface $operationResolver ) |
Setter for setting the operation resolver from the outside, only needed
to successfully run unit tests (hacky!) |
|
Protected Methods
Method Details
Add a new operation to the operation list and return the new FlowQuery
object. If the operation is final, we directly compute the result and
return the value.
__construct()
public method
Only the $context parameter belongs to the public API!
If a FlowQuery is given as the $context we unwrap its context to assert q(q(context)) == q(context).
allowsCallOfMethod()
public method
Implementation of the countable() interface, which is mapped to the "count" operation.
evaluateOperations()
protected method
getContext()
public method
Should only be called inside an operation.
getIterator()
public method
Should NEVER be called inside an operation!
peekOperationName()
public method
Should only be called inside an operation.
popOperation()
public method
..', 'arguments' => array(...))
Should only be called inside an operation.
pushOperation()
public method
The last-pushed operation is executed FIRST! (LIFO)
Should only be called inside an operation.
setContext()
public method
Should only be called inside an operation.
setOperationResolver()
public method
Setter for setting the operation resolver from the outside, only needed
to successfully run unit tests (hacky!)
public setOperationResolver ( Neos\Eel\FlowQuery\OperationResolverInterface $operationResolver ) |
$operationResolver |
Neos\Eel\FlowQuery\OperationResolverInterface |
|
Property Details
$context protected property
the objects this FlowQuery object wraps
$operationResolver protected property
protected OperationResolverInterface,Neos\Eel\FlowQuery $operationResolver |
return |
Neos\Eel\FlowQuery\OperationResolverInterface |
|
$operations protected property
..', 'arguments' => array(...))
whereas the name is a string like 'children' and the arguments
are a numerically-indexed array
protected array $operations |
return |
array |
|