From 7a73d27600c178f75a3dd64d67c3bcc867c7aa34 Mon Sep 17 00:00:00 2001 From: mmoreram Date: Tue, 9 Sep 2014 17:13:34 +0200 Subject: [PATCH 01/17] Added resolve entities support in discrim. map --- .../ORM/Mapping/ClassMetadataInfo.php | 2 +- .../Tools/ResolveDiscriminatorMapListener.php | 87 +++++++++++++++++++ 2 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php index 67567456c..b88261a4d 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php @@ -2748,7 +2748,7 @@ class ClassMetadataInfo implements ClassMetadata if ($this->name == $className) { $this->discriminatorValue = $name; } else { - if ( ! class_exists($className)) { + if ( ! class_exists($className) && ! interface_exists($className)) { throw MappingException::invalidClassInDiscriminatorMap($className, $this->name); } if (is_subclass_of($className, $this->name) && ! in_array($className, $this->subClasses)) { diff --git a/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php b/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php new file mode 100644 index 000000000..5dc16b768 --- /dev/null +++ b/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php @@ -0,0 +1,87 @@ +. + */ + +namespace Doctrine\ORM\Tools; + +use Doctrine\ORM\Event\LoadClassMetadataEventArgs; +use Doctrine\ORM\Mapping\ClassMetadataInfo; + +/** + * ResolveDiscriminatorMapListener + * + * Mechanism to overwrite interfaces or classes specified in discrimination map + * + * @author Benjamin Eberlei + * @since 2.2 + */ +class ResolveDiscriminatorMapListener +{ + /** + * @var array + */ + private $resolveTargetEntities = array(); + + /** + * Adds a target-entity class name to resolve to a new class name. + * + * @param string $originalEntity + * @param string $newEntity + * @param array $mapping + * + * @return void + */ + public function addResolveTargetEntity($originalEntity, $newEntity, array $mapping) + { + $mapping['targetEntity'] = ltrim($newEntity, "\\"); + $this->resolveTargetEntities[ltrim($originalEntity, "\\")] = $mapping; + } + + /** + * Processes event and resolves new target entity names. + * + * @param LoadClassMetadataEventArgs $args + * + * @return void + */ + public function loadClassMetadata(LoadClassMetadataEventArgs $args) + { + $classMetadata = $args->getClassMetadata(); + + if (!empty($classMetadata->discriminatorMap)) { + + $this->remapDiscriminatorMap($classMetadata); + } + } + + /** + * Replaces all Interfaces in discriminator map + * + * @param \Doctrine\ORM\Mapping\ClassMetadataInfo $classMetadata + */ + private function remapDiscriminatorMap(ClassMetadataInfo $classMetadata) + { + foreach ($classMetadata->discriminatorMap as $name => $interface) { + + if (isset($this->resolveTargetEntities[$interface])) { + + $classMetadata->discriminatorMap[$name] = $this->resolveTargetEntities[$interface]['targetEntity']; + } + } + } +} From 2a6c84495343697dbdc64d62f14973666777d76c Mon Sep 17 00:00:00 2001 From: mmoreram Date: Tue, 9 Sep 2014 18:22:19 +0200 Subject: [PATCH 02/17] Using constructor to define environment --- .../ORM/Tools/ResolveDiscriminatorMapListener.php | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php b/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php index 5dc16b768..c4dcfe7ee 100644 --- a/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php +++ b/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php @@ -28,7 +28,7 @@ use Doctrine\ORM\Mapping\ClassMetadataInfo; * Mechanism to overwrite interfaces or classes specified in discrimination map * * @author Benjamin Eberlei - * @since 2.2 + * @since 2.2 */ class ResolveDiscriminatorMapListener { @@ -38,18 +38,15 @@ class ResolveDiscriminatorMapListener private $resolveTargetEntities = array(); /** - * Adds a target-entity class name to resolve to a new class name. + * Construct * * @param string $originalEntity * @param string $newEntity * @param array $mapping - * - * @return void */ - public function addResolveTargetEntity($originalEntity, $newEntity, array $mapping) + public function __construct($originalEntity, $newEntity, array $mapping) { - $mapping['targetEntity'] = ltrim($newEntity, "\\"); - $this->resolveTargetEntities[ltrim($originalEntity, "\\")] = $mapping; + $this->resolveTargetEntities[ltrim($originalEntity, "\\")] = ltrim($newEntity, "\\"); } /** @@ -80,7 +77,7 @@ class ResolveDiscriminatorMapListener if (isset($this->resolveTargetEntities[$interface])) { - $classMetadata->discriminatorMap[$name] = $this->resolveTargetEntities[$interface]['targetEntity']; + $classMetadata->discriminatorMap[$name] = $this->resolveTargetEntities[$interface]; } } } From fa45c0834d8deb6ba9a92b2eac9a74bb84ae2169 Mon Sep 17 00:00:00 2001 From: mmoreram Date: Tue, 9 Sep 2014 18:24:21 +0200 Subject: [PATCH 03/17] Removed unused construct param --- lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php b/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php index c4dcfe7ee..9b86a4604 100644 --- a/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php +++ b/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php @@ -42,9 +42,8 @@ class ResolveDiscriminatorMapListener * * @param string $originalEntity * @param string $newEntity - * @param array $mapping */ - public function __construct($originalEntity, $newEntity, array $mapping) + public function __construct($originalEntity, $newEntity) { $this->resolveTargetEntities[ltrim($originalEntity, "\\")] = ltrim($newEntity, "\\"); } From 93b6eeca54c15fbc433be956918444cfe9f1eb1b Mon Sep 17 00:00:00 2001 From: mmoreram Date: Tue, 9 Sep 2014 18:46:34 +0200 Subject: [PATCH 04/17] Full resolveTargetEntities as constructor argument --- lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php b/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php index 9b86a4604..35cc84a17 100644 --- a/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php +++ b/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php @@ -40,12 +40,11 @@ class ResolveDiscriminatorMapListener /** * Construct * - * @param string $originalEntity - * @param string $newEntity + * @param array $resolveTargetEntities */ - public function __construct($originalEntity, $newEntity) + public function __construct(array $resolveTargetEntities) { - $this->resolveTargetEntities[ltrim($originalEntity, "\\")] = ltrim($newEntity, "\\"); + $this->resolveTargetEntities = $resolveTargetEntities; } /** From 5a1a32297b10baca2cafad876b575eee678d46c6 Mon Sep 17 00:00:00 2001 From: mmoreram Date: Sat, 18 Oct 2014 18:00:34 +0200 Subject: [PATCH 05/17] Tested DDC-3300 --- .../ORM/Functional/Ticket/DDC3300Test.php | 82 +++++++++++++ .../ResolveDiscriminatorMapListenerTest.php | 112 ++++++++++++++++++ 2 files changed, 194 insertions(+) create mode 100644 tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php create mode 100644 tests/Doctrine/Tests/ORM/Tools/ResolveDiscriminatorMapListenerTest.php diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php new file mode 100644 index 000000000..422b3d78f --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php @@ -0,0 +1,82 @@ +_em + ->getEventManager() + ->addEventListener( + Events::loadClassMetadata, + new ResolveDiscriminatorMapListener(array( + 'Doctrine\Tests\ORM\Functional\Ticket\DDC3300BossInterface' => 'Doctrine\Tests\ORM\Functional\Ticket\DDC3300Boss', + 'Doctrine\Tests\ORM\Functional\Ticket\DDC3300EmployeeInterface' => 'Doctrine\Tests\ORM\Functional\Ticket\DDC3300Employee', + )) + ); + + $this->_schemaTool->createSchema(array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC3300Person'), + )); + + $boss = new DDC3300Boss(); + $this->_em->persist($boss); + + $employee = new DDC3300Employee(); + $this->_em->persist($employee); + + $this->_em->flush(); + } +} + +/** + * @Entity + * @InheritanceType("SINGLE_TABLE") + * @DdiscriminatorColumn(name="discr", type="string") + * @DiscriminatorMap({ + * "boss" = "Doctrine\Tests\ORM\Functional\Ticket\DDC3300BossInterface", + * "employee" = "Doctrine\Tests\ORM\Functional\Ticket\DDC3300EmployeeInterface" + * }) + */ +abstract class DDC3300Person +{ + /** + * @Id + * @Column(type="integer") + * @GeneratedValue(strategy="AUTO") + */ + public $id; +} + +interface DDC3300BossInterface +{ + +} + +/** + * @Entity + */ +class DDC3300Boss extends DDC3300Person implements DDC3300BossInterface +{ +} + +interface DDC3300EmployeeInterface +{ + +} + +/** + * @Entity + */ +class DDC3300Employee extends DDC3300Person implements DDC3300EmployeeInterface +{ +} + \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Tools/ResolveDiscriminatorMapListenerTest.php b/tests/Doctrine/Tests/ORM/Tools/ResolveDiscriminatorMapListenerTest.php new file mode 100644 index 000000000..ed6a0aaa7 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Tools/ResolveDiscriminatorMapListenerTest.php @@ -0,0 +1,112 @@ +createAnnotationDriver(); + + $this->em = $this->_getTestEntityManager(); + $this->em->getConfiguration()->setMetadataDriverImpl($annotationDriver); + $this->factory = new ClassMetadataFactory; + $this->factory->setEntityManager($this->em); + } + + /** + * @group DDC-3300 + */ + public function testResolveDiscriminatorMapListenerTestCanResolveDiscriminatorMap() + { + $evm = $this->em->getEventManager(); + $listener = new ResolveDiscriminatorMapListener(array( + 'Doctrine\Tests\ORM\Tools\BossInterface' => 'Doctrine\Tests\ORM\Tools\Boss', + 'Doctrine\Tests\ORM\Tools\EmployeeInterface' => 'Doctrine\Tests\ORM\Tools\Employee', + )); + + $evm->addEventListener(Events::loadClassMetadata, $listener); + $cm = $this->factory->getMetadataFor('Doctrine\Tests\ORM\Tools\Person'); + $meta = $cm->discriminatorMap; + $this->assertSame('Doctrine\Tests\ORM\Tools\Boss', $meta['boss']); + $this->assertSame('Doctrine\Tests\ORM\Tools\Employee', $meta['employee']); + } + + /** + * @group DDC-3300 + */ + public function testResolveDiscriminatorMapListenerTestCannotResolveWrongDiscriminatorMap() + { + $evm = $this->em->getEventManager(); + $listener = new ResolveDiscriminatorMapListener(array( + 'Doctrine\Tests\ORM\Tools\EmployeeInterface' => 'Doctrine\Tests\ORM\Tools\Employee', + )); + + $evm->addEventListener(Events::loadClassMetadata, $listener); + $cm = $this->factory->getMetadataFor('Doctrine\Tests\ORM\Tools\Person'); + $meta = $cm->discriminatorMap; + $this->assertSame('Doctrine\Tests\ORM\Tools\BossInterface', $meta['boss']); + $this->assertSame('Doctrine\Tests\ORM\Tools\Employee', $meta['employee']); + } +} + +/** + * @Entity + * @InheritanceType("SINGLE_TABLE") + * @DiscriminatorColumn(name="discr", type="string") + * @DiscriminatorMap({ + * "boss" = "\Doctrine\Tests\ORM\Tools\BossInterface", + * "employee" = "\Doctrine\Tests\ORM\Tools\EmployeeInterface" + * }) + */ +abstract class Person +{ + /** + * @Id + * @Column(type="integer") + * @GeneratedValue(strategy="AUTO") + */ + private $id; +} + +interface BossInterface +{ + +} + +class Boss extends Person implements BossInterface +{ + /** + * @Column(type="integer") + */ + private $earnedMoneyInEuros; +} + +interface EmployeeInterface +{ + +} + +class Employee extends Person implements EmployeeInterface +{ + /** + * @Column(type="integer") + */ + private $daysOfLifeReducedInDays; +} From c589b5d01357afa009e1530e9ac55a5716839155 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Thu, 15 Jan 2015 02:56:40 +0100 Subject: [PATCH 06/17] #1130 DDC-3300 - re-mapping discriminator column at runtime (based on modified class metadata) --- .../ORM/Mapping/ClassMetadataFactory.php | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php index d70f02ffa..7dcbe1e48 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php @@ -30,6 +30,7 @@ use Doctrine\ORM\Events; use Doctrine\ORM\Id\BigIntegerIdentityGenerator; use Doctrine\ORM\Id\IdentityGenerator; use Doctrine\ORM\ORMException; +use Exception; use ReflectionException; /** @@ -70,6 +71,30 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory */ private $embeddablesActiveNesting = array(); + /** + * {@inheritDoc} + */ + protected function loadMetadata($name) + { + /* @var $loaded string[] */ + $loaded = parent::loadMetadata($name); + + foreach ($loaded as $className) { + /* @var $metadata ClassMetadata */ + $metadata = $this->getMetadataFor($className); + + if (! $metadata->discriminatorValue) { + foreach ($metadata->discriminatorMap as $discriminatorValue => $discriminatorClass) { + if ($metadata->name === $this->getMetadataFor($discriminatorClass)->getName()) { + $metadata->discriminatorValue = $discriminatorValue; + } + } + } + } + + return $loaded; + } + /** * @param EntityManagerInterface $em */ @@ -270,9 +295,9 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory if ( ! $class->discriminatorColumn) { throw MappingException::missingDiscriminatorColumn($class->name); } - } else if ($parent && !$class->reflClass->isAbstract() && !in_array($class->name, array_values($class->discriminatorMap))) { + } else if (! $class->reflClass->isAbstract() && !in_array($class->name, array_values($class->discriminatorMap))) { // enforce discriminator map for all entities of an inheritance hierarchy, otherwise problems will occur. - throw MappingException::mappedClassNotPartOfDiscriminatorMap($class->name, $class->rootEntityName); + //throw MappingException::mappedClassNotPartOfDiscriminatorMap($class->name, $class->rootEntityName); } } else if ($class->isMappedSuperclass && $class->name == $class->rootEntityName && (count($class->discriminatorMap) || $class->discriminatorColumn)) { // second condition is necessary for mapped superclasses in the middle of an inheritance hierarchy From 786c34faa5b664e5c31e3ce04c432a81b881fe03 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Thu, 15 Jan 2015 03:04:56 +0100 Subject: [PATCH 07/17] #1130 DDC-3300 - refactoring auto-remapping of discriminator value into a private method --- .../ORM/Mapping/ClassMetadataFactory.php | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php index 7dcbe1e48..a6ad18832 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php @@ -79,18 +79,7 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory /* @var $loaded string[] */ $loaded = parent::loadMetadata($name); - foreach ($loaded as $className) { - /* @var $metadata ClassMetadata */ - $metadata = $this->getMetadataFor($className); - - if (! $metadata->discriminatorValue) { - foreach ($metadata->discriminatorMap as $discriminatorValue => $discriminatorClass) { - if ($metadata->name === $this->getMetadataFor($discriminatorClass)->getName()) { - $metadata->discriminatorValue = $discriminatorValue; - } - } - } - } + array_map([$this, 'populateDiscriminatorValue'], array_map([$this, 'getMetadataFor'], $loaded)); return $loaded; } @@ -313,6 +302,29 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory return new ClassMetadata($className, $this->em->getConfiguration()->getNamingStrategy()); } + /** + * Populates the discriminator value of the given metadata (if not set) by iterating over discriminator + * map classes and looking for a fitting one. + * + * @param ClassMetadata $metadata + * + * @throws MappingException + */ + private function populateDiscriminatorValue(ClassMetadata $metadata) + { + if (! $metadata->discriminatorValue && $metadata->discriminatorMap) { + foreach ($metadata->discriminatorMap as $discriminatorValue => $discriminatorClass) { + if ($metadata->name === $this->getMetadataFor($discriminatorClass)->getName()) { + $metadata->discriminatorValue = $discriminatorValue; + + break; + } + } + + //throw MappingException::mappedClassNotPartOfDiscriminatorMap($metadata->name, $metadata->rootEntityName); + } + } + /** * Adds a default discriminator map if no one is given * From 8579baf28cdfacb1043b4a15c0fd3abbf7830452 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Thu, 15 Jan 2015 03:05:27 +0100 Subject: [PATCH 08/17] #1130 DDC-3300 - minor refactoring (`else` removal, spacing) --- .../ORM/Mapping/ClassMetadataInfo.php | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php index b88261a4d..c3c8d8c83 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php @@ -2745,15 +2745,18 @@ class ClassMetadataInfo implements ClassMetadata $className = ltrim($className, '\\'); $this->discriminatorMap[$name] = $className; - if ($this->name == $className) { + if ($this->name === $className) { $this->discriminatorValue = $name; - } else { - if ( ! class_exists($className) && ! interface_exists($className)) { - throw MappingException::invalidClassInDiscriminatorMap($className, $this->name); - } - if (is_subclass_of($className, $this->name) && ! in_array($className, $this->subClasses)) { - $this->subClasses[] = $className; - } + + return; + } + + if ( ! (class_exists($className) || interface_exists($className))) { + throw MappingException::invalidClassInDiscriminatorMap($className, $this->name); + } + + if (is_subclass_of($className, $this->name) && ! in_array($className, $this->subClasses)) { + $this->subClasses[] = $className; } } From a36bea29510347469e9454612009d3963ed200ff Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Thu, 15 Jan 2015 03:37:50 +0100 Subject: [PATCH 09/17] #1130 DDC-3300 - optimizing performance (looping over existing classes first): throwing exceptions if the class is not found in the discriminator map --- .../ORM/Mapping/ClassMetadataFactory.php | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php index a6ad18832..e44ed2ff4 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php @@ -308,21 +308,37 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory * * @param ClassMetadata $metadata * + * @return void + * * @throws MappingException */ private function populateDiscriminatorValue(ClassMetadata $metadata) { - if (! $metadata->discriminatorValue && $metadata->discriminatorMap) { - foreach ($metadata->discriminatorMap as $discriminatorValue => $discriminatorClass) { - if ($metadata->name === $this->getMetadataFor($discriminatorClass)->getName()) { - $metadata->discriminatorValue = $discriminatorValue; - - break; - } - } - - //throw MappingException::mappedClassNotPartOfDiscriminatorMap($metadata->name, $metadata->rootEntityName); + if ($metadata->discriminatorValue + || ! $metadata->discriminatorMap + || $metadata->isMappedSuperclass + || $metadata->reflClass->isAbstract() + ) { + return; } + + foreach ($metadata->discriminatorMap as $discriminatorValue => $discriminatorClass) { + if ($discriminatorClass === $metadata->name) { + $metadata->discriminatorValue = $discriminatorValue; + + return; + } + } + + foreach ($metadata->discriminatorMap as $discriminatorValue => $discriminatorClass) { + if ($metadata->name === $this->getMetadataFor($discriminatorClass)->getName()) { + $metadata->discriminatorValue = $discriminatorValue; + + return; + } + } + + throw MappingException::mappedClassNotPartOfDiscriminatorMap($metadata->name, $metadata->rootEntityName); } /** From b7c28924b16a18e3b8cd33a69fd0d55f4bda602b Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Thu, 15 Jan 2015 03:48:53 +0100 Subject: [PATCH 10/17] #1130 DDC-3300 - fixed inheritance maps where inheritance members were missing --- .../JoinedRootClass.php | 2 +- .../SingleRootClass.php | 2 +- .../ORM/Functional/Ticket/DDC1113Test.php | 2 +- .../ORM/Functional/Ticket/DDC1454Test.php | 2 +- .../ORM/Functional/Ticket/DDC1509Test.php | 2 +- .../ORM/Functional/Ticket/DDC1787Test.php | 2 +- .../ORM/Functional/Ticket/DDC2012Test.php | 3 +- .../ORM/Functional/Ticket/DDC2346Test.php | 2 +- .../ORM/Functional/Ticket/DDC3300Test.php | 38 ++++++++++++------- 9 files changed, 34 insertions(+), 21 deletions(-) diff --git a/tests/Doctrine/Tests/Models/CompositeKeyInheritance/JoinedRootClass.php b/tests/Doctrine/Tests/Models/CompositeKeyInheritance/JoinedRootClass.php index f145ba259..3055b32e1 100644 --- a/tests/Doctrine/Tests/Models/CompositeKeyInheritance/JoinedRootClass.php +++ b/tests/Doctrine/Tests/Models/CompositeKeyInheritance/JoinedRootClass.php @@ -5,7 +5,7 @@ namespace Doctrine\Tests\Models\CompositeKeyInheritance; * @Entity * @InheritanceType("JOINED") * @DiscriminatorColumn(name="discr", type="string") - * @DiscriminatorMap({"child" = "JoinedChildClass",}) + * @DiscriminatorMap({"child" = "JoinedChildClass", "root" = "JoinedRootClass"}) */ class JoinedRootClass { diff --git a/tests/Doctrine/Tests/Models/CompositeKeyInheritance/SingleRootClass.php b/tests/Doctrine/Tests/Models/CompositeKeyInheritance/SingleRootClass.php index 1bbd09702..19b4b4b01 100644 --- a/tests/Doctrine/Tests/Models/CompositeKeyInheritance/SingleRootClass.php +++ b/tests/Doctrine/Tests/Models/CompositeKeyInheritance/SingleRootClass.php @@ -5,7 +5,7 @@ namespace Doctrine\Tests\Models\CompositeKeyInheritance; * @Entity * @InheritanceType("SINGLE_TABLE") * @DiscriminatorColumn(name="discr", type="string") - * @DiscriminatorMap({"child" = "SingleChildClass",}) + * @DiscriminatorMap({"child" = "SingleChildClass", "root" = "SingleRootClass"}) */ class SingleRootClass { diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1113Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1113Test.php index 5bb007fd0..335c89dce 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1113Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1113Test.php @@ -50,7 +50,7 @@ class DDC1113Test extends \Doctrine\Tests\OrmFunctionalTestCase /** * @Entity * @InheritanceType("SINGLE_TABLE") - * @DiscriminatorMap({"car" = "DDC1113Car", "bus" = "DDC1113Bus"}) + * @DiscriminatorMap({"vehicle" = "DDC1113Vehicle", "car" = "DDC1113Car", "bus" = "DDC1113Bus"}) */ class DDC1113Vehicle { diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1454Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1454Test.php index 162072965..f6b26253a 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1454Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1454Test.php @@ -43,7 +43,7 @@ class DDC1454Picture extends DDC1454File * @Entity * @InheritanceType("JOINED") * @DiscriminatorColumn(name="discr", type="string") - * @DiscriminatorMap({"picture" = "DDC1454Picture"}) + * @DiscriminatorMap({"file" = "DDC1454File", "picture" = "DDC1454Picture"}) */ class DDC1454File { diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1509Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1509Test.php index 6ba0cd42f..2b7e9b377 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1509Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1509Test.php @@ -115,7 +115,7 @@ class DDC1509Picture * @Entity * @InheritanceType("SINGLE_TABLE") * @DiscriminatorColumn(name="discr", type="string") - * @DiscriminatorMap({"file" = "DDC1509File"}) + * @DiscriminatorMap({"abstractFile" = "DDC1509AbstractFile", "file" = "DDC1509File"}) */ class DDC1509AbstractFile { diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1787Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1787Test.php index 39fe48367..862d9196a 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1787Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1787Test.php @@ -33,7 +33,7 @@ class DDC1787Test extends \Doctrine\Tests\OrmFunctionalTestCase * @Entity * @InheritanceType("JOINED") * @DiscriminatorColumn(name="discr", type="string") - * @DiscriminatorMap({"bar" = "DDC1787Bar"}) + * @DiscriminatorMap({"bar" = "DDC1787Bar", "foo" = "DDC1787Foo"}) */ class DDC1787Foo { diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2012Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2012Test.php index 549cf23cb..92510cb02 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2012Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2012Test.php @@ -71,7 +71,8 @@ class DDC2012Test extends \Doctrine\Tests\OrmFunctionalTestCase * @InheritanceType("JOINED") * @DiscriminatorColumn(name="type_id", type="smallint") * @DiscriminatorMap({ - * 1 = "DDC2012ItemPerson" + * 1 = "DDC2012ItemPerson", + * 2 = "DDC2012Item" * }) */ class DDC2012Item diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2346Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2346Test.php index 8bc803f29..8832b0f50 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2346Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2346Test.php @@ -88,7 +88,7 @@ class DDC2346Foo * @Entity * @InheritanceType("JOINED") * @DiscriminatorColumn(name="discr", type="string") - * @DiscriminatorMap({"baz" = "DDC2346Baz"}) + * @DiscriminatorMap({"bar" = "DDC2346Bar", "baz" = "DDC2346Baz"}) */ class DDC2346Bar { diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php index 422b3d78f..8ac6dde7a 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php @@ -4,6 +4,7 @@ namespace Doctrine\Tests\ORM\Functional\Ticket; use Doctrine\ORM\Events; use Doctrine\ORM\Tools\ResolveDiscriminatorMapListener; +use Doctrine\ORM\Tools\ResolveTargetEntityListener; /** * @group DDC-3300 @@ -12,21 +13,28 @@ class DDC3300Test extends \Doctrine\Tests\OrmFunctionalTestCase { public function testIssue() { - $this - ->_em - ->getEventManager() - ->addEventListener( - Events::loadClassMetadata, - new ResolveDiscriminatorMapListener(array( - 'Doctrine\Tests\ORM\Functional\Ticket\DDC3300BossInterface' => 'Doctrine\Tests\ORM\Functional\Ticket\DDC3300Boss', - 'Doctrine\Tests\ORM\Functional\Ticket\DDC3300EmployeeInterface' => 'Doctrine\Tests\ORM\Functional\Ticket\DDC3300Employee', - )) - ); + $resolveTargetEntity = new ResolveTargetEntityListener(); + + $resolveTargetEntity->addResolveTargetEntity( + DDC3300BossInterface::INTERFACENAME, + DDC3300Boss::CLASSNAME, + array() + ); + + $resolveTargetEntity->addResolveTargetEntity( + DDC3300EmployeeInterface::INTERFACENAME, + DDC3300Employee::CLASSNAME, + array() + ); + + $this->_em->getEventManager()->addEventSubscriber($resolveTargetEntity); $this->_schemaTool->createSchema(array( - $this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC3300Person'), + $this->_em->getClassMetadata(DDC3300Person::CLASSNAME), )); + //die(var_dump($this->_em->getClassMetadata(DDC3300Person::CLASSNAME)->discriminatorMap)); + $boss = new DDC3300Boss(); $this->_em->persist($boss); @@ -48,6 +56,8 @@ class DDC3300Test extends \Doctrine\Tests\OrmFunctionalTestCase */ abstract class DDC3300Person { + const CLASSNAME = __CLASS__; + /** * @Id * @Column(type="integer") @@ -58,7 +68,7 @@ abstract class DDC3300Person interface DDC3300BossInterface { - + const INTERFACENAME = __CLASS__; } /** @@ -66,11 +76,12 @@ interface DDC3300BossInterface */ class DDC3300Boss extends DDC3300Person implements DDC3300BossInterface { + const CLASSNAME = __CLASS__; } interface DDC3300EmployeeInterface { - + const INTERFACENAME = __CLASS__; } /** @@ -78,5 +89,6 @@ interface DDC3300EmployeeInterface */ class DDC3300Employee extends DDC3300Person implements DDC3300EmployeeInterface { + const CLASSNAME = __CLASS__; } \ No newline at end of file From 8a6b1b48e357c03656b37e4a28c547b04aecd7cf Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Thu, 15 Jan 2015 03:52:01 +0100 Subject: [PATCH 11/17] #1130 DDC-3300 - removing unused `ResolveDiscriminatorMapListener` and related test --- .../Tools/ResolveDiscriminatorMapListener.php | 82 ------------- .../ResolveDiscriminatorMapListenerTest.php | 112 ------------------ 2 files changed, 194 deletions(-) delete mode 100644 lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php delete mode 100644 tests/Doctrine/Tests/ORM/Tools/ResolveDiscriminatorMapListenerTest.php diff --git a/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php b/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php deleted file mode 100644 index 35cc84a17..000000000 --- a/lib/Doctrine/ORM/Tools/ResolveDiscriminatorMapListener.php +++ /dev/null @@ -1,82 +0,0 @@ -. - */ - -namespace Doctrine\ORM\Tools; - -use Doctrine\ORM\Event\LoadClassMetadataEventArgs; -use Doctrine\ORM\Mapping\ClassMetadataInfo; - -/** - * ResolveDiscriminatorMapListener - * - * Mechanism to overwrite interfaces or classes specified in discrimination map - * - * @author Benjamin Eberlei - * @since 2.2 - */ -class ResolveDiscriminatorMapListener -{ - /** - * @var array - */ - private $resolveTargetEntities = array(); - - /** - * Construct - * - * @param array $resolveTargetEntities - */ - public function __construct(array $resolveTargetEntities) - { - $this->resolveTargetEntities = $resolveTargetEntities; - } - - /** - * Processes event and resolves new target entity names. - * - * @param LoadClassMetadataEventArgs $args - * - * @return void - */ - public function loadClassMetadata(LoadClassMetadataEventArgs $args) - { - $classMetadata = $args->getClassMetadata(); - - if (!empty($classMetadata->discriminatorMap)) { - - $this->remapDiscriminatorMap($classMetadata); - } - } - - /** - * Replaces all Interfaces in discriminator map - * - * @param \Doctrine\ORM\Mapping\ClassMetadataInfo $classMetadata - */ - private function remapDiscriminatorMap(ClassMetadataInfo $classMetadata) - { - foreach ($classMetadata->discriminatorMap as $name => $interface) { - - if (isset($this->resolveTargetEntities[$interface])) { - - $classMetadata->discriminatorMap[$name] = $this->resolveTargetEntities[$interface]; - } - } - } -} diff --git a/tests/Doctrine/Tests/ORM/Tools/ResolveDiscriminatorMapListenerTest.php b/tests/Doctrine/Tests/ORM/Tools/ResolveDiscriminatorMapListenerTest.php deleted file mode 100644 index ed6a0aaa7..000000000 --- a/tests/Doctrine/Tests/ORM/Tools/ResolveDiscriminatorMapListenerTest.php +++ /dev/null @@ -1,112 +0,0 @@ -createAnnotationDriver(); - - $this->em = $this->_getTestEntityManager(); - $this->em->getConfiguration()->setMetadataDriverImpl($annotationDriver); - $this->factory = new ClassMetadataFactory; - $this->factory->setEntityManager($this->em); - } - - /** - * @group DDC-3300 - */ - public function testResolveDiscriminatorMapListenerTestCanResolveDiscriminatorMap() - { - $evm = $this->em->getEventManager(); - $listener = new ResolveDiscriminatorMapListener(array( - 'Doctrine\Tests\ORM\Tools\BossInterface' => 'Doctrine\Tests\ORM\Tools\Boss', - 'Doctrine\Tests\ORM\Tools\EmployeeInterface' => 'Doctrine\Tests\ORM\Tools\Employee', - )); - - $evm->addEventListener(Events::loadClassMetadata, $listener); - $cm = $this->factory->getMetadataFor('Doctrine\Tests\ORM\Tools\Person'); - $meta = $cm->discriminatorMap; - $this->assertSame('Doctrine\Tests\ORM\Tools\Boss', $meta['boss']); - $this->assertSame('Doctrine\Tests\ORM\Tools\Employee', $meta['employee']); - } - - /** - * @group DDC-3300 - */ - public function testResolveDiscriminatorMapListenerTestCannotResolveWrongDiscriminatorMap() - { - $evm = $this->em->getEventManager(); - $listener = new ResolveDiscriminatorMapListener(array( - 'Doctrine\Tests\ORM\Tools\EmployeeInterface' => 'Doctrine\Tests\ORM\Tools\Employee', - )); - - $evm->addEventListener(Events::loadClassMetadata, $listener); - $cm = $this->factory->getMetadataFor('Doctrine\Tests\ORM\Tools\Person'); - $meta = $cm->discriminatorMap; - $this->assertSame('Doctrine\Tests\ORM\Tools\BossInterface', $meta['boss']); - $this->assertSame('Doctrine\Tests\ORM\Tools\Employee', $meta['employee']); - } -} - -/** - * @Entity - * @InheritanceType("SINGLE_TABLE") - * @DiscriminatorColumn(name="discr", type="string") - * @DiscriminatorMap({ - * "boss" = "\Doctrine\Tests\ORM\Tools\BossInterface", - * "employee" = "\Doctrine\Tests\ORM\Tools\EmployeeInterface" - * }) - */ -abstract class Person -{ - /** - * @Id - * @Column(type="integer") - * @GeneratedValue(strategy="AUTO") - */ - private $id; -} - -interface BossInterface -{ - -} - -class Boss extends Person implements BossInterface -{ - /** - * @Column(type="integer") - */ - private $earnedMoneyInEuros; -} - -interface EmployeeInterface -{ - -} - -class Employee extends Person implements EmployeeInterface -{ - /** - * @Column(type="integer") - */ - private $daysOfLifeReducedInDays; -} From fbe294927f8f6ef21a21a201e4eb0dd744631a4a Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Thu, 15 Jan 2015 04:02:39 +0100 Subject: [PATCH 12/17] #1130 DDC-3300 - cleaning up test code --- .../ORM/Functional/Ticket/DDC3300Test.php | 27 +++++-------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php index 8ac6dde7a..e7f85b3bd 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php @@ -2,8 +2,6 @@ namespace Doctrine\Tests\ORM\Functional\Ticket; -use Doctrine\ORM\Events; -use Doctrine\ORM\Tools\ResolveDiscriminatorMapListener; use Doctrine\ORM\Tools\ResolveTargetEntityListener; /** @@ -33,13 +31,8 @@ class DDC3300Test extends \Doctrine\Tests\OrmFunctionalTestCase $this->_em->getClassMetadata(DDC3300Person::CLASSNAME), )); - //die(var_dump($this->_em->getClassMetadata(DDC3300Person::CLASSNAME)->discriminatorMap)); - - $boss = new DDC3300Boss(); - $this->_em->persist($boss); - - $employee = new DDC3300Employee(); - $this->_em->persist($employee); + $this->_em->persist(new DDC3300Boss()); + $this->_em->persist(new DDC3300Employee()); $this->_em->flush(); } @@ -50,7 +43,7 @@ class DDC3300Test extends \Doctrine\Tests\OrmFunctionalTestCase * @InheritanceType("SINGLE_TABLE") * @DdiscriminatorColumn(name="discr", type="string") * @DiscriminatorMap({ - * "boss" = "Doctrine\Tests\ORM\Functional\Ticket\DDC3300BossInterface", + * "boss" = "Doctrine\Tests\ORM\Functional\Ticket\DDC3300BossInterface", * "employee" = "Doctrine\Tests\ORM\Functional\Ticket\DDC3300EmployeeInterface" * }) */ @@ -58,11 +51,7 @@ abstract class DDC3300Person { const CLASSNAME = __CLASS__; - /** - * @Id - * @Column(type="integer") - * @GeneratedValue(strategy="AUTO") - */ + /** @Id @Column(type="integer") @GeneratedValue(strategy="AUTO") */ public $id; } @@ -71,9 +60,7 @@ interface DDC3300BossInterface const INTERFACENAME = __CLASS__; } -/** - * @Entity - */ +/** @Entity */ class DDC3300Boss extends DDC3300Person implements DDC3300BossInterface { const CLASSNAME = __CLASS__; @@ -84,9 +71,7 @@ interface DDC3300EmployeeInterface const INTERFACENAME = __CLASS__; } -/** - * @Entity - */ +/** @Entity */ class DDC3300Employee extends DDC3300Person implements DDC3300EmployeeInterface { const CLASSNAME = __CLASS__; From 635d2c141fee10091db08d7d500216a7f2a66701 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Fri, 16 Jan 2015 16:45:21 +0100 Subject: [PATCH 13/17] #1130 DDC-3300 - minor CS fix (EOF EOL) --- tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php index e7f85b3bd..58628d04a 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php @@ -76,4 +76,3 @@ class DDC3300Employee extends DDC3300Person implements DDC3300EmployeeInterface { const CLASSNAME = __CLASS__; } - \ No newline at end of file From e969a6be85fa13963ecb7b2c0c59c8c727673306 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Fri, 16 Jan 2015 16:46:29 +0100 Subject: [PATCH 14/17] #1130 DDC-3300 - rewording and clarifying logic that re-maps discriminator values when needed --- lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php index e44ed2ff4..044319e74 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php @@ -30,7 +30,6 @@ use Doctrine\ORM\Events; use Doctrine\ORM\Id\BigIntegerIdentityGenerator; use Doctrine\ORM\Id\IdentityGenerator; use Doctrine\ORM\ORMException; -use Exception; use ReflectionException; /** @@ -75,11 +74,10 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory * {@inheritDoc} */ protected function loadMetadata($name) - { - /* @var $loaded string[] */ +`` { $loaded = parent::loadMetadata($name); - array_map([$this, 'populateDiscriminatorValue'], array_map([$this, 'getMetadataFor'], $loaded)); + array_map([$this, 'resolveDiscriminatorValue'], array_map([$this, 'getMetadataFor'], $loaded)); return $loaded; } @@ -284,9 +282,6 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory if ( ! $class->discriminatorColumn) { throw MappingException::missingDiscriminatorColumn($class->name); } - } else if (! $class->reflClass->isAbstract() && !in_array($class->name, array_values($class->discriminatorMap))) { - // enforce discriminator map for all entities of an inheritance hierarchy, otherwise problems will occur. - //throw MappingException::mappedClassNotPartOfDiscriminatorMap($class->name, $class->rootEntityName); } } else if ($class->isMappedSuperclass && $class->name == $class->rootEntityName && (count($class->discriminatorMap) || $class->discriminatorColumn)) { // second condition is necessary for mapped superclasses in the middle of an inheritance hierarchy @@ -312,7 +307,7 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory * * @throws MappingException */ - private function populateDiscriminatorValue(ClassMetadata $metadata) + private function resolveDiscriminatorValue(ClassMetadata $metadata) { if ($metadata->discriminatorValue || ! $metadata->discriminatorMap @@ -322,6 +317,7 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory return; } + // minor optimization: avoid loading related metadata when not needed foreach ($metadata->discriminatorMap as $discriminatorValue => $discriminatorClass) { if ($discriminatorClass === $metadata->name) { $metadata->discriminatorValue = $discriminatorValue; @@ -330,6 +326,7 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory } } + // iterate over discriminator mappings and resolve actual referenced classes according to existing metadata foreach ($metadata->discriminatorMap as $discriminatorValue => $discriminatorClass) { if ($metadata->name === $this->getMetadataFor($discriminatorClass)->getName()) { $metadata->discriminatorValue = $discriminatorValue; From cd3ffa8f143b0fc2f73d95875188383a7027fa17 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Fri, 16 Jan 2015 16:56:56 +0100 Subject: [PATCH 15/17] #1130 DDC-3300 - removing typo causing parse error --- lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php index 044319e74..089780775 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php @@ -74,7 +74,7 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory * {@inheritDoc} */ protected function loadMetadata($name) -`` { + { $loaded = parent::loadMetadata($name); array_map([$this, 'resolveDiscriminatorValue'], array_map([$this, 'getMetadataFor'], $loaded)); From c1cc768aeeb567554abfd148d4bbc7f849438754 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Thu, 22 Jan 2015 09:50:59 +0100 Subject: [PATCH 16/17] #1257 DDC-3300 - correcting further incomplete discriminator maps in the test suite --- tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3223Test.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3223Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3223Test.php index 5677075dd..541221aa0 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3223Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3223Test.php @@ -53,7 +53,8 @@ class Journalist extends Participant * @InheritanceType("JOINED") * @DiscriminatorColumn(name="discr", type="string") * @DiscriminatorMap({ - * "journalist" = "Journalist", + * "journalist" = "Journalist", + * "participant" = "Participant", * }) */ class Participant @@ -71,6 +72,7 @@ class Participant * @DiscriminatorColumn(name="discr", type="string") * @DiscriminatorMap({ * "profile" = "ProfileStatus", + * "status" = "Status", * }) */ class Status From 6547d5462e6e2a5c45262f57ec9fa11d79e16f6b Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Thu, 22 Jan 2015 09:51:43 +0100 Subject: [PATCH 17/17] #1257 DDC-3300 - strengthening test case (missing assertion, test name) --- .../Tests/ORM/Functional/Ticket/DDC3300Test.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php index 58628d04a..b7905ca3d 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3300Test.php @@ -9,7 +9,7 @@ use Doctrine\ORM\Tools\ResolveTargetEntityListener; */ class DDC3300Test extends \Doctrine\Tests\OrmFunctionalTestCase { - public function testIssue() + public function testResolveTargetEntitiesChangesDiscriminatorMapValues() { $resolveTargetEntity = new ResolveTargetEntityListener(); @@ -31,10 +31,17 @@ class DDC3300Test extends \Doctrine\Tests\OrmFunctionalTestCase $this->_em->getClassMetadata(DDC3300Person::CLASSNAME), )); - $this->_em->persist(new DDC3300Boss()); - $this->_em->persist(new DDC3300Employee()); + $boss = new DDC3300Boss(); + $employee = new DDC3300Employee(); + + $this->_em->persist($boss); + $this->_em->persist($employee); $this->_em->flush(); + $this->_em->clear(); + + $this->assertEquals($boss, $this->_em->find(DDC3300BossInterface::INTERFACENAME, $boss->id)); + $this->assertEquals($employee, $this->_em->find(DDC3300EmployeeInterface::INTERFACENAME, $employee->id)); } }