From 88f04b5ebd62ed7c06dd91da12bae55a4e123a45 Mon Sep 17 00:00:00 2001 From: "Fabio B. Silva" Date: Sat, 30 Jun 2012 19:25:54 -0300 Subject: [PATCH] parse nested new operators --- lib/Doctrine/ORM/Query/Parser.php | 6 +- lib/Doctrine/ORM/Query/SqlWalker.php | 64 ++++++++++++------- .../Tests/ORM/Functional/NewOperatorTest.php | 6 +- 3 files changed, 49 insertions(+), 27 deletions(-) diff --git a/lib/Doctrine/ORM/Query/Parser.php b/lib/Doctrine/ORM/Query/Parser.php index 49cc7f6b5..4b577af96 100644 --- a/lib/Doctrine/ORM/Query/Parser.php +++ b/lib/Doctrine/ORM/Query/Parser.php @@ -1680,10 +1680,8 @@ class Parser return new AST\SimpleSelectExpression($expression); - case ($peek['type'] !== Lexer::T_OPEN_PARENTHESIS): - $expression = $this->IdentificationVariable(); - - return new AST\SimpleSelectExpression($expression); + case ($this->_lexer->lookahead['type'] === Lexer::T_NEW): + return $this->NewObjectExpression(); case ($this->_isFunction()): // SUM(u.id) + COUNT(u.id) diff --git a/lib/Doctrine/ORM/Query/SqlWalker.php b/lib/Doctrine/ORM/Query/SqlWalker.php index 5ffdccc16..c6eb8e2cb 100644 --- a/lib/Doctrine/ORM/Query/SqlWalker.php +++ b/lib/Doctrine/ORM/Query/SqlWalker.php @@ -1229,28 +1229,7 @@ class SqlWalker implements TreeWalker break; case ($expr instanceof AST\NewObjectExpression): - - $sqlSelectExpressions = array(); - $objIndex = $this->newObjectCounter ++; - foreach ($expr->args as $argIndex => $e) { - - $resultAlias = $this->scalarResultCounter++; - $columnAlias = $this->getSQLColumnAlias('sclr') . $resultAlias; - $resultAliasMap = $this->scalarResultAliasMap; - $sqlSelectExpressions[] = $this->walkSimpleSelectExpression($e) . ' AS ' . $columnAlias; - - - $this->scalarResultAliasMap[$resultAlias] = $columnAlias; - $this->rsm->addScalarResult($columnAlias, $resultAlias, 'string'); - - $this->rsm->newObjectMappings[$columnAlias] = array( - 'className' => $expr->className, - 'objIndex' => $objIndex, - 'argIndex' => $argIndex - ); - } - - $sql .= implode(',', $sqlSelectExpressions); + $sql .= $this->walkNewObject($expr); break; default: @@ -1419,6 +1398,47 @@ class SqlWalker implements TreeWalker . $this->walkSimpleSelectExpression($simpleSelectClause->simpleSelectExpression); } + /** + * @param AST\NewObjectExpression + * @return string The SQL. + */ + public function walkNewObject($newObjectExpression) + { + + $sqlSelectExpressions = array(); + $objIndex = $this->newObjectCounter ++; + foreach ($newObjectExpression->args as $argIndex => $e) { + + $resultAlias = $this->scalarResultCounter++; + $columnAlias = $this->getSQLColumnAlias('sclr') . $resultAlias; + $resultAliasMap = $this->scalarResultAliasMap; + + switch (true) { + case $e instanceof AST\NewObjectExpression: + + $sqlSelectExpressions[] = $e->dispatch($this); + + break; + + default: + $sqlSelectExpressions[] = $e->dispatch($this) . ' AS ' . $columnAlias; + break; + } + + + $this->scalarResultAliasMap[$resultAlias] = $columnAlias; + $this->rsm->addScalarResult($columnAlias, $resultAlias, 'string'); + + $this->rsm->newObjectMappings[$columnAlias] = array( + 'className' => $newObjectExpression->className, + 'objIndex' => $objIndex, + 'argIndex' => $argIndex + ); + } + + return implode(',', $sqlSelectExpressions); + } + /** * Walks down a SimpleSelectExpression AST node, thereby generating the appropriate SQL. * diff --git a/tests/Doctrine/Tests/ORM/Functional/NewOperatorTest.php b/tests/Doctrine/Tests/ORM/Functional/NewOperatorTest.php index 6291427c0..76fa8656b 100644 --- a/tests/Doctrine/Tests/ORM/Functional/NewOperatorTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/NewOperatorTest.php @@ -129,7 +129,11 @@ class NewOperatorTest extends \Doctrine\Tests\OrmFunctionalTestCase new Doctrine\Tests\Models\CMS\CmsUserDTO( u.name, e.email, - new Doctrine\Tests\Models\CMS\CmsUserDTO(a.country, a.city, a.zip) + new Doctrine\Tests\Models\CMS\CmsUserDTO( + a.country, + a.city, + a.zip + ) ) FROM Doctrine\Tests\Models\CMS\CmsUser u