public function optimizeQuery(O\Expression $queryExpression) { //Converts all values requests (->asArray(), ->asIterator(), ->asCollection(), ->asTraversable()) //to ->asTrueIterator() such that the true underlying values are retrieved //and hence can be cached as a Traversable instance such that any queries //on scoped values can be evaluated in memory using the traversable implementation. if ($queryExpression instanceof O\MethodCallExpression) { $nameExpression = $queryExpression->getName(); if ($nameExpression instanceof O\ValueExpression) { switch (strtolower($nameExpression->getValue())) { case 'asarray': case 'asiterator': case 'ascollection': case 'astraversable': return $queryExpression->update($queryExpression->getValue(), O\Expression::value('getTrueIterator'), $queryExpression->getArguments()); } } } return $queryExpression; }
public function inline(IFunction $function, O\Expression $expression, Parameters\ResolvedParameterRegistry $parameters) { /** @var $expression O\VariableExpression */ return $expression->update($this->getResolvedValueExpression($parameters, $expression->getName())); }