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] [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(); } }