public function evaluate(FlowQuery $flowQuery, array $arguments)
{
$context = $flowQuery->getContext();
if (!isset($context[0]) || empty($arguments[0])) {
return;
}
$result = array();
$selectorAndFilter = $arguments[0];
$parsedFilter = null;
$parsedFilter = FizzleParser::parseFilterGroup($selectorAndFilter);
if (isset($parsedFilter['Filters']) && $this->hasOnlyInstanceOfFilters($parsedFilter['Filters'])) {
$nodeTypes = array();
foreach ($parsedFilter['Filters'] as $filter) {
$nodeTypes[] = $filter['AttributeFilters'][0]['Operand'];
}
/** @var NodeInterface $contextNode */
foreach ($context as $contextNode) {
$result = array_merge($result, $this->nodeDataRepository->findByParentAndNodeTypeInContext($contextNode->getPath(), implode(',', $nodeTypes), $contextNode->getContext(), true));
}
} else {
foreach ($parsedFilter['Filters'] as $filter) {
$filterResults = array();
$generatedNodes = false;
if (isset($filter['IdentifierFilter'])) {
if (!preg_match(UuidValidator::PATTERN_MATCH_UUID, $filter['IdentifierFilter'])) {
throw new FlowQueryException('find() requires a valid identifier', 1332492263);
}
/** @var NodeInterface $contextNode */
foreach ($context as $contextNode) {
$filterResults = array($contextNode->getContext()->getNodeByIdentifier($filter['IdentifierFilter']));
}
$generatedNodes = true;
} elseif (isset($filter['PropertyNameFilter']) || isset($filter['PathFilter'])) {
$nodePath = isset($filter['PropertyNameFilter']) ? $filter['PropertyNameFilter'] : $filter['PathFilter'];
foreach ($context as $contextNode) {
$node = $contextNode->getNode($nodePath);
if ($node !== null) {
array_push($filterResults, $node);
}
}
$generatedNodes = true;
}
if (isset($filter['AttributeFilters']) && $filter['AttributeFilters'][0]['Operator'] === 'instanceof') {
foreach ($context as $contextNode) {
$filterResults = array_merge($filterResults, $this->nodeDataRepository->findByParentAndNodeTypeInContext($contextNode->getPath(), $filter['AttributeFilters'][0]['Operand'], $contextNode->getContext(), true));
}
unset($filter['AttributeFilters'][0]);
$generatedNodes = true;
}
if (isset($filter['AttributeFilters']) && count($filter['AttributeFilters']) > 0) {
if (!$generatedNodes) {
throw new FlowQueryException('find() needs an identifier, path or instanceof filter for the first filter part', 1436884196);
}
$filterQuery = new FlowQuery($filterResults);
foreach ($filter['AttributeFilters'] as $attributeFilter) {
$filterQuery->pushOperation('filter', array($attributeFilter['text']));
}
$filterResults = $filterQuery->get();
}
$result = array_merge($result, $filterResults);
}
}
$flowQuery->setContext(array_unique($result));
}