From ed89695a8cf54f5497ba3c61d0be648b72091f9d Mon Sep 17 00:00:00 2001 From: "Fabio B. Silva" Date: Sun, 8 Jan 2012 16:47:12 -0200 Subject: [PATCH] collect new object parameters --- lib/Doctrine/ORM/Query/ResultSetMapping.php | 5 ++ lib/Doctrine/ORM/Query/SqlWalker.php | 11 +++- .../Tests/ORM/Functional/QueryTest.php | 63 ++++++++++++++++++- 3 files changed, 76 insertions(+), 3 deletions(-) diff --git a/lib/Doctrine/ORM/Query/ResultSetMapping.php b/lib/Doctrine/ORM/Query/ResultSetMapping.php index b8cbd3225..35505bf5c 100644 --- a/lib/Doctrine/ORM/Query/ResultSetMapping.php +++ b/lib/Doctrine/ORM/Query/ResultSetMapping.php @@ -118,6 +118,11 @@ class ResultSetMapping */ public $isIdentifierColumn = array(); + /** + * @var array Maps column names in the result set to field names for each new object expression. + */ + public $newObjectMappings = array(); + /** * Adds an entity result to this ResultSetMapping. * diff --git a/lib/Doctrine/ORM/Query/SqlWalker.php b/lib/Doctrine/ORM/Query/SqlWalker.php index 15b4a173c..be9e59235 100644 --- a/lib/Doctrine/ORM/Query/SqlWalker.php +++ b/lib/Doctrine/ORM/Query/SqlWalker.php @@ -1222,9 +1222,16 @@ class SqlWalker implements TreeWalker break; case ($expr instanceof AST\NewObjectExpression): - $sqlSelectExpressions = array_filter(array_map(array($this, 'walkSelectExpression'), $expr->args)); - $sql .= implode(', ', $sqlSelectExpressions); + $sqlSelectExpressions = array(); + $this->_rsm->newObjectMappings['className'] = $expr->className; + foreach ($expr->args as $e) { + $resultAliasMap = $this->scalarResultAliasMap; + $sqlSelectExpressions[] = $this->walkSelectExpression($e); + $this->_rsm->newObjectMappings['resultAliasMap'][] = array_diff($this->scalarResultAliasMap, $resultAliasMap); + } + + $sql .= implode(', ', $sqlSelectExpressions); break; default: diff --git a/tests/Doctrine/Tests/ORM/Functional/QueryTest.php b/tests/Doctrine/Tests/ORM/Functional/QueryTest.php index 906b5e68f..133b8910e 100644 --- a/tests/Doctrine/Tests/ORM/Functional/QueryTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/QueryTest.php @@ -780,4 +780,65 @@ class QueryTest extends \Doctrine\Tests\OrmFunctionalTestCase $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUser', $users[2]); $this->assertNull($users[3]); } -} + + /** + * @group DDC-1574 + */ + public function testSupportsNewOperator() + { + $u1 = new CmsUser; + $u2 = new CmsUser; + $u3 = new CmsUser; + + $u1->setEmail(new \Doctrine\Tests\Models\CMS\CmsEmail()); + $u1->setAddress(new \Doctrine\Tests\Models\CMS\CmsAddress()); + + $u2->setEmail(new \Doctrine\Tests\Models\CMS\CmsEmail()); + $u2->setAddress(new \Doctrine\Tests\Models\CMS\CmsAddress()); + + $u3->setEmail(new \Doctrine\Tests\Models\CMS\CmsEmail()); + $u3->setAddress(new \Doctrine\Tests\Models\CMS\CmsAddress()); + + $u1->name = 'Test 1'; + $u1->username = '1test'; + $u1->status = 'developer'; + $u1->email->email = 'email@test1.com'; + $u1->address->zip = '111111111'; + $u1->address->city = 'Some City 1'; + $u1->address->country = 'Some Country 2'; + + $u2->name = 'Test 2'; + $u2->username = '2test'; + $u2->status = 'developer'; + $u2->email->email = 'email@test2.com'; + $u2->address->zip = '111111111'; + $u2->address->city = 'Some City 2'; + $u2->address->country = 'Some Country 2'; + + $u3->name = 'Fabio Silva'; + $u3->username = 'FabioBatSilva'; + $u3->status = 'developer'; + $u3->email->email = 'fabio.bat.silva@gmail.com'; + $u3->address->zip = '33333333'; + $u3->address->city = 'Some City 3'; + $u3->address->country = 'Some Country 3'; + + $this->_em->persist($u1); + $this->_em->persist($u2); + $this->_em->persist($u3); + + $this->_em->flush(); + $this->_em->clear(); + + $query = $this->_em->createQuery("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 ORDER BY u.name"); + $result = $query->getResult(); + + $this->assertEquals(3, count($result)); + + $this->markTestIncomplete(); + + $this->assertTrue($result[0] instanceof \Doctrine\Tests\Models\CMS\CmsUserDTO); + $this->assertTrue($result[1] instanceof \Doctrine\Tests\Models\CMS\CmsUserDTO); + $this->assertTrue($result[2] instanceof \Doctrine\Tests\Models\CMS\CmsUserDTO); + } +} \ No newline at end of file