From 0e60c50c5e4e661ae3bc33bcab6468282b102607 Mon Sep 17 00:00:00 2001 From: "Fabio B. Silva" Date: Sat, 7 Jan 2012 14:42:44 -0200 Subject: [PATCH] small code refactoring --- .../ORM/Query/AST/NewObjectExpression.php | 16 ++++++------- lib/Doctrine/ORM/Query/Parser.php | 24 ++++++++++++++----- lib/Doctrine/ORM/Query/SqlWalker.php | 2 +- .../ORM/Query/SelectSqlGenerationTest.php | 2 +- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/lib/Doctrine/ORM/Query/AST/NewObjectExpression.php b/lib/Doctrine/ORM/Query/AST/NewObjectExpression.php index 1642b6bfe..c92481a62 100644 --- a/lib/Doctrine/ORM/Query/AST/NewObjectExpression.php +++ b/lib/Doctrine/ORM/Query/AST/NewObjectExpression.php @@ -20,7 +20,7 @@ namespace Doctrine\ORM\Query\AST; /** - * NewObjectExpression ::= "NEW" IdentificationVariable "(" SimpleSelectExpression {"," SimpleSelectExpression}* ")" + * NewObjectExpression ::= "NEW" IdentificationVariable "(" SelectExpression {"," SelectExpression}* ")" * * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link www.doctrine-project.org @@ -32,21 +32,21 @@ class NewObjectExpression extends Node /** * @var string */ - public $identificationVariable; + public $className; /** * @var array */ - public $fieldSet; + public $args; /** - * @param type $identificationVariable - * @param array $fieldSet + * @param type $className + * @param array $args */ - public function __construct($identificationVariable, array $fieldSet) + public function __construct($className, array $args) { - $this->identificationVariable = $identificationVariable; - $this->fieldSet = $fieldSet; + $this->className = $className; + $this->args = $args; } /** diff --git a/lib/Doctrine/ORM/Query/Parser.php b/lib/Doctrine/ORM/Query/Parser.php index 657280284..94a435a37 100644 --- a/lib/Doctrine/ORM/Query/Parser.php +++ b/lib/Doctrine/ORM/Query/Parser.php @@ -1630,7 +1630,7 @@ class Parser } /** - * NewObjectExpression ::= "NEW" IdentificationVariable "(" SimpleSelectExpression {"," SimpleSelectExpression}* ")" + * NewObjectExpression ::= "NEW" IdentificationVariable "(" SelectExpression {"," SelectExpression}* ")" * @return \Doctrine\ORM\Query\AST\NewObjectExpression */ public function NewObjectExpression() @@ -1638,20 +1638,33 @@ class Parser $this->match(Lexer::T_NEW); $this->match(Lexer::T_IDENTIFIER); - $identificationVariable = $this->_lexer->token['value']; + $className = $this->_lexer->token['value']; + + if ( ! class_exists($className, true)) { + $this->semanticalError("Class '$className' is not defined.", $this->_lexer->token); + } + + $class = new \ReflectionClass($className); + if($class->getConstructor() === null) { + $this->semanticalError("Class '$className' has not a valid contructor.", $this->_lexer->token); + } $this->match(Lexer::T_OPEN_PARENTHESIS); - $fieldSet[] = $this->SelectExpression(); + $args[] = $this->SelectExpression(); while ($this->_lexer->isNextToken(Lexer::T_COMMA)) { $this->match(Lexer::T_COMMA); - $fieldSet[] = $this->SelectExpression(); + $args[] = $this->SelectExpression(); } $this->match(Lexer::T_CLOSE_PARENTHESIS); - $expression = new AST\NewObjectExpression($identificationVariable, $fieldSet); + if($class->getConstructor()->getNumberOfRequiredParameters() > sizeof($args)) { + $this->semanticalError("Number of arguments does not match definition.", $this->_lexer->token); + } + + $expression = new AST\NewObjectExpression($className, $args); // @TODO : Defer NewObjectExpression validation ? return $expression; @@ -1984,7 +1997,6 @@ class Parser // NewObjectExpression (New ClassName(id, name)) case ($lookaheadType === Lexer::T_NEW): $expression = $this->NewObjectExpression(); - //$identVariable = $expression->identificationVariable; break; default: diff --git a/lib/Doctrine/ORM/Query/SqlWalker.php b/lib/Doctrine/ORM/Query/SqlWalker.php index 2bad829f9..15b4a173c 100644 --- a/lib/Doctrine/ORM/Query/SqlWalker.php +++ b/lib/Doctrine/ORM/Query/SqlWalker.php @@ -1222,7 +1222,7 @@ class SqlWalker implements TreeWalker break; case ($expr instanceof AST\NewObjectExpression): - $sqlSelectExpressions = array_filter(array_map(array($this, 'walkSelectExpression'), $expr->fieldSet)); + $sqlSelectExpressions = array_filter(array_map(array($this, 'walkSelectExpression'), $expr->args)); $sql .= implode(', ', $sqlSelectExpressions); break; diff --git a/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php b/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php index 074fdbd5f..1e812f366 100644 --- a/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php +++ b/tests/Doctrine/Tests/ORM/Query/SelectSqlGenerationTest.php @@ -1561,7 +1561,7 @@ class SelectSqlGenerationTest extends \Doctrine\Tests\OrmTestCase public function testSupportsNewOperator() { $this->assertSqlGeneration( - 'SELECT new Doctrine\Tests\Models\CMS\CmsUser(u.name, e.email, a.city) FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.email e JOIN u.address a', + 'SELECT new Doctrine\Tests\Models\CMS\CmsUserDTO(u.name, e.email, a.city) FROM Doctrine\Tests\Models\CMS\CmsUser u JOIN u.email e JOIN u.address a', 'SELECT c0_.name AS name0, c1_.email AS email1, c2_.city AS city2 FROM cms_users c0_ INNER JOIN cms_emails c1_ ON c0_.email_id = c1_.id INNER JOIN cms_addresses c2_ ON c0_.id = c2_.user_id' ); }