/**
  * Parses a query string.
  *
  * @return ParserResult
  */
 public function parse()
 {
     $AST = $this->getAST();
     if (($customWalkers = $this->query->getHint(Query::HINT_CUSTOM_TREE_WALKERS)) !== false) {
         $this->customTreeWalkers = $customWalkers;
     }
     if (($customOutputWalker = $this->query->getHint(Query::HINT_CUSTOM_OUTPUT_WALKER)) !== false) {
         $this->customOutputWalker = $customOutputWalker;
     }
     // Run any custom tree walkers over the AST
     if ($this->customTreeWalkers) {
         $treeWalkerChain = new TreeWalkerChain($this->query, $this->parserResult, $this->queryComponents);
         foreach ($this->customTreeWalkers as $walker) {
             $treeWalkerChain->addTreeWalker($walker);
         }
         switch (true) {
             case $AST instanceof AST\UpdateStatement:
                 $treeWalkerChain->walkUpdateStatement($AST);
                 break;
             case $AST instanceof AST\DeleteStatement:
                 $treeWalkerChain->walkDeleteStatement($AST);
                 break;
             case $AST instanceof AST\SelectStatement:
             default:
                 $treeWalkerChain->walkSelectStatement($AST);
         }
         $this->queryComponents = $treeWalkerChain->getQueryComponents();
     }
     $outputWalkerClass = $this->customOutputWalker ?: __NAMESPACE__ . '\\SqlWalker';
     $outputWalker = new $outputWalkerClass($this->query, $this->parserResult, $this->queryComponents);
     // Assign an SQL executor to the parser result
     $this->parserResult->setSqlExecutor($outputWalker->getExecutor($AST));
     return $this->parserResult;
 }
示例#2
0
 /**
  * Parses a query string.
  *
  * @return ParserResult
  */
 public function parse()
 {
     // Parse & build AST
     $AST = $this->QueryLanguage();
     // Activate semantical checks after this point. Process all deferred checks in pipeline
     $this->_processDeferredExpressionsStack($AST);
     if ($customWalkers = $this->_query->getHint(Query::HINT_CUSTOM_TREE_WALKERS)) {
         $this->_customTreeWalkers = $customWalkers;
     }
     // Run any custom tree walkers over the AST
     if ($this->_customTreeWalkers) {
         $treeWalkerChain = new TreeWalkerChain($this->_query, $this->_parserResult, $this->_queryComponents);
         foreach ($this->_customTreeWalkers as $walker) {
             $treeWalkerChain->addTreeWalker($walker);
         }
         if ($AST instanceof AST\SelectStatement) {
             $treeWalkerChain->walkSelectStatement($AST);
         } else {
             if ($AST instanceof AST\UpdateStatement) {
                 $treeWalkerChain->walkUpdateStatement($AST);
             } else {
                 $treeWalkerChain->walkDeleteStatement($AST);
             }
         }
     }
     if ($this->_customOutputWalker) {
         $outputWalker = new $this->_customOutputWalker($this->_query, $this->_parserResult, $this->_queryComponents);
     } else {
         $outputWalker = new SqlWalker($this->_query, $this->_parserResult, $this->_queryComponents);
     }
     // Assign an SQL executor to the parser result
     $this->_parserResult->setSqlExecutor($outputWalker->getExecutor($AST));
     return $this->_parserResult;
 }
示例#3
0
 /**
  * Parses a query string.
  *
  * @return ParserResult
  */
 public function parse()
 {
     $AST = $this->getAST();
     $this->fixIdentificationVariableOrder($AST);
     $this->assertSelectEntityRootAliasRequirement();
     if (($customWalkers = $this->_query->getHint(Query::HINT_CUSTOM_TREE_WALKERS)) !== false) {
         $this->_customTreeWalkers = $customWalkers;
     }
     if (($customOutputWalker = $this->_query->getHint(Query::HINT_CUSTOM_OUTPUT_WALKER)) !== false) {
         $this->_customOutputWalker = $customOutputWalker;
     }
     // Run any custom tree walkers over the AST
     if ($this->_customTreeWalkers) {
         $treeWalkerChain = new TreeWalkerChain($this->_query, $this->_parserResult, $this->_queryComponents);
         foreach ($this->_customTreeWalkers as $walker) {
             $treeWalkerChain->addTreeWalker($walker);
         }
         if ($AST instanceof AST\SelectStatement) {
             $treeWalkerChain->walkSelectStatement($AST);
         } else {
             if ($AST instanceof AST\UpdateStatement) {
                 $treeWalkerChain->walkUpdateStatement($AST);
             } else {
                 $treeWalkerChain->walkDeleteStatement($AST);
             }
         }
     }
     if ($this->_customOutputWalker) {
         $outputWalker = new $this->_customOutputWalker($this->_query, $this->_parserResult, $this->_queryComponents);
     } else {
         $outputWalker = new SqlWalker($this->_query, $this->_parserResult, $this->_queryComponents);
     }
     // Assign an SQL executor to the parser result
     $this->_parserResult->setSqlExecutor($outputWalker->getExecutor($AST));
     return $this->_parserResult;
 }
示例#4
0
 /**
  * Parses a query string.
  *
  * @return ParserResult
  */
 public function parse()
 {
     $AST = $this->getAST();
     // Fix order of identification variables.
     // They have to appear in the select clause in the same order as the
     // declarations (from ... x join ... y join ... z ...) appear in the query
     // as the hydration process relies on that order for proper operation.
     if (count($this->_identVariableExpressions) > 1) {
         foreach ($this->_queryComponents as $dqlAlias => $qComp) {
             if (isset($this->_identVariableExpressions[$dqlAlias])) {
                 $expr = $this->_identVariableExpressions[$dqlAlias];
                 $key = array_search($expr, $AST->selectClause->selectExpressions);
                 unset($AST->selectClause->selectExpressions[$key]);
                 $AST->selectClause->selectExpressions[] = $expr;
             }
         }
     }
     if (($customWalkers = $this->_query->getHint(Query::HINT_CUSTOM_TREE_WALKERS)) !== false) {
         $this->_customTreeWalkers = $customWalkers;
     }
     if (($customOutputWalker = $this->_query->getHint(Query::HINT_CUSTOM_OUTPUT_WALKER)) !== false) {
         $this->_customOutputWalker = $customOutputWalker;
     }
     // Run any custom tree walkers over the AST
     if ($this->_customTreeWalkers) {
         $treeWalkerChain = new TreeWalkerChain($this->_query, $this->_parserResult, $this->_queryComponents);
         foreach ($this->_customTreeWalkers as $walker) {
             $treeWalkerChain->addTreeWalker($walker);
         }
         if ($AST instanceof AST\SelectStatement) {
             $treeWalkerChain->walkSelectStatement($AST);
         } else {
             if ($AST instanceof AST\UpdateStatement) {
                 $treeWalkerChain->walkUpdateStatement($AST);
             } else {
                 $treeWalkerChain->walkDeleteStatement($AST);
             }
         }
     }
     if ($this->_customOutputWalker) {
         $outputWalker = new $this->_customOutputWalker($this->_query, $this->_parserResult, $this->_queryComponents);
     } else {
         $outputWalker = new SqlWalker($this->_query, $this->_parserResult, $this->_queryComponents);
     }
     // Assign an SQL executor to the parser result
     $this->_parserResult->setSqlExecutor($outputWalker->getExecutor($AST));
     return $this->_parserResult;
 }