lib/Doctrine/ORM/Tools/Pagination/LimitSubqueryOutputWalker.php
private function addMissingItemsFromOrderByToSelect(SelectStatement $AST)
    {
        $this->orderByPathExpressions = [];

        // We need to do this in another walker because otherwise we'll end up
        // polluting the state of this one.
        $walker = clone $this;

        // This will populate $orderByPathExpressions via
        // LimitSubqueryOutputWalker::walkPathExpression, which will be called
        // as the select statement is walked. We'll end up with an array of all
        // path expressions referenced in the query.
        $walker->walkSelectStatementWithoutRowNumber($AST, false);
        $orderByPathExpressions = $walker->getOrderByPathExpressions();

        // Get a map of referenced identifiers to field names.
        $selects = [];

        foreach ($orderByPathExpressions as $pathExpression) {
            $idVar = $pathExpression->identificationVariable;
            $field = $pathExpression->field;

            if (! isset($selects[$idVar])) {
                $selects[$idVar] = [];
            }

            $selects[$idVar][$field] = true;
        }

        // Loop the select clause of the AST and exclude items from $select
        // that are already being selected in the query.
        foreach ($AST->selectClause->selectExpressions as $selectExpression) {
            if ($selectExpression instanceof SelectExpression) {
                $idVar = $selectExpression->expression;

                if (! is_string($idVar)) {
                    continue;
                }

                $field = $selectExpression->fieldIdentificationVariable;

                if ($field === null) {
                    // No need to add this select, as we're already fetching the whole object.
                    unset($selects[$idVar]);
                } else {
                    unset($selects[$idVar][$field]);
                }
            }
        }

        // Add select items which were not excluded to the AST's select clause.
        foreach ($selects as $idVar => $fields) {
            $selectExpression = new SelectExpression(new PartialObjectExpression($idVar, array_keys($fields)), null, true);

            $AST->selectClause->selectExpressions[] = $selectExpression;
        }
    }
private function addMissingItemsFromOrderByToSelect(SelectStatement $AST)
    {
        $this->orderByPathExpressions = [];

        // We need to do this in another walker because otherwise we'll end up
        // polluting the state of this one.
        $walker = clone $this;

        // This will populate $orderByPathExpressions via
        // LimitSubqueryOutputWalker::walkPathExpression, which will be called
        // as the select statement is walked. We'll end up with an array of all
        // path expressions referenced in the query.
        $walker->walkSelectStatementWithoutRowNumber($AST, false);
        $orderByPathExpressions = $walker->getOrderByPathExpressions();

        // Get a map of referenced identifiers to field names.
        $selects = [];

        foreach ($orderByPathExpressions as $pathExpression) {
            $idVar = $pathExpression->identificationVariable;
            $field = $pathExpression->field;

            if (! isset($selects[$idVar])) {
                $selects[$idVar] = [];
            }

            $selects[$idVar][$field] = true;
        }

        // Loop the select clause of the AST and exclude items from $select
        // that are already being selected in the query.
        foreach ($AST->selectClause->selectExpressions as $selectExpression) {
            if ($selectExpression instanceof SelectExpression) {
                $idVar = $selectExpression->expression;

                if (! is_string($idVar)) {
                    continue;
                }

                $field = $selectExpression->fieldIdentificationVariable;

                if ($field === null) {
                    // No need to add this select, as we're already fetching the whole object.
                    unset($selects[$idVar]);
                } else {
                    unset($selects[$idVar][$field]);
                }
            }
        }

        // Add select items which were not excluded to the AST's select clause.
        foreach ($selects as $idVar => $fields) {
            $selectExpression = new SelectExpression(new PartialObjectExpression($idVar, array_keys($fields)), null, true);

            $AST->selectClause->selectExpressions[] = $selectExpression;
        }
    }
private function addMissingItemsFromOrderByToSelect ( SelectStatement $ AST ) { $ this -> orderByPathExpressions = [ ] ; // We need to do this in another walker because otherwise we'll end up // polluting the state of this one. $ walker = clone $ this ; // This will populate $orderByPathExpressions via // LimitSubqueryOutputWalker::walkPathExpression, which will be called // as the select statement is walked. We'll end up with an array of all // path expressions referenced in the query. $ walker -> walkSelectStatementWithoutRowNumber ( $ AST , false ) ; $ orderByPathExpressions = $ walker -> getOrderByPathExpressions ( ) ; // Get a map of referenced identifiers to field names. $ selects = [ ] ; foreach ( $ orderByPathExpressions as $ pathExpression ) { $ idVar = $ pathExpression -> identificationVariable ; $ field = $ pathExpression -> field ; if ( ! isset ( $ selects [ $ idVar ] ) ) { $ selects [ $ idVar ] = [ ] ; } $ selects [ $ idVar ] [ $ field ] = true ; } // Loop the select clause of the AST and exclude items from $select // that are already being selected in the query. foreach ( $ AST -> selectClause -> selectExpressions as $ selectExpression ) { if ( $ selectExpression instanceof SelectExpression ) { $ idVar = $ selectExpression -> expression ; if ( ! is_string ( $ idVar ) ) { continue ; } $ field = $ selectExpression -> fieldIdentificationVariable ; if ( $ field === null ) { // No need to add this select, as we're already fetching the whole object. unset ( $ selects [ $ idVar ] ) ; } else { unset ( $ selects [ $ idVar ] [ $ field ] ) ; } } } // Add select items which were not excluded to the AST's select clause. foreach ( $ selects as $ idVar => $ fields ) { $ selectExpression = new SelectExpression ( new PartialObjectExpression ( $ idVar , array_keys ( $ fields ) ) , null , true ) ; $ AST -> selectClause -> selectExpressions [ ] = $ selectExpression ; } }
Finds all PathExpressions in an AST's OrderByClause, and ensures that
the referenced fields are present in the SelectClause of the passed AST.
Finds all PathExpressions in an AST s OrderByClause and ensures that the referenced fields are present in the SelectClause of the passed AST .