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;
}