Pinq\Providers\Utilities\QueryResultCollection::tryComputeResults PHP Метод

tryComputeResults() публичный Метод

public tryComputeResults ( Expression $queryExpression, &$results )
$queryExpression Pinq\Expressions\Expression
    public function tryComputeResults(O\Expression $queryExpression, &$results)
    {
        if (isset($this->storage[$queryExpression])) {
            $results = $this->storage[$queryExpression];
            return true;
        }
        $foundApplicableResults = false;
        //Searches the query expression tree and checks if any parent expressions have saved results
        //If so, the expression tree is updated with a Traversable implementation with the saved results
        $applicableScopeFinder = function (O\Expression $expression, O\ExpressionWalker $self) use(&$foundApplicableResults) {
            if (isset($this->storage[$expression])) {
                $foundApplicableResults = true;
                return O\Expression::value($this->newTraversable($this->storage[$expression]));
            }
            if ($expression instanceof O\ValueExpression) {
                return $expression;
            }
            /** @var $expression O\TraversalExpression */
            return $expression->updateValue($self->walk($expression->getValue()));
        };
        $traversalWalker = new O\DynamicExpressionWalker([O\TraversalExpression::getType() => $applicableScopeFinder, O\ValueExpression::getType() => $applicableScopeFinder]);
        $remainingQueryExpression = $traversalWalker->walk($queryExpression);
        //If found applicable results, execute the updated expression tree against the Traversable
        //implementation to compute the result of the query.
        $results = $foundApplicableResults ? $remainingQueryExpression->evaluate() : null;
        return $foundApplicableResults;
    }

Usage Example

Пример #1
0
 public function testComputesResultsFromUsingMostApplicableParentRequest()
 {
     $sourceExpression = $this->queryable->getExpression();
     $this->queryResultsCollection->saveResults($sourceExpression, \Pinq\Traversable::from([1])->select(function () {
         $this->assertTrue(false, 'Source expression results should not be called');
     })->getIterator());
     $subscopeQueryable = $this->queryable->skip(5);
     $this->queryResultsCollection->saveResults($subscopeQueryable->getExpression(), [5, 6, 7, 8, 0]);
     $subSubscopeQueryable = $subscopeQueryable->select(function ($i) {
         return $i * 10;
     })->indexBy(function ($i) {
         return $i / 5;
     });
     $this->assertTrue($this->queryResultsCollection->tryComputeResults($subSubscopeQueryable->getExpression(), $results));
     $this->assertInstanceOf(ITraversable::ITRAVERSABLE_TYPE, $results);
     /** @var $results ITraversable */
     $this->assertSame([10 => 50, 12 => 60, 14 => 70, 16 => 80, 0 => 0], $results->asArray());
 }