From 17ec1aab77586ce801ee009a9465e8bd467d7919 Mon Sep 17 00:00:00 2001 From: Dustin Thomson Date: Wed, 26 Nov 2014 21:51:17 -0700 Subject: [PATCH] Modified class metadata factory to have entity tables inherit indexes from mapped superclasses --- .../ORM/Mapping/ClassMetadataFactory.php | 18 +++++++ .../Mapping/BasicInheritanceMappingTest.php | 47 +++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php index 876f1ce57..71c57a78e 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php @@ -175,6 +175,24 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory $class->setPrimaryTable($parent->table); } + if ($parent && $parent->isMappedSuperclass) { + //Copy the table indices from the parent + + $indexTypes = array ('uniqueConstraints', 'indexes'); + + foreach ($indexTypes as $indexType) { + if (isset($parent->table[$indexType])) { + foreach ($parent->table[$indexType] as $indexName => $index) { + if (isset($class->table[$indexType][$indexName])) { + continue; // Let the inheriting table override indices + } + + $class->table[$indexType][$indexName] = $index; + } + } + } + } + if ($parent && $parent->cache) { $class->cache = $parent->cache; } diff --git a/tests/Doctrine/Tests/ORM/Mapping/BasicInheritanceMappingTest.php b/tests/Doctrine/Tests/ORM/Mapping/BasicInheritanceMappingTest.php index 2eee28b85..790562194 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/BasicInheritanceMappingTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/BasicInheritanceMappingTest.php @@ -3,6 +3,7 @@ namespace Doctrine\Tests\ORM\Mapping; use Doctrine\ORM\Mapping\ClassMetadataFactory; +use Doctrine\ORM\Mapping\ClassMetadataInfo; use Doctrine\ORM\Tools\SchemaTool; class BasicInheritanceMappingTest extends \Doctrine\Tests\OrmTestCase @@ -167,6 +168,22 @@ class BasicInheritanceMappingTest extends \Doctrine\Tests\OrmTestCase $this->assertInstanceOf('Doctrine\ORM\Id\SequenceGenerator', $class->idGenerator); $this->assertEquals(array('allocationSize' => 1, 'initialValue' => 10, 'sequenceName' => 'foo'), $class->sequenceGeneratorDefinition); } + + /** + * Ensure indexes are inherited from the mapped superclass. + * + * @group DDC-3418 + */ + public function testMappedSuperclassIndex() + { + $class = $this->_factory->getMetadataFor(__NAMESPACE__ . '\\EntityIndexSubClass'); + /* @var $class ClassMetadataInfo */ + + $this->assertTrue(isset($class->fieldMappings['mapped1'])); + $this->assertTrue(isset($class->table['uniqueConstraints']['IDX_NAME_INDEX'])); + $this->assertTrue(isset($class->table['uniqueConstraints']['IDX_MAPPED1_INDEX'])); + $this->assertTrue(isset($class->table['indexes']['IDX_MAPPED2_INDEX'])); + } } class TransientBaseClass { @@ -206,6 +223,36 @@ class EntitySubClass2 extends MappedSuperclassBase { private $name; } +/** + * @MappedSuperclass + * + * @Table( + * uniqueConstraints={@UniqueConstraint(name="IDX_MAPPED1_INDEX",columns={"mapped1"})}, + * indexes={@Index(name="IDX_MAPPED2_INDEX", columns={"mapped2"})} + * ) + */ +class MappedSuperclassBaseIndex { + /** @Column(type="string") */ + private $mapped1; + /** @Column(type="string") */ + private $mapped2; +} + +/** + * @Entity + * + * @Table( + * uniqueConstraints={@UniqueConstraint(name="IDX_NAME_INDEX",columns={"name"})} + * ) + * */ +class EntityIndexSubClass extends MappedSuperclassBaseIndex +{ + /** @Id @Column(type="integer") */ + private $id; + /** @Column(type="string") */ + private $name; +} + /** * @Entity * @InheritanceType("SINGLE_TABLE")