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; }
/** * Updates the matched expression with it's resolved value from * the supplied registry. * * @param IFunction $function * @param O\Expression $expression * @param Parameters\ResolvedParameterRegistry $parameters * * @return O\Expression */ public function inline(IFunction $function, O\Expression $expression, Parameters\ResolvedParameterRegistry $parameters) { /** @var O\InvocationExpression $expression */ return O\Expression::functionCall(O\Expression::value($this->getResolvedValue($parameters, $expression->getValue())), $expression->getArguments()); }