From 23e0bb73458e50abe668ee55b49a787ad1ca0ae1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szczepan=20Cie=C5=9Blik?= Date: Thu, 24 Jan 2013 15:50:05 +0100 Subject: [PATCH 1/5] Fixed ObjectHydrator when namespace alias is given. --- .../ORM/Internal/Hydration/ObjectHydrator.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php index bc28aa072..583235055 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php @@ -83,7 +83,7 @@ class ObjectHydrator extends AbstractHydrator */ private $existingCollections = array(); - /** + /** * {@inheritdoc} */ protected function prepare() @@ -102,6 +102,12 @@ class ObjectHydrator extends AbstractHydrator $this->identifierMap[$dqlAlias] = array(); $this->idTemplate[$dqlAlias] = ''; + // Check for namespace alias. + if (strpos($className, ':') !== false) { + $metadata = $this->_em->getClassMetadata($className); + $className = $metadata->name; + } + if ( ! isset($this->ce[$className])) { $this->ce[$className] = $this->_em->getClassMetadata($className); } @@ -525,7 +531,7 @@ class ObjectHydrator extends AbstractHydrator // check for existing result from the iterations before if ( ! isset($this->identifierMap[$dqlAlias][$id[$dqlAlias]])) { $element = $this->getEntity($rowData[$dqlAlias], $dqlAlias); - + if ($this->_rsm->isMixed) { $element = array($entityKey => $element); } @@ -597,7 +603,7 @@ class ObjectHydrator extends AbstractHydrator if ($count === 1) { $result[$resultKey] = $obj; - + continue; } From 1949ff86023657e3146982ce32c75a09a30a1710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szczepan=20Cie=C5=9Blik?= Date: Thu, 24 Jan 2013 23:10:50 +0100 Subject: [PATCH 2/5] [DDC-2256] Added test for hydrator. --- .../ORM/Functional/Ticket/DDC2256Test.php | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2256Test.php diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2256Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2256Test.php new file mode 100644 index 000000000..cbdc6341f --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2256Test.php @@ -0,0 +1,105 @@ +_schemaTool->createSchema(array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2256User'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2256Group') + )); + } + + public function testIssue() + { + $config = $this->_em->getConfiguration(); + $config->addEntityNamespace('MyNamespace', 'Doctrine\Tests\ORM\Functional\Ticket'); + + $user = new DDC2256User(); + $user->name = 'user'; + $group = new DDC2256Group(); + $group->name = 'group'; + $user->group = $group; + + $this->_em->persist($user); + $this->_em->persist($group); + $this->_em->flush(); + + $rsm = new ResultSetMapping(); + + $rsm->addEntityResult('MyNamespace:DDC2256Group', 'g'); + $rsm->addFieldResult('g', 'id', 'id'); + $rsm->addFieldResult('g', 'name', 'name'); + + $rsm->addJoinedEntityResult('MyNamespace:DDC2256User', 'u', 'g', 'users'); + $rsm->addFieldResult('u', 'user_id', 'id'); + $rsm->addFieldResult('u', 'user_name', 'name'); + + $this->_em->createNativeQuery('SELECT g.id, g.name, u.id as user_id, u.name as user_name FROM ddc2256_groups g LEFT JOIN ddc2256_users u ON u.group_id = g.id', $rsm)->getResult(); + } +} + +/** + * @Entity + * @Table(name="ddc2256_users") + */ +class DDC2256User +{ + /** + * @Id + * @Column(type="integer") + * @GeneratedValue(strategy="AUTO") + */ + public $id; + + /** + * @Column(type="string") + */ + public $name; + + /** + * @ManyToOne(targetEntity="DDC2256Group", inversedBy="users")A + * @JoinColumn(name="group_id") + */ + public $group; +} + +/** + * @Entity + * @Table(name="ddc2256_groups") + */ +class DDC2256Group +{ + /** + * @Id + * @Column(type="integer") + * @GeneratedValue(strategy="AUTO") + */ + public $id; + + /** + * @Column(type="string") + */ + public $name; + + /** + * @OneToMany(targetEntity="DDC2256User", mappedBy="group") + */ + public $users; + + public function __construct() + { + $this->users = new \Doctrine\Common\Collections\ArrayCollection(); + } +} + From d7f82221d163a86e079bdd1c183d042c9096daa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szczepan=20Cie=C5=9Blik?= Date: Fri, 25 Jan 2013 12:06:13 +0100 Subject: [PATCH 3/5] [DDC-2256] Moved aliases translation to ResultSetMapping, fixed tests. --- lib/Doctrine/ORM/AbstractQuery.php | 1 + .../ORM/Internal/Hydration/ObjectHydrator.php | 6 ---- lib/Doctrine/ORM/Query/ResultSetMapping.php | 31 +++++++++++++++++++ .../ORM/Functional/Ticket/DDC2256Test.php | 26 +++++++++++----- 4 files changed, 51 insertions(+), 13 deletions(-) diff --git a/lib/Doctrine/ORM/AbstractQuery.php b/lib/Doctrine/ORM/AbstractQuery.php index 0f0078a7e..6dda4d2f8 100644 --- a/lib/Doctrine/ORM/AbstractQuery.php +++ b/lib/Doctrine/ORM/AbstractQuery.php @@ -296,6 +296,7 @@ abstract class AbstractQuery */ public function setResultSetMapping(Query\ResultSetMapping $rsm) { + $rsm->translateNamespaces($this->_em); $this->_resultSetMapping = $rsm; return $this; diff --git a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php index 583235055..04d741cbb 100644 --- a/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php +++ b/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php @@ -102,12 +102,6 @@ class ObjectHydrator extends AbstractHydrator $this->identifierMap[$dqlAlias] = array(); $this->idTemplate[$dqlAlias] = ''; - // Check for namespace alias. - if (strpos($className, ':') !== false) { - $metadata = $this->_em->getClassMetadata($className); - $className = $metadata->name; - } - if ( ! isset($this->ce[$className])) { $this->ce[$className] = $this->_em->getClassMetadata($className); } diff --git a/lib/Doctrine/ORM/Query/ResultSetMapping.php b/lib/Doctrine/ORM/Query/ResultSetMapping.php index 9dbe9bc63..6e620180a 100644 --- a/lib/Doctrine/ORM/Query/ResultSetMapping.php +++ b/lib/Doctrine/ORM/Query/ResultSetMapping.php @@ -19,6 +19,8 @@ namespace Doctrine\ORM\Query; +use Doctrine\ORM\EntityManager; + /** * A ResultSetMapping describes how a result set of an SQL query maps to a Doctrine result. * @@ -543,4 +545,33 @@ class ResultSetMapping return $this; } + + /** + * Allows to translate entity namespaces to full qualified names. + * + * @param EntityManager $em + * + * @return void + */ + public function translateNamespaces(EntityManager $em) + { + $fqcn = array(); + + $translate = function (&$alias) use ($em, $fqcn) + { + if (strpos($alias, ':') !== false && !isset($fqcn[$alias])) { + if ($metadata = $em->getClassMetadata($alias)) { + $fqcn[$alias] = $metadata->name; + } + } + + if (isset($fqcn[$alias])) { + $alias = $fqcn[$alias]; + } + }; + + array_walk($this->aliasMap, $translate); + array_walk($this->declaringClasses, $translate); + } } + diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2256Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2256Test.php index cbdc6341f..f2c6c8da3 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2256Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2256Test.php @@ -5,6 +5,7 @@ namespace Doctrine\Tests\ORM\Functional\Ticket; require_once __DIR__ . '/../../../TestInit.php'; use Doctrine\ORM\Query\ResultSetMapping; +use Doctrine\ORM\Query\ResultSetMappingBuilder; /** * @group DDC-2256 @@ -34,18 +35,29 @@ class DDC2256Test extends \Doctrine\Tests\OrmFunctionalTestCase $this->_em->persist($user); $this->_em->persist($group); $this->_em->flush(); + $this->_em->clear(); + $sql = 'SELECT u.id, u.name, g.id as group_id, g.name as group_name FROM ddc2256_users u LEFT JOIN ddc2256_groups g ON u.group_id = g.id'; + + // Test ResultSetMapping. $rsm = new ResultSetMapping(); - $rsm->addEntityResult('MyNamespace:DDC2256Group', 'g'); - $rsm->addFieldResult('g', 'id', 'id'); - $rsm->addFieldResult('g', 'name', 'name'); + $rsm->addEntityResult('MyNamespace:DDC2256User', 'u'); + $rsm->addFieldResult('u', 'id', 'id'); + $rsm->addFieldResult('u', 'name', 'name'); - $rsm->addJoinedEntityResult('MyNamespace:DDC2256User', 'u', 'g', 'users'); - $rsm->addFieldResult('u', 'user_id', 'id'); - $rsm->addFieldResult('u', 'user_name', 'name'); + $rsm->addJoinedEntityResult('MyNamespace:DDC2256Group', 'g', 'u', 'group'); + $rsm->addFieldResult('g', 'group_id', 'id'); + $rsm->addFieldResult('g', 'group_name', 'name'); - $this->_em->createNativeQuery('SELECT g.id, g.name, u.id as user_id, u.name as user_name FROM ddc2256_groups g LEFT JOIN ddc2256_users u ON u.group_id = g.id', $rsm)->getResult(); + $this->_em->createNativeQuery($sql, $rsm)->getResult(); + + // Test ResultSetMappingBuilder. + $rsm = new ResultSetMappingBuilder($this->_em); + $rsm->addRootEntityFromClassMetadata('MyNamespace:DDC2256User', 'u'); + $rsm->addJoinedEntityFromClassMetadata('MyNamespace:DDC2256Group', 'g', 'u', 'group', array('id' => 'group_id', 'name' => 'group_name')); + + $this->_em->createNativeQuery($sql, $rsm)->getResult(); } } From 935594578a4c06b4593fb553b63e5199288639e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szczepan=20Cie=C5=9Blik?= Date: Fri, 25 Jan 2013 13:15:14 +0100 Subject: [PATCH 4/5] [DDC-2256] Code refactorization. --- lib/Doctrine/ORM/Query/ResultSetMapping.php | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/lib/Doctrine/ORM/Query/ResultSetMapping.php b/lib/Doctrine/ORM/Query/ResultSetMapping.php index 6e620180a..fb9215383 100644 --- a/lib/Doctrine/ORM/Query/ResultSetMapping.php +++ b/lib/Doctrine/ORM/Query/ResultSetMapping.php @@ -559,15 +559,10 @@ class ResultSetMapping $translate = function (&$alias) use ($em, $fqcn) { - if (strpos($alias, ':') !== false && !isset($fqcn[$alias])) { - if ($metadata = $em->getClassMetadata($alias)) { - $fqcn[$alias] = $metadata->name; - } - } - - if (isset($fqcn[$alias])) { - $alias = $fqcn[$alias]; + if ( ! isset($fqcn[$alias])) { + $fqcn[$alias] = $em->getClassMetadata($alias)->getName(); } + $alias = $fqcn[$alias]; }; array_walk($this->aliasMap, $translate); From 92ada246b506ada38d2dc4be26b86d25c0bf15e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szczepan=20Cie=C5=9Blik?= Date: Sat, 26 Jan 2013 09:09:21 +0100 Subject: [PATCH 5/5] [DDC-2256] Code improvements. --- lib/Doctrine/ORM/Query/ResultSetMapping.php | 3 +-- tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2256Test.php | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/Doctrine/ORM/Query/ResultSetMapping.php b/lib/Doctrine/ORM/Query/ResultSetMapping.php index fb9215383..1461f4f4c 100644 --- a/lib/Doctrine/ORM/Query/ResultSetMapping.php +++ b/lib/Doctrine/ORM/Query/ResultSetMapping.php @@ -557,8 +557,7 @@ class ResultSetMapping { $fqcn = array(); - $translate = function (&$alias) use ($em, $fqcn) - { + $translate = function (&$alias) use ($em, &$fqcn) { if ( ! isset($fqcn[$alias])) { $fqcn[$alias] = $em->getClassMetadata($alias)->getName(); } diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2256Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2256Test.php index f2c6c8da3..949091f77 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2256Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2256Test.php @@ -2,8 +2,6 @@ namespace Doctrine\Tests\ORM\Functional\Ticket; -require_once __DIR__ . '/../../../TestInit.php'; - use Doctrine\ORM\Query\ResultSetMapping; use Doctrine\ORM\Query\ResultSetMappingBuilder;