From 85eac7200dc6e3c9c9d06243450d5a96148f241a Mon Sep 17 00:00:00 2001 From: James Murray Date: Tue, 28 Oct 2014 17:34:57 -0400 Subject: [PATCH 1/8] Adding the ability to alias new object expressions --- lib/Doctrine/ORM/Query/SqlWalker.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/Doctrine/ORM/Query/SqlWalker.php b/lib/Doctrine/ORM/Query/SqlWalker.php index c24fa40cc..16d9e1081 100644 --- a/lib/Doctrine/ORM/Query/SqlWalker.php +++ b/lib/Doctrine/ORM/Query/SqlWalker.php @@ -1353,7 +1353,8 @@ class SqlWalker implements TreeWalker break; case ($expr instanceof AST\NewObjectExpression): - $sql .= $this->walkNewObject($expr); + $resultAlias = $selectExpression->fieldIdentificationVariable ?: null; + $sql .= $this->walkNewObject($expr,$resultAlias); break; default: @@ -1519,10 +1520,10 @@ class SqlWalker implements TreeWalker * * @return string The SQL. */ - public function walkNewObject($newObjectExpression) + public function walkNewObject($newObjectExpression, $newObjectResultAlias=null) { $sqlSelectExpressions = array(); - $objIndex = $this->newObjectCounter++; + $objIndex = $newObjectResultAlias?:$this->newObjectCounter++; foreach ($newObjectExpression->args as $argIndex => $e) { $resultAlias = $this->scalarResultCounter++; From da7e4ed8deefc23b9529ad3d19cc562c9ea9d588 Mon Sep 17 00:00:00 2001 From: James Murray Date: Tue, 28 Oct 2014 17:59:37 -0400 Subject: [PATCH 2/8] removing orphaned scalar results and allowing mixed results when use new object expressions --- lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php | 2 -- lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php | 5 +++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php index 0cb037131..d7554b903 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php @@ -272,8 +272,6 @@ abstract class AbstractHydrator $rowData['newObjects'][$objIndex]['class'] = $cacheKeyInfo['class']; $rowData['newObjects'][$objIndex]['args'][$argIndex] = $value; - - $rowData['scalars'][$fieldName] = $value; break; case (isset($cacheKeyInfo['isScalar'])): diff --git a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php index d4e84da92..9addc1d3c 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php @@ -545,14 +545,15 @@ class ObjectHydrator extends AbstractHydrator $resultKey = $this->resultCounter - 1; } - $count = count($rowData['newObjects']); + + $scalarCount = count($rowData['scalars']); foreach ($rowData['newObjects'] as $objIndex => $newObject) { $class = $newObject['class']; $args = $newObject['args']; $obj = $class->newInstanceArgs($args); - if ($count === 1) { + if (count($args) == $scalarCount) { $result[$resultKey] = $obj; continue; From 2ffda34f233f603208b39c5fc8732cd7761bb747 Mon Sep 17 00:00:00 2001 From: jaimz22 Date: Sat, 8 Nov 2014 10:15:33 -0500 Subject: [PATCH 3/8] fixing a missing index error --- lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php index 9addc1d3c..1dfbfc441 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php @@ -546,7 +546,7 @@ class ObjectHydrator extends AbstractHydrator } - $scalarCount = count($rowData['scalars']); + $scalarCount = (isset($rowData['scalars'])? count($rowData['scalars']): 0); foreach ($rowData['newObjects'] as $objIndex => $newObject) { $class = $newObject['class']; From c47a072815123b127697b85ac7c676d1a7a3ed62 Mon Sep 17 00:00:00 2001 From: jaimz22 Date: Sat, 8 Nov 2014 16:36:55 +0000 Subject: [PATCH 4/8] fixed for failing test case. when a single DTO is specified in the query, you no longer get a multidimensional array returned. --- lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php | 5 +++-- lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php index 507fd7025..f63337b1c 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php @@ -246,14 +246,15 @@ class ArrayHydrator extends AbstractHydrator $resultKey = $this->_resultCounter - 1; } - $count = count($rowData['newObjects']); + $scalarCount = (isset($rowData['scalars'])? count($rowData['scalars']): 0); foreach ($rowData['newObjects'] as $objIndex => $newObject) { $class = $newObject['class']; $args = $newObject['args']; $obj = $class->newInstanceArgs($args); - if ($count === 1) { + // if ($count === 1) { + if (count($args) == $scalarCount || ($scalarCount == 0 && count($rowData['newObjects'])) { $result[$resultKey] = $obj; continue; diff --git a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php index 1dfbfc441..5a44e6689 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php @@ -553,7 +553,8 @@ class ObjectHydrator extends AbstractHydrator $args = $newObject['args']; $obj = $class->newInstanceArgs($args); - if (count($args) == $scalarCount) { + // if (count($args) == $scalarCount) { + if (count($args) == $scalarCount || ($scalarCount == 0 && count($rowData['newObjects']))) { $result[$resultKey] = $obj; continue; From e2f1ea7f23440dd55388a29341d1d2925e27868f Mon Sep 17 00:00:00 2001 From: jaimz22 Date: Sat, 8 Nov 2014 16:45:58 +0000 Subject: [PATCH 5/8] stupid cloud 9 ide broke my code :( sorry --- lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php | 3 +-- lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php index f63337b1c..a79f086ec 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php @@ -253,8 +253,7 @@ class ArrayHydrator extends AbstractHydrator $args = $newObject['args']; $obj = $class->newInstanceArgs($args); - // if ($count === 1) { - if (count($args) == $scalarCount || ($scalarCount == 0 && count($rowData['newObjects'])) { + if (count($args) == $scalarCount || ($scalarCount == 0 && count($rowData['newObjects']))) { $result[$resultKey] = $obj; continue; diff --git a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php index 5a44e6689..f7b37b38f 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php @@ -553,7 +553,6 @@ class ObjectHydrator extends AbstractHydrator $args = $newObject['args']; $obj = $class->newInstanceArgs($args); - // if (count($args) == $scalarCount) { if (count($args) == $scalarCount || ($scalarCount == 0 && count($rowData['newObjects']))) { $result[$resultKey] = $obj; From dd012dfd90c085778b9c3c2638af96c39bc64545 Mon Sep 17 00:00:00 2001 From: jaimz22 Date: Sat, 8 Nov 2014 16:56:42 +0000 Subject: [PATCH 6/8] oops.. forgot to add a condition --- lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php | 2 +- lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php index a79f086ec..f3e4376f7 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php @@ -253,7 +253,7 @@ class ArrayHydrator extends AbstractHydrator $args = $newObject['args']; $obj = $class->newInstanceArgs($args); - if (count($args) == $scalarCount || ($scalarCount == 0 && count($rowData['newObjects']))) { + if (count($args) == $scalarCount || ($scalarCount == 0 && count($rowData['newObjects']) == 1)) { $result[$resultKey] = $obj; continue; diff --git a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php index f7b37b38f..c8607d703 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php @@ -553,7 +553,7 @@ class ObjectHydrator extends AbstractHydrator $args = $newObject['args']; $obj = $class->newInstanceArgs($args); - if (count($args) == $scalarCount || ($scalarCount == 0 && count($rowData['newObjects']))) { + if (count($args) == $scalarCount || ($scalarCount == 0 && count($rowData['newObjects']) == 1 )) { $result[$resultKey] = $obj; continue; From 2f76571d3a18a56fe8e21468a8dcd1e380fa84d1 Mon Sep 17 00:00:00 2001 From: James Murray Date: Fri, 19 Dec 2014 14:06:03 -0500 Subject: [PATCH 7/8] Added a fix for ObjectHydrator when the same number of scalar results and new object results exist Adding additional tests for mixed New object and scalar query --- .../ORM/Internal/Hydration/ObjectHydrator.php | 2 +- .../Tests/ORM/Functional/NewOperatorTest.php | 504 ++++++++++++++++++ 2 files changed, 505 insertions(+), 1 deletion(-) diff --git a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php index c8607d703..83534b1b4 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php @@ -553,7 +553,7 @@ class ObjectHydrator extends AbstractHydrator $args = $newObject['args']; $obj = $class->newInstanceArgs($args); - if (count($args) == $scalarCount || ($scalarCount == 0 && count($rowData['newObjects']) == 1 )) { + if ($scalarCount == 0 && count($rowData['newObjects']) == 1 ) { $result[$resultKey] = $obj; continue; diff --git a/tests/Doctrine/Tests/ORM/Functional/NewOperatorTest.php b/tests/Doctrine/Tests/ORM/Functional/NewOperatorTest.php index 63cc89bac..e8c0e300f 100644 --- a/tests/Doctrine/Tests/ORM/Functional/NewOperatorTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/NewOperatorTest.php @@ -138,6 +138,49 @@ class NewOperatorTest extends \Doctrine\Tests\OrmFunctionalTestCase $this->assertEquals($this->fixtures[2]->address->city, $result[2]->address); } + /** + * @dataProvider provideDataForHydrationMode + */ + public function testShouldIgnoreAliasesForSingleObject($hydrationMode) + { + $dql = " + SELECT + new Doctrine\Tests\Models\CMS\CmsUserDTO( + u.name, + e.email, + a.city + ) as cmsUser + FROM + Doctrine\Tests\Models\CMS\CmsUser u + JOIN + u.email e + JOIN + u.address a + ORDER BY + u.name"; + + $query = $this->_em->createQuery($dql); + $result = $query->getResult($hydrationMode); + + $this->assertCount(3, $result); + + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[0]); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[1]); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[2]); + + $this->assertEquals($this->fixtures[0]->name, $result[0]->name); + $this->assertEquals($this->fixtures[1]->name, $result[1]->name); + $this->assertEquals($this->fixtures[2]->name, $result[2]->name); + + $this->assertEquals($this->fixtures[0]->email->email, $result[0]->email); + $this->assertEquals($this->fixtures[1]->email->email, $result[1]->email); + $this->assertEquals($this->fixtures[2]->email->email, $result[2]->email); + + $this->assertEquals($this->fixtures[0]->address->city, $result[0]->address); + $this->assertEquals($this->fixtures[1]->address->city, $result[1]->address); + $this->assertEquals($this->fixtures[2]->address->city, $result[2]->address); + } + public function testShouldAssumeFromEntityNamespaceWhenNotGiven() { $dql = " @@ -540,6 +583,467 @@ class NewOperatorTest extends \Doctrine\Tests\OrmFunctionalTestCase $this->assertEquals($this->fixtures[2]->address->country, $result[2][1]->country); } + public function testShouldSupportMultipleNewOperatorsWithAliases() + { + $dql = " + SELECT + new CmsUserDTO( + u.name, + e.email + ) as cmsUser, + new CmsAddressDTO( + a.country, + a.city + ) as cmsAddress + FROM + Doctrine\Tests\Models\CMS\CmsUser u + JOIN + u.email e + JOIN + u.address a + ORDER BY + u.name"; + + $query = $this->_em->createQuery($dql); + $result = $query->getResult(); + + $this->assertCount(3, $result); + + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[0]['cmsUser']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[1]['cmsUser']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[2]['cmsUser']); + + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[0]['cmsAddress']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[1]['cmsAddress']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[2]['cmsAddress']); + + $this->assertEquals($this->fixtures[0]->name, $result[0]['cmsUser']->name); + $this->assertEquals($this->fixtures[1]->name, $result[1]['cmsUser']->name); + $this->assertEquals($this->fixtures[2]->name, $result[2]['cmsUser']->name); + + $this->assertEquals($this->fixtures[0]->email->email, $result[0]['cmsUser']->email); + $this->assertEquals($this->fixtures[1]->email->email, $result[1]['cmsUser']->email); + $this->assertEquals($this->fixtures[2]->email->email, $result[2]['cmsUser']->email); + + + $this->assertEquals($this->fixtures[0]->address->city, $result[0]['cmsAddress']->city); + $this->assertEquals($this->fixtures[1]->address->city, $result[1]['cmsAddress']->city); + $this->assertEquals($this->fixtures[2]->address->city, $result[2]['cmsAddress']->city); + + $this->assertEquals($this->fixtures[0]->address->country, $result[0]['cmsAddress']->country); + $this->assertEquals($this->fixtures[1]->address->country, $result[1]['cmsAddress']->country); + $this->assertEquals($this->fixtures[2]->address->country, $result[2]['cmsAddress']->country); + } + + public function testShouldSupportMultipleNewOperatorsWithAndWithoutAliases() + { + $dql = " + SELECT + new CmsUserDTO( + u.name, + e.email + ) as cmsUser, + new CmsAddressDTO( + a.country, + a.city + ) + FROM + Doctrine\Tests\Models\CMS\CmsUser u + JOIN + u.email e + JOIN + u.address a + ORDER BY + u.name"; + + $query = $this->_em->createQuery($dql); + $result = $query->getResult(); + + $this->assertCount(3, $result); + + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[0]['cmsUser']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[1]['cmsUser']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[2]['cmsUser']); + + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[0][0]); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[1][0]); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[2][0]); + + $this->assertEquals($this->fixtures[0]->name, $result[0]['cmsUser']->name); + $this->assertEquals($this->fixtures[1]->name, $result[1]['cmsUser']->name); + $this->assertEquals($this->fixtures[2]->name, $result[2]['cmsUser']->name); + + $this->assertEquals($this->fixtures[0]->email->email, $result[0]['cmsUser']->email); + $this->assertEquals($this->fixtures[1]->email->email, $result[1]['cmsUser']->email); + $this->assertEquals($this->fixtures[2]->email->email, $result[2]['cmsUser']->email); + + + $this->assertEquals($this->fixtures[0]->address->city, $result[0][0]->city); + $this->assertEquals($this->fixtures[1]->address->city, $result[1][0]->city); + $this->assertEquals($this->fixtures[2]->address->city, $result[2][0]->city); + + $this->assertEquals($this->fixtures[0]->address->country, $result[0][0]->country); + $this->assertEquals($this->fixtures[1]->address->country, $result[1][0]->country); + $this->assertEquals($this->fixtures[2]->address->country, $result[2][0]->country); + } + + public function testShouldSupportMultipleNewOperatorsAndSingleScalar() + { + $dql = " + SELECT + new CmsUserDTO( + u.name, + e.email + ), + new CmsAddressDTO( + a.country, + a.city + ), + u.status + FROM + Doctrine\Tests\Models\CMS\CmsUser u + JOIN + u.email e + JOIN + u.address a + ORDER BY + u.name"; + + $query = $this->_em->createQuery($dql); + $result = $query->getResult(); + + $this->assertCount(3, $result); + + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[0][0]); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[1][0]); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[2][0]); + + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[0][1]); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[1][1]); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[2][1]); + + $this->assertEquals($this->fixtures[0]->name, $result[0][0]->name); + $this->assertEquals($this->fixtures[1]->name, $result[1][0]->name); + $this->assertEquals($this->fixtures[2]->name, $result[2][0]->name); + + $this->assertEquals($this->fixtures[0]->email->email, $result[0][0]->email); + $this->assertEquals($this->fixtures[1]->email->email, $result[1][0]->email); + $this->assertEquals($this->fixtures[2]->email->email, $result[2][0]->email); + + + $this->assertEquals($this->fixtures[0]->address->city, $result[0][1]->city); + $this->assertEquals($this->fixtures[1]->address->city, $result[1][1]->city); + $this->assertEquals($this->fixtures[2]->address->city, $result[2][1]->city); + + $this->assertEquals($this->fixtures[0]->address->country, $result[0][1]->country); + $this->assertEquals($this->fixtures[1]->address->country, $result[1][1]->country); + $this->assertEquals($this->fixtures[2]->address->country, $result[2][1]->country); + + $this->assertEquals($this->fixtures[0]->status,$result[0]['status']); + $this->assertEquals($this->fixtures[1]->status,$result[1]['status']); + $this->assertEquals($this->fixtures[2]->status,$result[2]['status']); + } + + public function testShouldSupportMultipleNewOperatorsAndSingleScalarWithAliases() + { + $dql = " + SELECT + new CmsUserDTO( + u.name, + e.email + ) as cmsUser, + new CmsAddressDTO( + a.country, + a.city + ) as cmsAddress, + u.status as cmsUserStatus + FROM + Doctrine\Tests\Models\CMS\CmsUser u + JOIN + u.email e + JOIN + u.address a + ORDER BY + u.name"; + + $query = $this->_em->createQuery($dql); + $result = $query->getResult(); + + $this->assertCount(3, $result); + + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[0]['cmsUser']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[1]['cmsUser']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[2]['cmsUser']); + + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[0]['cmsAddress']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[1]['cmsAddress']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[2]['cmsAddress']); + + $this->assertEquals($this->fixtures[0]->name, $result[0]['cmsUser']->name); + $this->assertEquals($this->fixtures[1]->name, $result[1]['cmsUser']->name); + $this->assertEquals($this->fixtures[2]->name, $result[2]['cmsUser']->name); + + $this->assertEquals($this->fixtures[0]->email->email, $result[0]['cmsUser']->email); + $this->assertEquals($this->fixtures[1]->email->email, $result[1]['cmsUser']->email); + $this->assertEquals($this->fixtures[2]->email->email, $result[2]['cmsUser']->email); + + + $this->assertEquals($this->fixtures[0]->address->city, $result[0]['cmsAddress']->city); + $this->assertEquals($this->fixtures[1]->address->city, $result[1]['cmsAddress']->city); + $this->assertEquals($this->fixtures[2]->address->city, $result[2]['cmsAddress']->city); + + $this->assertEquals($this->fixtures[0]->address->country, $result[0]['cmsAddress']->country); + $this->assertEquals($this->fixtures[1]->address->country, $result[1]['cmsAddress']->country); + $this->assertEquals($this->fixtures[2]->address->country, $result[2]['cmsAddress']->country); + + $this->assertEquals($this->fixtures[0]->status,$result[0]['cmsUserStatus']); + $this->assertEquals($this->fixtures[1]->status,$result[1]['cmsUserStatus']); + $this->assertEquals($this->fixtures[2]->status,$result[2]['cmsUserStatus']); + } + + public function testShouldSupportMultipleNewOperatorsAndSingleScalarWithAndWithoutAliases() + { + $dql = " + SELECT + new CmsUserDTO( + u.name, + e.email + ) as cmsUser, + new CmsAddressDTO( + a.country, + a.city + ), + u.status + FROM + Doctrine\Tests\Models\CMS\CmsUser u + JOIN + u.email e + JOIN + u.address a + ORDER BY + u.name"; + + $query = $this->_em->createQuery($dql); + $result = $query->getResult(); + + $this->assertCount(3, $result); + + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[0]['cmsUser']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[1]['cmsUser']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[2]['cmsUser']); + + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[0][0]); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[1][0]); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[2][0]); + + $this->assertEquals($this->fixtures[0]->name, $result[0]['cmsUser']->name); + $this->assertEquals($this->fixtures[1]->name, $result[1]['cmsUser']->name); + $this->assertEquals($this->fixtures[2]->name, $result[2]['cmsUser']->name); + + $this->assertEquals($this->fixtures[0]->email->email, $result[0]['cmsUser']->email); + $this->assertEquals($this->fixtures[1]->email->email, $result[1]['cmsUser']->email); + $this->assertEquals($this->fixtures[2]->email->email, $result[2]['cmsUser']->email); + + + $this->assertEquals($this->fixtures[0]->address->city, $result[0][0]->city); + $this->assertEquals($this->fixtures[1]->address->city, $result[1][0]->city); + $this->assertEquals($this->fixtures[2]->address->city, $result[2][0]->city); + + $this->assertEquals($this->fixtures[0]->address->country, $result[0][0]->country); + $this->assertEquals($this->fixtures[1]->address->country, $result[1][0]->country); + $this->assertEquals($this->fixtures[2]->address->country, $result[2][0]->country); + + $this->assertEquals($this->fixtures[0]->status,$result[0]['status']); + $this->assertEquals($this->fixtures[1]->status,$result[1]['status']); + $this->assertEquals($this->fixtures[2]->status,$result[2]['status']); + } + + public function testShouldSupportMultipleNewOperatorsAndMultipleScalars() + { + $dql = " + SELECT + new CmsUserDTO( + u.name, + e.email + ), + new CmsAddressDTO( + a.country, + a.city + ), + u.status, + u.username + FROM + Doctrine\Tests\Models\CMS\CmsUser u + JOIN + u.email e + JOIN + u.address a + ORDER BY + u.name"; + + $query = $this->_em->createQuery($dql); + $result = $query->getResult(); + + $this->assertCount(3, $result); + + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[0][0]); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[1][0]); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[2][0]); + + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[0][1]); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[1][1]); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[2][1]); + + $this->assertEquals($this->fixtures[0]->name, $result[0][0]->name); + $this->assertEquals($this->fixtures[1]->name, $result[1][0]->name); + $this->assertEquals($this->fixtures[2]->name, $result[2][0]->name); + + $this->assertEquals($this->fixtures[0]->email->email, $result[0][0]->email); + $this->assertEquals($this->fixtures[1]->email->email, $result[1][0]->email); + $this->assertEquals($this->fixtures[2]->email->email, $result[2][0]->email); + + + $this->assertEquals($this->fixtures[0]->address->city, $result[0][1]->city); + $this->assertEquals($this->fixtures[1]->address->city, $result[1][1]->city); + $this->assertEquals($this->fixtures[2]->address->city, $result[2][1]->city); + + $this->assertEquals($this->fixtures[0]->address->country, $result[0][1]->country); + $this->assertEquals($this->fixtures[1]->address->country, $result[1][1]->country); + $this->assertEquals($this->fixtures[2]->address->country, $result[2][1]->country); + + $this->assertEquals($this->fixtures[0]->status,$result[0]['status']); + $this->assertEquals($this->fixtures[1]->status,$result[1]['status']); + $this->assertEquals($this->fixtures[2]->status,$result[2]['status']); + + $this->assertEquals($this->fixtures[0]->username,$result[0]['username']); + $this->assertEquals($this->fixtures[1]->username,$result[1]['username']); + $this->assertEquals($this->fixtures[2]->username,$result[2]['username']); + } + + public function testShouldSupportMultipleNewOperatorsAndMultipleScalarsWithAliases() + { + $dql = " + SELECT + new CmsUserDTO( + u.name, + e.email + ) as cmsUser, + new CmsAddressDTO( + a.country, + a.city + ) as cmsAddress, + u.status as cmsUserStatus, + u.username as cmsUserUsername + FROM + Doctrine\Tests\Models\CMS\CmsUser u + JOIN + u.email e + JOIN + u.address a + ORDER BY + u.name"; + + $query = $this->_em->createQuery($dql); + $result = $query->getResult(); + + $this->assertCount(3, $result); + + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[0]['cmsUser']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[1]['cmsUser']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[2]['cmsUser']); + + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[0]['cmsAddress']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[1]['cmsAddress']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[2]['cmsAddress']); + + $this->assertEquals($this->fixtures[0]->name, $result[0]['cmsUser']->name); + $this->assertEquals($this->fixtures[1]->name, $result[1]['cmsUser']->name); + $this->assertEquals($this->fixtures[2]->name, $result[2]['cmsUser']->name); + + $this->assertEquals($this->fixtures[0]->email->email, $result[0]['cmsUser']->email); + $this->assertEquals($this->fixtures[1]->email->email, $result[1]['cmsUser']->email); + $this->assertEquals($this->fixtures[2]->email->email, $result[2]['cmsUser']->email); + + + $this->assertEquals($this->fixtures[0]->address->city, $result[0]['cmsAddress']->city); + $this->assertEquals($this->fixtures[1]->address->city, $result[1]['cmsAddress']->city); + $this->assertEquals($this->fixtures[2]->address->city, $result[2]['cmsAddress']->city); + + $this->assertEquals($this->fixtures[0]->address->country, $result[0]['cmsAddress']->country); + $this->assertEquals($this->fixtures[1]->address->country, $result[1]['cmsAddress']->country); + $this->assertEquals($this->fixtures[2]->address->country, $result[2]['cmsAddress']->country); + + $this->assertEquals($this->fixtures[0]->status,$result[0]['cmsUserStatus']); + $this->assertEquals($this->fixtures[1]->status,$result[1]['cmsUserStatus']); + $this->assertEquals($this->fixtures[2]->status,$result[2]['cmsUserStatus']); + + $this->assertEquals($this->fixtures[0]->username,$result[0]['cmsUserUsername']); + $this->assertEquals($this->fixtures[1]->username,$result[1]['cmsUserUsername']); + $this->assertEquals($this->fixtures[2]->username,$result[2]['cmsUserUsername']); + } + + public function testShouldSupportMultipleNewOperatorsAndMultipleScalarsWithAndWithoutAliases() + { + $dql = " + SELECT + new CmsUserDTO( + u.name, + e.email + ) as cmsUser, + new CmsAddressDTO( + a.country, + a.city + ), + u.status, + u.username as cmsUserUsername + FROM + Doctrine\Tests\Models\CMS\CmsUser u + JOIN + u.email e + JOIN + u.address a + ORDER BY + u.name"; + + $query = $this->_em->createQuery($dql); + $result = $query->getResult(); + + $this->assertCount(3, $result); + + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[0]['cmsUser']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[1]['cmsUser']); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsUserDTO', $result[2]['cmsUser']); + + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[0][0]); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[1][0]); + $this->assertInstanceOf('Doctrine\Tests\Models\CMS\CmsAddressDTO', $result[2][0]); + + $this->assertEquals($this->fixtures[0]->name, $result[0]['cmsUser']->name); + $this->assertEquals($this->fixtures[1]->name, $result[1]['cmsUser']->name); + $this->assertEquals($this->fixtures[2]->name, $result[2]['cmsUser']->name); + + $this->assertEquals($this->fixtures[0]->email->email, $result[0]['cmsUser']->email); + $this->assertEquals($this->fixtures[1]->email->email, $result[1]['cmsUser']->email); + $this->assertEquals($this->fixtures[2]->email->email, $result[2]['cmsUser']->email); + + + $this->assertEquals($this->fixtures[0]->address->city, $result[0][0]->city); + $this->assertEquals($this->fixtures[1]->address->city, $result[1][0]->city); + $this->assertEquals($this->fixtures[2]->address->city, $result[2][0]->city); + + $this->assertEquals($this->fixtures[0]->address->country, $result[0][0]->country); + $this->assertEquals($this->fixtures[1]->address->country, $result[1][0]->country); + $this->assertEquals($this->fixtures[2]->address->country, $result[2][0]->country); + + $this->assertEquals($this->fixtures[0]->status,$result[0]['status']); + $this->assertEquals($this->fixtures[1]->status,$result[1]['status']); + $this->assertEquals($this->fixtures[2]->status,$result[2]['status']); + + $this->assertEquals($this->fixtures[0]->username,$result[0]['cmsUserUsername']); + $this->assertEquals($this->fixtures[1]->username,$result[1]['cmsUserUsername']); + $this->assertEquals($this->fixtures[2]->username,$result[2]['cmsUserUsername']); + } + /** * @expectedException Doctrine\ORM\Query\QueryException * @expectedExceptionMessage [Semantical Error] line 0, col 11 near '\InvalidClass(u.name)': Error: Class "\InvalidClass" is not defined. From d9cbe1a8b717ee09dcd60a9c5e6183918bff344b Mon Sep 17 00:00:00 2001 From: James Murray Date: Fri, 19 Dec 2014 14:10:47 -0500 Subject: [PATCH 8/8] removed unnecessary fieldIdentificationVariable property check --- lib/Doctrine/ORM/Query/SqlWalker.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/Doctrine/ORM/Query/SqlWalker.php b/lib/Doctrine/ORM/Query/SqlWalker.php index 16d9e1081..486d4af62 100644 --- a/lib/Doctrine/ORM/Query/SqlWalker.php +++ b/lib/Doctrine/ORM/Query/SqlWalker.php @@ -1353,8 +1353,7 @@ class SqlWalker implements TreeWalker break; case ($expr instanceof AST\NewObjectExpression): - $resultAlias = $selectExpression->fieldIdentificationVariable ?: null; - $sql .= $this->walkNewObject($expr,$resultAlias); + $sql .= $this->walkNewObject($expr,$selectExpression->fieldIdentificationVariable); break; default: