From 36dc56053381cc9d5fe5d3add3615a359f760588 Mon Sep 17 00:00:00 2001 From: "Fabio B. Silva" Date: Thu, 15 Mar 2012 21:29:07 -0300 Subject: [PATCH 1/2] Fix DDC-1470 --- .../Internal/Hydration/HydrationException.php | 26 ++++++++ .../ORM/Internal/Hydration/ObjectHydrator.php | 9 +++ .../Hydration/SimpleObjectHydrator.php | 4 ++ .../ORM/Hydration/ObjectHydratorTest.php | 65 +++++++++++++++++++ .../Hydration/SimpleObjectHydratorTest.php | 37 +++++++++++ 5 files changed, 141 insertions(+) create mode 100644 tests/Doctrine/Tests/ORM/Hydration/SimpleObjectHydratorTest.php diff --git a/lib/Doctrine/ORM/Internal/Hydration/HydrationException.php b/lib/Doctrine/ORM/Internal/Hydration/HydrationException.php index 147f6acae..dbb20cb80 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/HydrationException.php +++ b/lib/Doctrine/ORM/Internal/Hydration/HydrationException.php @@ -23,4 +23,30 @@ class HydrationException extends \Doctrine\ORM\ORMException "discriminator value in a table row." ); } + + /** + * @since 2.3 + * @param string $entityName + * @param string $discrColumnName + * @param string $dqlAlias + * @return HydrationException + */ + public static function missingDiscriminatorColumn($entityName, $discrColumnName, $dqlAlias) + { + return new self("The discriminator column '$discrColumnName' " + . "is missing for '$entityName' using the DQL alias '$dqlAlias'."); + } + + /** + * @since 2.3 + * @param string $entityName + * @param string $discrColumnName + * @param string $dqlAlias + * @return HydrationException + */ + public static function missingDiscriminatorMetaMappingColumn($entityName, $discrColumnName, $dqlAlias) + { + return new self("The meta mapping for the discriminator column '$discrColumnName' " + . "is missing for '$entityName' using the DQL alias '$dqlAlias'."); + } } \ No newline at end of file diff --git a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php index 1453aab3e..d82a181c3 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php @@ -217,8 +217,17 @@ class ObjectHydrator extends AbstractHydrator $className = $this->_rsm->aliasMap[$dqlAlias]; if (isset($this->_rsm->discriminatorColumns[$dqlAlias])) { + + if (!isset($this->_rsm->metaMappings[$this->_rsm->discriminatorColumns[$dqlAlias]])) { + throw HydrationException::missingDiscriminatorMetaMappingColumn($className, $this->_rsm->discriminatorColumns[$dqlAlias], $dqlAlias); + } + $discrColumn = $this->_rsm->metaMappings[$this->_rsm->discriminatorColumns[$dqlAlias]]; + if (!isset($data[$discrColumn])) { + throw HydrationException::missingDiscriminatorColumn($className, $discrColumn, $dqlAlias); + } + if ($data[$discrColumn] === "") { throw HydrationException::emptyDiscriminatorValue($dqlAlias); } diff --git a/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php index 09c2c7f3d..371081ccf 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php @@ -92,6 +92,10 @@ class SimpleObjectHydrator extends AbstractHydrator if ($this->class->inheritanceType !== ClassMetadata::INHERITANCE_TYPE_NONE) { $discrColumnName = $this->_platform->getSQLResultCasing($this->class->discriminatorColumn['name']); + if (!isset($sqlResult[$discrColumnName])) { + throw HydrationException::missingDiscriminatorColumn($entityName, $discrColumnName, key($this->_rsm->aliasMap)); + } + if ($sqlResult[$discrColumnName] === '') { throw HydrationException::emptyDiscriminatorValue(key($this->_rsm->aliasMap)); } diff --git a/tests/Doctrine/Tests/ORM/Hydration/ObjectHydratorTest.php b/tests/Doctrine/Tests/ORM/Hydration/ObjectHydratorTest.php index b6bc7cd38..cb0dd1f17 100644 --- a/tests/Doctrine/Tests/ORM/Hydration/ObjectHydratorTest.php +++ b/tests/Doctrine/Tests/ORM/Hydration/ObjectHydratorTest.php @@ -1863,4 +1863,69 @@ class ObjectHydratorTest extends HydrationTestCase $result ); } + + + /** + * @group DDC-1470 + * + * @expectedException \Doctrine\ORM\Internal\Hydration\HydrationException + * @expectedExceptionMessage The meta mapping for the discriminator column 'c_discr' is missing for 'Doctrine\Tests\Models\Company\CompanyFixContract' using the DQL alias 'c'. + */ + public function testMissingMetaMappingException() + { + $rsm = new ResultSetMapping; + + $rsm->addEntityResult('Doctrine\Tests\Models\Company\CompanyFixContract', 'c'); + $rsm->addJoinedEntityResult('Doctrine\Tests\Models\Company\CompanyEmployee', 'e', 'c', 'salesPerson'); + + $rsm->addFieldResult('c', 'c__id', 'id'); + $rsm->setDiscriminatorColumn('c', 'c_discr'); + + $resultSet = array( + array( + 'c__id' => '1', + 'c_discr' => 'fix', + ), + ); + + $stmt = new HydratorMockStatement($resultSet); + $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em); + $hydrator->hydrateAll($stmt, $rsm); + } + + /** + * @group DDC-1470 + * + * @expectedException \Doctrine\ORM\Internal\Hydration\HydrationException + * @expectedExceptionMessage The discriminator column 'discr' is missing for 'Doctrine\Tests\Models\Company\CompanyEmployee' using the DQL alias 'e'. + */ + public function testMissingDiscriminatorColumnException() + { + $rsm = new ResultSetMapping; + + $rsm->addEntityResult('Doctrine\Tests\Models\Company\CompanyFixContract', 'c'); + $rsm->addJoinedEntityResult('Doctrine\Tests\Models\Company\CompanyEmployee', 'e', 'c', 'salesPerson'); + + $rsm->addFieldResult('c', 'c__id', 'id'); + $rsm->addMetaResult('c', 'c_discr', 'discr'); + $rsm->setDiscriminatorColumn('c', 'c_discr'); + + $rsm->addFieldResult('e', 'e__id', 'id'); + $rsm->addFieldResult('e', 'e__name', 'name'); + $rsm->addMetaResult('e ', 'e_discr', 'discr'); + $rsm->setDiscriminatorColumn('e', 'e_discr'); + + $resultSet = array( + array( + 'c__id' => '1', + 'c_discr' => 'fix', + 'e__id' => '1', + 'e__name' => 'Fabio B. Silva' + ), + ); + + $stmt = new HydratorMockStatement($resultSet); + $hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em); + $hydrator->hydrateAll($stmt, $rsm); + } } diff --git a/tests/Doctrine/Tests/ORM/Hydration/SimpleObjectHydratorTest.php b/tests/Doctrine/Tests/ORM/Hydration/SimpleObjectHydratorTest.php new file mode 100644 index 000000000..5e718c58c --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Hydration/SimpleObjectHydratorTest.php @@ -0,0 +1,37 @@ +addEntityResult('Doctrine\Tests\Models\Company\CompanyPerson', 'p'); + $rsm->addFieldResult('p', 'p__id', 'id'); + $rsm->addFieldResult('p', 'p__name', 'name'); + $rsm->addMetaResult('p ', 'discr', 'discr'); + $rsm->setDiscriminatorColumn('p', 'discr'); + $resultSet = array( + array( + 'u__id' => '1', + 'u__name' => 'Fabio B. Silva' + ), + ); + + $stmt = new HydratorMockStatement($resultSet); + $hydrator = new \Doctrine\ORM\Internal\Hydration\SimpleObjectHydrator($this->_em); + $hydrator->hydrateAll($stmt, $rsm); + } +} From 9cee329407864daa02e62402d54680672055c157 Mon Sep 17 00:00:00 2001 From: "Fabio B. Silva" Date: Thu, 15 Mar 2012 22:38:54 -0300 Subject: [PATCH 2/2] Fix CS --- .../ORM/Internal/Hydration/HydrationException.php | 12 ++++++++---- .../ORM/Internal/Hydration/ObjectHydrator.php | 6 +++--- .../ORM/Internal/Hydration/SimpleObjectHydrator.php | 2 +- .../Tests/ORM/Hydration/ObjectHydratorTest.php | 4 ++-- .../Tests/ORM/Hydration/SimpleObjectHydratorTest.php | 2 +- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/lib/Doctrine/ORM/Internal/Hydration/HydrationException.php b/lib/Doctrine/ORM/Internal/Hydration/HydrationException.php index dbb20cb80..2acc33225 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/HydrationException.php +++ b/lib/Doctrine/ORM/Internal/Hydration/HydrationException.php @@ -33,8 +33,10 @@ class HydrationException extends \Doctrine\ORM\ORMException */ public static function missingDiscriminatorColumn($entityName, $discrColumnName, $dqlAlias) { - return new self("The discriminator column '$discrColumnName' " - . "is missing for '$entityName' using the DQL alias '$dqlAlias'."); + return new self(sprintf( + 'The discriminator column "%s" is missing for "%s" using the DQL alias "%s".', + $discrColumnName, $entityName, $dqlAlias + )); } /** @@ -46,7 +48,9 @@ class HydrationException extends \Doctrine\ORM\ORMException */ public static function missingDiscriminatorMetaMappingColumn($entityName, $discrColumnName, $dqlAlias) { - return new self("The meta mapping for the discriminator column '$discrColumnName' " - . "is missing for '$entityName' using the DQL alias '$dqlAlias'."); + return new self(sprintf( + 'The meta mapping for the discriminator column "%s" is missing for "%s" using the DQL alias "%s".', + $discrColumnName, $entityName, $dqlAlias + )); } } \ No newline at end of file diff --git a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php index d82a181c3..52de2c159 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php @@ -218,13 +218,13 @@ class ObjectHydrator extends AbstractHydrator if (isset($this->_rsm->discriminatorColumns[$dqlAlias])) { - if (!isset($this->_rsm->metaMappings[$this->_rsm->discriminatorColumns[$dqlAlias]])) { + if ( ! isset($this->_rsm->metaMappings[$this->_rsm->discriminatorColumns[$dqlAlias]])) { throw HydrationException::missingDiscriminatorMetaMappingColumn($className, $this->_rsm->discriminatorColumns[$dqlAlias], $dqlAlias); } $discrColumn = $this->_rsm->metaMappings[$this->_rsm->discriminatorColumns[$dqlAlias]]; - if (!isset($data[$discrColumn])) { + if ( ! isset($data[$discrColumn])) { throw HydrationException::missingDiscriminatorColumn($className, $discrColumn, $dqlAlias); } @@ -339,7 +339,7 @@ class ObjectHydrator extends AbstractHydrator $path = $parentAlias . '.' . $dqlAlias; // We have a RIGHT JOIN result here. Doctrine cannot hydrate RIGHT JOIN Object-Graphs - if (!isset($nonemptyComponents[$parentAlias])) { + if ( ! isset($nonemptyComponents[$parentAlias])) { // TODO: Add special case code where we hydrate the right join objects into identity map at least continue; } diff --git a/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php index 371081ccf..4dc558441 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php @@ -92,7 +92,7 @@ class SimpleObjectHydrator extends AbstractHydrator if ($this->class->inheritanceType !== ClassMetadata::INHERITANCE_TYPE_NONE) { $discrColumnName = $this->_platform->getSQLResultCasing($this->class->discriminatorColumn['name']); - if (!isset($sqlResult[$discrColumnName])) { + if ( ! isset($sqlResult[$discrColumnName])) { throw HydrationException::missingDiscriminatorColumn($entityName, $discrColumnName, key($this->_rsm->aliasMap)); } diff --git a/tests/Doctrine/Tests/ORM/Hydration/ObjectHydratorTest.php b/tests/Doctrine/Tests/ORM/Hydration/ObjectHydratorTest.php index cb0dd1f17..33636b4ec 100644 --- a/tests/Doctrine/Tests/ORM/Hydration/ObjectHydratorTest.php +++ b/tests/Doctrine/Tests/ORM/Hydration/ObjectHydratorTest.php @@ -1869,7 +1869,7 @@ class ObjectHydratorTest extends HydrationTestCase * @group DDC-1470 * * @expectedException \Doctrine\ORM\Internal\Hydration\HydrationException - * @expectedExceptionMessage The meta mapping for the discriminator column 'c_discr' is missing for 'Doctrine\Tests\Models\Company\CompanyFixContract' using the DQL alias 'c'. + * @expectedExceptionMessage The meta mapping for the discriminator column "c_discr" is missing for "Doctrine\Tests\Models\Company\CompanyFixContract" using the DQL alias "c". */ public function testMissingMetaMappingException() { @@ -1897,7 +1897,7 @@ class ObjectHydratorTest extends HydrationTestCase * @group DDC-1470 * * @expectedException \Doctrine\ORM\Internal\Hydration\HydrationException - * @expectedExceptionMessage The discriminator column 'discr' is missing for 'Doctrine\Tests\Models\Company\CompanyEmployee' using the DQL alias 'e'. + * @expectedExceptionMessage The discriminator column "discr" is missing for "Doctrine\Tests\Models\Company\CompanyEmployee" using the DQL alias "e". */ public function testMissingDiscriminatorColumnException() { diff --git a/tests/Doctrine/Tests/ORM/Hydration/SimpleObjectHydratorTest.php b/tests/Doctrine/Tests/ORM/Hydration/SimpleObjectHydratorTest.php index 5e718c58c..80f90e7ff 100644 --- a/tests/Doctrine/Tests/ORM/Hydration/SimpleObjectHydratorTest.php +++ b/tests/Doctrine/Tests/ORM/Hydration/SimpleObjectHydratorTest.php @@ -13,7 +13,7 @@ class SimpleObjectHydratorTest extends HydrationTestCase * @group DDC-1470 * * @expectedException \Doctrine\ORM\Internal\Hydration\HydrationException - * @expectedExceptionMessage The discriminator column 'discr' is missing for 'Doctrine\Tests\Models\Company\CompanyPerson' using the DQL alias 'p'. + * @expectedExceptionMessage The discriminator column "discr" is missing for "Doctrine\Tests\Models\Company\CompanyPerson" using the DQL alias "p". */ public function testMissingDiscriminatorColumnException() {