From d97fad26a5d361c150c203d87b57b7fdb094bcfa Mon Sep 17 00:00:00 2001 From: Bill Schaller Date: Tue, 5 Jan 2016 12:29:49 -0500 Subject: [PATCH 1/3] Add tests to ensure DiscriminatorColumn is optional, and that optional params type and length have proper defaults. --- .../ORM/Mapping/AbstractMappingDriverTest.php | 114 +++++++++++++++++- ...completeDiscriminatorColumnMapping.dcm.xml | 20 +++ ...EntityNoDiscriminatorColumnMapping.dcm.xml | 18 +++ ...completeDiscriminatorColumnMapping.dcm.yml | 12 ++ ...EntityNoDiscriminatorColumnMapping.dcm.yml | 10 ++ 5 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.SingleTableEntityIncompleteDiscriminatorColumnMapping.dcm.xml create mode 100644 tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.SingleTableEntityNoDiscriminatorColumnMapping.dcm.xml create mode 100644 tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.SingleTableEntityIncompleteDiscriminatorColumnMapping.dcm.yml create mode 100644 tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.SingleTableEntityNoDiscriminatorColumnMapping.dcm.yml diff --git a/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php b/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php index 874f9416b..7410979e0 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php @@ -4,6 +4,8 @@ namespace Doctrine\Tests\ORM\Mapping; use Doctrine\ORM\Events; use Doctrine\ORM\Event\LifecycleEventArgs; +use Doctrine\ORM\Mapping\DiscriminatorColumn; +use Doctrine\ORM\Mapping\Id; use Doctrine\Tests\Models\Company\CompanyFixContract; use Doctrine\Tests\Models\Company\CompanyFlexContract; use Doctrine\Tests\Models\Cache\City; @@ -977,6 +979,52 @@ abstract class AbstractMappingDriverTest extends \Doctrine\Tests\OrmTestCase $this->assertSame('implicit_schema', $metadata->getSchemaName()); $this->assertSame('implicit_table', $metadata->getTableName()); } + + /** + * @group DDC-514 + * @group DDC-1015 + */ + public function testDiscriminatorColumnDefaultLength() + { + if (strpos(get_class($this), 'PHPMappingDriver') !== false) { + $this->markTestSkipped('PHP Mapping Drivers have no defaults.'); + } + $class = $this->createClassMetadata(__NAMESPACE__ . '\SingleTableEntityNoDiscriminatorColumnMapping'); + $this->assertEquals(255, $class->discriminatorColumn['length']); + $class = $this->createClassMetadata(__NAMESPACE__ . '\SingleTableEntityIncompleteDiscriminatorColumnMapping'); + $this->assertEquals(255, $class->discriminatorColumn['length']); + } + + /** + * @group DDC-514 + * @group DDC-1015 + */ + public function testDiscriminatorColumnDefaultType() + { + if (strpos(get_class($this), 'PHPMappingDriver') !== false) { + $this->markTestSkipped('PHP Mapping Drivers have no defaults.'); + } + $class = $this->createClassMetadata(__NAMESPACE__ . '\SingleTableEntityNoDiscriminatorColumnMapping'); + $this->assertEquals('string', $class->discriminatorColumn['type']); + $class = $this->createClassMetadata(__NAMESPACE__ . '\SingleTableEntityIncompleteDiscriminatorColumnMapping'); + $this->assertEquals('string', $class->discriminatorColumn['type']); + } + + /** + * @group DDC-514 + * @group DDC-1015 + */ + public function testDiscriminatorColumnDefaultName() + { + if (strpos(get_class($this), 'PHPMappingDriver') !== false) { + $this->markTestSkipped('PHP Mapping Drivers have no defaults.'); + } + $class = $this->createClassMetadata(__NAMESPACE__ . '\SingleTableEntityNoDiscriminatorColumnMapping'); + $this->assertEquals('dtype', $class->discriminatorColumn['name']); + $class = $this->createClassMetadata(__NAMESPACE__ . '\SingleTableEntityIncompleteDiscriminatorColumnMapping'); + $this->assertEquals('dtype', $class->discriminatorColumn['name']); + } + } /** @@ -1317,7 +1365,6 @@ class DDC807Entity } } - class DDC807SubClasse1 {} class DDC807SubClasse2 {} @@ -1357,3 +1404,68 @@ class Comment )); } } + +/** + * @Entity + * @InheritanceType("SINGLE_TABLE") + * @DiscriminatorMap({ + * "ONE" = "SingleTableEntityNoDiscriminatorColumnMappingSub1", + * "TWO" = "SingleTableEntityNoDiscriminatorColumnMappingSub2" + * }) + */ +class SingleTableEntityNoDiscriminatorColumnMapping +{ + /** + * @Id + * @Column(type="integer") + * @GeneratedValue(strategy="NONE") + */ + public $id; + + public static function loadMetadata(ClassMetadataInfo $metadata) + { + $metadata->mapField(array( + 'id' => true, + 'fieldName' => 'id', + )); + + $metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_NONE); + } +} + +class SingleTableEntityNoDiscriminatorColumnMappingSub1 extends SingleTableEntityNoDiscriminatorColumnMapping {} +class SingleTableEntityNoDiscriminatorColumnMappingSub2 extends SingleTableEntityNoDiscriminatorColumnMapping {} + +/** + * @Entity + * @InheritanceType("SINGLE_TABLE") + * @DiscriminatorMap({ + * "ONE" = "SingleTableEntityIncompleteDiscriminatorColumnMappingSub1", + * "TWO" = "SingleTableEntityIncompleteDiscriminatorColumnMappingSub2" + * }) + * @DiscriminatorColumn(name="dtype") + */ +class SingleTableEntityIncompleteDiscriminatorColumnMapping +{ + /** + * @Id + * @Column(type="integer") + * @GeneratedValue(strategy="NONE") + */ + public $id; + + public static function loadMetadata(ClassMetadataInfo $metadata) + { + $metadata->mapField(array( + 'id' => true, + 'fieldName' => 'id', + )); + + $metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_NONE); + } +} + +class SingleTableEntityIncompleteDiscriminatorColumnMappingSub1 + extends SingleTableEntityIncompleteDiscriminatorColumnMapping {} +class SingleTableEntityIncompleteDiscriminatorColumnMappingSub2 + extends SingleTableEntityIncompleteDiscriminatorColumnMapping {} \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.SingleTableEntityIncompleteDiscriminatorColumnMapping.dcm.xml b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.SingleTableEntityIncompleteDiscriminatorColumnMapping.dcm.xml new file mode 100644 index 000000000..5dffe178d --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.SingleTableEntityIncompleteDiscriminatorColumnMapping.dcm.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.SingleTableEntityNoDiscriminatorColumnMapping.dcm.xml b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.SingleTableEntityNoDiscriminatorColumnMapping.dcm.xml new file mode 100644 index 000000000..3e03f4498 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.ORM.Mapping.SingleTableEntityNoDiscriminatorColumnMapping.dcm.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.SingleTableEntityIncompleteDiscriminatorColumnMapping.dcm.yml b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.SingleTableEntityIncompleteDiscriminatorColumnMapping.dcm.yml new file mode 100644 index 000000000..8c71ef709 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.SingleTableEntityIncompleteDiscriminatorColumnMapping.dcm.yml @@ -0,0 +1,12 @@ +Doctrine\Tests\ORM\Mapping\SingleTableEntityIncompleteDiscriminatorColumnMapping: + type: entity + inheritanceType: SINGLE_TABLE + discriminatorMap: + ONE: SingleTableEntityIncompleteDiscriminatorColumnMappingSub1 + TWO: SingleTableEntityIncompleteDiscriminatorColumnMappingSub2 + discriminatorColumn: + name: dtype + id: + id: + generator: + strategy: NONE \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.SingleTableEntityNoDiscriminatorColumnMapping.dcm.yml b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.SingleTableEntityNoDiscriminatorColumnMapping.dcm.yml new file mode 100644 index 000000000..5cab520d1 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.ORM.Mapping.SingleTableEntityNoDiscriminatorColumnMapping.dcm.yml @@ -0,0 +1,10 @@ +Doctrine\Tests\ORM\Mapping\SingleTableEntityNoDiscriminatorColumnMapping: + type: entity + inheritanceType: SINGLE_TABLE + discriminatorMap: + ONE: SingleTableEntityNoDiscriminatorColumnMappingSub1 + TWO: SingleTableEntityNoDiscriminatorColumnMappingSub2 + id: + id: + generator: + strategy: NONE \ No newline at end of file From 6963fd8f2048d0846839a26168aca703c31443e2 Mon Sep 17 00:00:00 2001 From: Bill Schaller Date: Tue, 5 Jan 2016 12:30:29 -0500 Subject: [PATCH 2/3] Update docs for @DiscriminatorColumn to indicate that it is optional. --- docs/en/reference/annotations-reference.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/en/reference/annotations-reference.rst b/docs/en/reference/annotations-reference.rst index 03a6d4454..5979939ea 100644 --- a/docs/en/reference/annotations-reference.rst +++ b/docs/en/reference/annotations-reference.rst @@ -236,11 +236,14 @@ Example: @DiscriminatorColumn ~~~~~~~~~~~~~~~~~~~~~ -This annotation is a required annotation for the topmost/super +This annotation is an optional annotation for the topmost/super class of an inheritance hierarchy. It specifies the details of the column which saves the name of the class, which the entity is actually instantiated as. +If this annotation is not specified, the discriminator column defaults +to a string column of length 255 called ``dtype``. + Required attributes: From 8bde0c8a900a4be0b38bfd0c405d2115425015d7 Mon Sep 17 00:00:00 2001 From: Bill Schaller Date: Tue, 5 Jan 2016 12:32:25 -0500 Subject: [PATCH 3/3] Fix AnnotationDriver, XmlDriver, YamlDriver to properly set DiscriminatorColumn defaults for type and length. Note: Even though the column definition generated for a discriminator column would eventually default the type to string and length to 255, the docs specify defaults that should be reflected explicitly in the discriminatorColumn mapping. --- lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php | 4 ++-- lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php | 4 ++-- lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php b/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php index 1f8599657..9dd64bbd3 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php @@ -242,8 +242,8 @@ class AnnotationDriver extends AbstractAnnotationDriver $metadata->setDiscriminatorColumn(array( 'name' => $discrColumnAnnot->name, - 'type' => $discrColumnAnnot->type, - 'length' => $discrColumnAnnot->length, + 'type' => $discrColumnAnnot->type ?: 'string', + 'length' => $discrColumnAnnot->length ?: 255, 'columnDefinition' => $discrColumnAnnot->columnDefinition, )); } else { diff --git a/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php b/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php index da090daa4..00de4f2ea 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php @@ -165,8 +165,8 @@ class XmlDriver extends FileDriver $discrColumn = $xmlRoot->{'discriminator-column'}; $metadata->setDiscriminatorColumn(array( 'name' => isset($discrColumn['name']) ? (string) $discrColumn['name'] : null, - 'type' => isset($discrColumn['type']) ? (string) $discrColumn['type'] : null, - 'length' => isset($discrColumn['length']) ? (string) $discrColumn['length'] : null, + 'type' => isset($discrColumn['type']) ? (string) $discrColumn['type'] : 'string', + 'length' => isset($discrColumn['length']) ? (string) $discrColumn['length'] : 255, 'columnDefinition' => isset($discrColumn['column-definition']) ? (string) $discrColumn['column-definition'] : null )); } else { diff --git a/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php b/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php index 1dee969d7..fe406785f 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php @@ -176,8 +176,8 @@ class YamlDriver extends FileDriver $discrColumn = $element['discriminatorColumn']; $metadata->setDiscriminatorColumn(array( 'name' => isset($discrColumn['name']) ? (string) $discrColumn['name'] : null, - 'type' => isset($discrColumn['type']) ? (string) $discrColumn['type'] : null, - 'length' => isset($discrColumn['length']) ? (string) $discrColumn['length'] : null, + 'type' => isset($discrColumn['type']) ? (string) $discrColumn['type'] : 'string', + 'length' => isset($discrColumn['length']) ? (string) $discrColumn['length'] : 255, 'columnDefinition' => isset($discrColumn['columnDefinition']) ? (string) $discrColumn['columnDefinition'] : null )); } else {