From 54b3c0548d952f2966e8197986002e01b3b32f96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Perrin?= Date: Tue, 17 Dec 2013 18:56:13 +0100 Subject: [PATCH 01/27] Fix persistence exception on a table with a schema on a platform without schema support --- .../ORM/Mapping/ClassMetadataFactory.php | 14 +- .../ORM/Mapping/ClassMetadataInfo.php | 58 +++++++ .../ORM/Mapping/DefaultQuoteStrategy.php | 18 +- .../ORM/Mapping/Driver/AnnotationDriver.php | 13 +- lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php | 24 ++- .../ORM/Mapping/Driver/YamlDriver.php | 23 ++- .../ORM/Functional/Ticket/DDC2825Test.php | 157 ++++++++++++++++++ 7 files changed, 284 insertions(+), 23 deletions(-) create mode 100644 tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php index dd65c3932..976847f33 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php @@ -576,9 +576,11 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory // Platforms that do not have native IDENTITY support need a sequence to emulate this behaviour. if ($this->targetPlatform->usesSequenceEmulatedIdentityColumns()) { - $columnName = $class->getSingleIdentifierColumnName(); - $quoted = isset($class->fieldMappings[$fieldName]['quoted']) || isset($class->table['quoted']); - $sequenceName = $this->targetPlatform->getIdentitySequenceName($class->getTableName(), $columnName); + $columnName = $class->getSingleIdentifierColumnName(); + $quoted = isset($class->fieldMappings[$fieldName]['quoted']) || isset($class->table['quoted']); + $sequencePrefix = $class->getSequencePrefix($this->targetPlatform); + + $sequenceName = $this->targetPlatform->getIdentitySequenceName($sequencePrefix, $columnName); $definition = array( 'sequenceName' => $this->targetPlatform->fixSchemaElementName($sequenceName) ); @@ -608,10 +610,10 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory if ( ! $definition) { $fieldName = $class->getSingleIdentifierFieldName(); - $columnName = $class->getSingleIdentifierColumnName(); + $sequenceName = $class->getSequenceName($this->targetPlatform); $quoted = isset($class->fieldMappings[$fieldName]['quoted']) || isset($class->table['quoted']); - $sequenceName = $class->getTableName() . '_' . $columnName . '_seq'; - $definition = array( + + $definition = array( 'sequenceName' => $this->targetPlatform->fixSchemaElementName($sequenceName), 'allocationSize' => 1, 'initialValue' => 1, diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php index 76dd8f1e6..dfaa40111 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php @@ -24,6 +24,7 @@ use Doctrine\Instantiator\Instantiator; use InvalidArgumentException; use RuntimeException; use Doctrine\DBAL\Types\Type; +use Doctrine\DBAL\Platforms\AbstractPlatform; use ReflectionClass; use Doctrine\Common\Persistence\Mapping\ClassMetadata; use Doctrine\Common\ClassLoader; @@ -2014,6 +2015,16 @@ class ClassMetadataInfo implements ClassMetadata return $this->table['name']; } + /** + * Gets primary table's schema name. + * + * @return string|null + */ + public function getSchemaName() + { + return isset($this->table['schema']) ? $this->table['schema'] : null; + } + /** * Gets the table name to use for temporary identifier tables of this class. * @@ -2243,6 +2254,10 @@ class ClassMetadataInfo implements ClassMetadata $this->table['name'] = $table['name']; } + if (isset($table['schema'])) { + $this->table['schema'] = $table['schema']; + } + if (isset($table['indexes'])) { $this->table['indexes'] = $table['indexes']; } @@ -3240,4 +3255,47 @@ class ClassMetadataInfo implements ClassMetadata throw MappingException::duplicateFieldMapping($this->name, $fieldName); } } + + /** + * Gets the sequence name based on class metadata. + * + * @param AbstractPlatform $platform + * @return string + * + * @todo Sequence names should be computed in DBAL depending on the platform + */ + public function getSequenceName(AbstractPlatform $platform) + { + $sequencePrefix = $this->getSequencePrefix($platform); + + $columnName = $this->getSingleIdentifierColumnName(); + $sequenceName = $sequencePrefix . '_' . $columnName . '_seq'; + + return $sequenceName; + } + + /** + * Gets the sequence name prefix based on class metadata. + * + * @param AbstractPlatform $platform + * @return string + * + * @todo Sequence names should be computed in DBAL depending on the platform + */ + public function getSequencePrefix(AbstractPlatform $platform) + { + $tableName = $this->getTableName(); + $sequencePrefix = $tableName; + + // Prepend the schema name to the table name if there is one + if ($schemaName = $this->getSchemaName()) { + $sequencePrefix = $schemaName . '.' . $tableName; + + if ( ! $platform->supportsSchemas() && $platform->canEmulateSchemas()) { + $sequencePrefix = $schemaName . '__' . $tableName; + } + } + + return $sequencePrefix; + } } diff --git a/lib/Doctrine/ORM/Mapping/DefaultQuoteStrategy.php b/lib/Doctrine/ORM/Mapping/DefaultQuoteStrategy.php index eb2d22332..eb5b85065 100644 --- a/lib/Doctrine/ORM/Mapping/DefaultQuoteStrategy.php +++ b/lib/Doctrine/ORM/Mapping/DefaultQuoteStrategy.php @@ -41,12 +41,24 @@ class DefaultQuoteStrategy implements QuoteStrategy /** * {@inheritdoc} + * + * @todo Table names should be computed in DBAL depending on the platform */ public function getTableName(ClassMetadata $class, AbstractPlatform $platform) { - return isset($class->table['quoted']) - ? $platform->quoteIdentifier($class->table['name']) - : $class->table['name']; + $tableName = $class->table['name']; + + if ( ! empty($class->table['schema'])) { + $tableName = $class->table['schema'] . '.' . $class->table['name']; + + if ( ! $platform->supportsSchemas() && $platform->canEmulateSchemas()) { + $tableName = $class->table['schema'] . '__' . $class->table['name']; + } + } + + return isset($class->table['quoted']) + ? $platform->quoteIdentifier($tableName) + : $tableName; } /** diff --git a/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php b/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php index 85f40b2f5..774e45651 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php @@ -94,9 +94,18 @@ class AnnotationDriver extends AbstractAnnotationDriver // Evaluate Table annotation if (isset($classAnnotations['Doctrine\ORM\Mapping\Table'])) { $tableAnnot = $classAnnotations['Doctrine\ORM\Mapping\Table']; + + $tableName = $tableAnnot->name; + $schemaName = $tableAnnot->schema; + + // Split schema and table name from a table name like "myschema.mytable" + if (strpos($tableName, '.') !== false) { + list($schemaName, $tableName) = explode('.', $tableName); + } + $primaryTable = array( - 'name' => $tableAnnot->name, - 'schema' => $tableAnnot->schema + 'name' => $tableName, + 'schema' => $schemaName ); if ($tableAnnot->indexes !== null) { diff --git a/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php b/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php index 2797fb126..658d9e53e 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php @@ -77,8 +77,25 @@ class XmlDriver extends FileDriver // Evaluate attributes $table = array(); + + $tableName = null; + $schemaName = null; + if (isset($xmlRoot['table'])) { - $table['name'] = (string)$xmlRoot['table']; + $tableName = (string)$xmlRoot['table']; + + // Split schema and table name from a table name like "myschema.mytable" + if (strpos($tableName, '.') !== false) { + list($schemaName, $tableName) = explode('.', $tableName); + } + } + + if (isset($xmlRoot['schema'])) { + $schemaName = (string)$xmlRoot['schema']; + } + + if (null !== $tableName) { + $table['name'] = $tableName; } $metadata->setPrimaryTable($table); @@ -150,11 +167,6 @@ class XmlDriver extends FileDriver } } - /* not implemented specially anyway. use table = schema.table - if (isset($xmlRoot['schema'])) { - $metadata->table['schema'] = (string)$xmlRoot['schema']; - }*/ - if (isset($xmlRoot['inheritance-type'])) { $inheritanceType = (string)$xmlRoot['inheritance-type']; $metadata->setInheritanceType(constant('Doctrine\ORM\Mapping\ClassMetadata::INHERITANCE_TYPE_' . $inheritanceType)); diff --git a/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php b/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php index cf1dc5bc0..be1cd2ed0 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php @@ -75,8 +75,24 @@ class YamlDriver extends FileDriver // Evaluate root level properties $table = array(); + $tableName = null; + $schemaName = null; + if (isset($element['table'])) { - $table['name'] = $element['table']; + $tableName = $element['table']; + + // Split schema and table name from a table name like "myschema.mytable" + if (strpos($tableName, '.') !== false) { + list($schemaName, $tableName) = explode('.', $tableName); + } + } + + if (isset($element['schema'])) { + $schemaName = $element['schema']; + } + + if (null !== $tableName) { + $table['name'] = $tableName; } // Evaluate second level cache @@ -163,11 +179,6 @@ class YamlDriver extends FileDriver } } - /* not implemented specially anyway. use table = schema.table - if (isset($element['schema'])) { - $metadata->table['schema'] = $element['schema']; - }*/ - if (isset($element['inheritanceType'])) { $metadata->setInheritanceType(constant('Doctrine\ORM\Mapping\ClassMetadata::INHERITANCE_TYPE_' . strtoupper($element['inheritanceType']))); diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php new file mode 100644 index 000000000..93628a5a4 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php @@ -0,0 +1,157 @@ +_em->getConnection()->getDatabasePlatform(); + + if ( ! $platform->supportsSchemas() && ! $platform->canEmulateSchemas()) { + $this->markTestSkipped("This test is only useful for databases that support schemas or can emulate them."); + } + + $this->_schemaTool->createSchema(array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaMyTable'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaMyTable2'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaOrder'), + )); + } + + public function testIssue() + { + // Test with a table with a schema + $myEntity = new DDC2825MySchemaMyTable(); + + $this->_em->persist($myEntity); + $this->_em->flush(); + $this->_em->clear(); + + $entities = $this->_em->createQuery('SELECT mt FROM ' . __NAMESPACE__ . '\\DDC2825MySchemaMyTable mt')->execute(); + $this->assertEquals(count($entities), 1); + + $classMetadata = $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaMyTable'); + $this->checkClassMetadata($classMetadata, 'myschema', 'mytable'); + + // Test with schema defined directly as a table annotation property + $myEntity2 = new DDC2825MySchemaMyTable2(); + + $this->_em->persist($myEntity2); + $this->_em->flush(); + $this->_em->clear(); + + $entities = $this->_em->createQuery('SELECT mt2 FROM ' . __NAMESPACE__ . '\\DDC2825MySchemaMyTable2 mt2')->execute(); + $this->assertEquals(count($entities), 1); + + $classMetadata = $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaMyTable2'); + $this->checkClassMetadata($classMetadata, 'myschema', 'mytable2'); + + // Test with a table named "order" (which is a reserved keyword) to make sure the table name is not + // incorrectly escaped when a schema is used and that the platform doesn't support schemas + $order = new DDC2825MySchemaOrder(); + + $this->_em->persist($order); + $this->_em->flush(); + $this->_em->clear(); + + $classMetadata = $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaOrder'); + $this->checkClassMetadata($classMetadata, 'myschema', 'order'); + + $entities = $this->_em->createQuery('SELECT mso FROM ' . __NAMESPACE__ . '\\DDC2825MySchemaOrder mso')->execute(); + $this->assertEquals(count($entities), 1); + } + + /** + * Checks that class metadata is correctly stored when a database schema is used and + * checks that the table name is correctly converted whether the platform supports database + * schemas or not + * + * @param ClassMetadata $classMetadata Class metadata + * @param string $expectedSchemaName Expected schema name + * @param string $expectedTableName Expected table name + */ + protected function checkClassMetadata($classMetadata, $expectedSchemaName, $expectedTableName) + { + $quoteStrategy = $this->_em->getConfiguration()->getQuoteStrategy(); + $platform = $this->_em->getConnection()->getDatabasePlatform(); + $quotedTableName = $quoteStrategy->getTableName($classMetadata, $platform); + + // Check if table name and schema properties are defined in the class metadata + $this->assertEquals($classMetadata->table['name'], $expectedTableName); + $this->assertEquals($classMetadata->table['schema'], $expectedSchemaName); + + if ($this->_em->getConnection()->getDatabasePlatform()->supportsSchemas()) { + $fullTableName = sprintf('%s.%s', $expectedSchemaName, $expectedTableName); + } else { + $fullTableName = sprintf('%s__%s', $expectedSchemaName, $expectedTableName); + } + + $this->assertEquals($quotedTableName, $fullTableName); + + // Checks sequence name validity + $expectedSchemaName = $fullTableName . '_' . $classMetadata->getSingleIdentifierColumnName() . '_seq'; + $this->assertEquals($expectedSchemaName, $classMetadata->getSequenceName($platform)); + } +} + +/** + * @Entity + * @Table(name="myschema.mytable") + */ +class DDC2825MySchemaMyTable +{ + /** + * Test with a quoted column name to check that sequence names are + * correctly handled + * + * @Id @GeneratedValue + * @Column(name="`number`", type="integer") + * + * @var integer + */ + public $id; +} + +/** + * @Entity + * @Table(name="mytable2",schema="myschema") + */ +class DDC2825MySchemaMyTable2 +{ + /** + * @Id @GeneratedValue + * @Column(type="integer") + * + * @var integer + */ + public $id; +} + + +/** + * @Entity + * @Table(name="myschema.order") + */ +class DDC2825MySchemaOrder +{ + /** + * @Id @GeneratedValue + * @Column(type="integer") + * + * @var integer + */ + public $id; +} From 0dbc6a12eea8b42c670965361e43a1702e8d4217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Perrin?= Date: Wed, 15 Jan 2014 12:22:59 +0100 Subject: [PATCH 02/27] Update mapping documentation for schema support Updated documentation: * Annotations * XML * Yaml * PHP --- docs/en/reference/annotations-reference.rst | 2 ++ docs/en/reference/php-mapping.rst | 1 + docs/en/reference/xml-mapping.rst | 3 ++- docs/en/reference/yaml-mapping.rst | 1 + 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/en/reference/annotations-reference.rst b/docs/en/reference/annotations-reference.rst index 27271f491..123fb3b2d 100644 --- a/docs/en/reference/annotations-reference.rst +++ b/docs/en/reference/annotations-reference.rst @@ -1129,6 +1129,7 @@ Optional attributes: - **indexes**: Array of @Index annotations - **uniqueConstraints**: Array of @UniqueConstraint annotations. +- **schema**: (>= 2.5) Name of the schema the table lies in. Example: @@ -1140,6 +1141,7 @@ Example: * @Table(name="user", * uniqueConstraints={@UniqueConstraint(name="user_unique",columns={"username"})}, * indexes={@Index(name="user_idx", columns={"email"})} + * schema="schema_name" * ) */ class User { } diff --git a/docs/en/reference/php-mapping.rst b/docs/en/reference/php-mapping.rst index d7734ea12..78a721411 100644 --- a/docs/en/reference/php-mapping.rst +++ b/docs/en/reference/php-mapping.rst @@ -241,6 +241,7 @@ General Getters - ``getTableName()`` +- ``getSchemaName()`` - ``getTemporaryIdTableName()`` Identifier Getters diff --git a/docs/en/reference/xml-mapping.rst b/docs/en/reference/xml-mapping.rst index 6793b22f6..93e531aa6 100644 --- a/docs/en/reference/xml-mapping.rst +++ b/docs/en/reference/xml-mapping.rst @@ -187,7 +187,7 @@ specified as the ```` element as a direct child of the .. code-block:: xml - + @@ -211,6 +211,7 @@ Optional attributes: - **read-only** - (>= 2.1) Specifies that this entity is marked as read only and not considered for change-tracking. Entities of this type can be persisted and removed though. +- **schema** - (>= 2.5) The schema the table lies in, for platforms that support schemas Defining Fields ~~~~~~~~~~~~~~~ diff --git a/docs/en/reference/yaml-mapping.rst b/docs/en/reference/yaml-mapping.rst index 1f2e31d34..ea54e277a 100644 --- a/docs/en/reference/yaml-mapping.rst +++ b/docs/en/reference/yaml-mapping.rst @@ -74,6 +74,7 @@ of several common elements: type: entity repositoryClass: Doctrine\Tests\ORM\Mapping\UserRepository table: cms_users + schema: schema_name # The schema the table lies in, for platforms that support schemas (Optional, >= 2.5) readOnly: true indexes: name_index: From c6d839869b36c5370a7ed54ee9aa832841ebefb7 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 16:30:20 +0100 Subject: [PATCH 03/27] #881 DDC-2825 - annotation mapping tests for explicitly defined schema name on mappings --- .../Models/DDC2825/ExplicitSchemaAndTable.php | 17 +++++++++++++++++ .../Tests/ORM/Mapping/AnnotationDriverTest.php | 14 ++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 tests/Doctrine/Tests/Models/DDC2825/ExplicitSchemaAndTable.php diff --git a/tests/Doctrine/Tests/Models/DDC2825/ExplicitSchemaAndTable.php b/tests/Doctrine/Tests/Models/DDC2825/ExplicitSchemaAndTable.php new file mode 100644 index 000000000..73c83b416 --- /dev/null +++ b/tests/Doctrine/Tests/Models/DDC2825/ExplicitSchemaAndTable.php @@ -0,0 +1,17 @@ +assertArrayHasKey('example_trait_bar_id', $metadataWithoutOverride->associationMappings['bar']['joinColumnFieldNames']); $this->assertArrayHasKey('example_entity_overridden_bar_id', $metadataWithOverride->associationMappings['bar']['joinColumnFieldNames']); } + + /** + * @group DDC-2825 + * @group 881 + */ + public function testSchemaDefinitionViaExplicitTableSchemaAnnotationProperty() + { + /* @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */ + $metadata = $this->createClassMetadataFactory()->getMetadataFor(ExplicitSchemaAndTable::CLASSNAME); + + $this->assertSame('myschema', $metadata->getSchemaName()); + $this->assertSame('mytable', $metadata->getTableName()); + } } /** From 8b2b54c033d4e3fdebf557b4cb9e57f4ff8f40b6 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 16:32:02 +0100 Subject: [PATCH 04/27] #881 DDC-2825 - typo fix (causing test failure) --- tests/Doctrine/Tests/Models/DDC2825/ExplicitSchemaAndTable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Doctrine/Tests/Models/DDC2825/ExplicitSchemaAndTable.php b/tests/Doctrine/Tests/Models/DDC2825/ExplicitSchemaAndTable.php index 73c83b416..fea220c1b 100644 --- a/tests/Doctrine/Tests/Models/DDC2825/ExplicitSchemaAndTable.php +++ b/tests/Doctrine/Tests/Models/DDC2825/ExplicitSchemaAndTable.php @@ -4,7 +4,7 @@ namespace Doctrine\Tests\Models\DDC2825; /** * @Entity - * @Table(name="mytable2", schema="myschema") + * @Table(name="mytable", schema="myschema") */ class ExplicitSchemaAndTable { From cf641cd0a3d5d494bde67a2360c0a7dac9d08cd9 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 16:47:05 +0100 Subject: [PATCH 05/27] #881 DDC-2825 - testing annotation driver with table name defining schema name as part of the name --- .../DDC2825/SchemaAndTableInTableName.php | 20 +++++++++++++++++++ .../ORM/Mapping/AnnotationDriverTest.php | 14 +++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 tests/Doctrine/Tests/Models/DDC2825/SchemaAndTableInTableName.php diff --git a/tests/Doctrine/Tests/Models/DDC2825/SchemaAndTableInTableName.php b/tests/Doctrine/Tests/Models/DDC2825/SchemaAndTableInTableName.php new file mode 100644 index 000000000..e049befac --- /dev/null +++ b/tests/Doctrine/Tests/Models/DDC2825/SchemaAndTableInTableName.php @@ -0,0 +1,20 @@ +assertSame('myschema', $metadata->getSchemaName()); $this->assertSame('mytable', $metadata->getTableName()); } + + /** + * @group DDC-2825 + * @group 881 + */ + public function testSchemaDefinitionViaSchemaDefinedInTableNameInTableAnnotationProperty() + { + /* @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */ + $metadata = $this->createClassMetadataFactory()->getMetadataFor(SchemaAndTableInTableName::CLASSNAME); + + $this->assertSame('myschema', $metadata->getSchemaName()); + $this->assertSame('mytable', $metadata->getTableName()); + } } /** From 617fd6cfdcb6774396f55322cc0e65a87f056ca4 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 16:59:01 +0100 Subject: [PATCH 06/27] #881 DDC-2825 - moving YAML and XML mapping tests to base mapping driver tests. Excluding Static PHP mapping tests --- .../ORM/Mapping/AbstractMappingDriverTest.php | 28 +++++++++++++++++++ .../ORM/Mapping/AnnotationDriverTest.php | 26 ----------------- .../Mapping/StaticPHPMappingDriverTest.php | 22 +++++++++++++-- 3 files changed, 47 insertions(+), 29 deletions(-) diff --git a/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php b/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php index b81b3ba1e..871f0c153 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php @@ -9,6 +9,8 @@ use Doctrine\Tests\Models\Company\CompanyFlexContract; use Doctrine\Tests\Models\Cache\City; use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Mapping\ClassMetadataInfo; +use Doctrine\Tests\Models\DDC2825\ExplicitSchemaAndTable; +use Doctrine\Tests\Models\DDC2825\SchemaAndTableInTableName; abstract class AbstractMappingDriverTest extends \Doctrine\Tests\OrmTestCase { @@ -932,6 +934,32 @@ abstract class AbstractMappingDriverTest extends \Doctrine\Tests\OrmTestCase $this->assertEquals(ClassMetadata::CACHE_USAGE_READ_ONLY, $class->associationMappings['attractions']['cache']['usage']); $this->assertEquals('doctrine_tests_models_cache_city__attractions', $class->associationMappings['attractions']['cache']['region']); } + + /** + * @group DDC-2825 + * @group 881 + */ + public function testSchemaDefinitionViaExplicitTableSchemaAnnotationProperty() + { + /* @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */ + $metadata = $this->createClassMetadataFactory()->getMetadataFor(ExplicitSchemaAndTable::CLASSNAME); + + $this->assertSame('myschema', $metadata->getSchemaName()); + $this->assertSame('mytable', $metadata->getTableName()); + } + + /** + * @group DDC-2825 + * @group 881 + */ + public function testSchemaDefinitionViaSchemaDefinedInTableNameInTableAnnotationProperty() + { + /* @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */ + $metadata = $this->createClassMetadataFactory()->getMetadataFor(SchemaAndTableInTableName::CLASSNAME); + + $this->assertSame('myschema', $metadata->getSchemaName()); + $this->assertSame('mytable', $metadata->getTableName()); + } } /** diff --git a/tests/Doctrine/Tests/ORM/Mapping/AnnotationDriverTest.php b/tests/Doctrine/Tests/ORM/Mapping/AnnotationDriverTest.php index 0da59e929..27dda1981 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/AnnotationDriverTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/AnnotationDriverTest.php @@ -232,32 +232,6 @@ class AnnotationDriverTest extends AbstractMappingDriverTest $this->assertArrayHasKey('example_trait_bar_id', $metadataWithoutOverride->associationMappings['bar']['joinColumnFieldNames']); $this->assertArrayHasKey('example_entity_overridden_bar_id', $metadataWithOverride->associationMappings['bar']['joinColumnFieldNames']); } - - /** - * @group DDC-2825 - * @group 881 - */ - public function testSchemaDefinitionViaExplicitTableSchemaAnnotationProperty() - { - /* @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */ - $metadata = $this->createClassMetadataFactory()->getMetadataFor(ExplicitSchemaAndTable::CLASSNAME); - - $this->assertSame('myschema', $metadata->getSchemaName()); - $this->assertSame('mytable', $metadata->getTableName()); - } - - /** - * @group DDC-2825 - * @group 881 - */ - public function testSchemaDefinitionViaSchemaDefinedInTableNameInTableAnnotationProperty() - { - /* @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */ - $metadata = $this->createClassMetadataFactory()->getMetadataFor(SchemaAndTableInTableName::CLASSNAME); - - $this->assertSame('myschema', $metadata->getSchemaName()); - $this->assertSame('mytable', $metadata->getTableName()); - } } /** diff --git a/tests/Doctrine/Tests/ORM/Mapping/StaticPHPMappingDriverTest.php b/tests/Doctrine/Tests/ORM/Mapping/StaticPHPMappingDriverTest.php index e82be422c..598a42ce8 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/StaticPHPMappingDriverTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/StaticPHPMappingDriverTest.php @@ -2,9 +2,7 @@ namespace Doctrine\Tests\ORM\Mapping; -use Doctrine\ORM\Mapping\ClassMetadata, - Doctrine\Common\Persistence\Mapping\Driver\StaticPHPDriver, - Doctrine\ORM\Tools\Export\ClassMetadataExporter; +use Doctrine\Common\Persistence\Mapping\Driver\StaticPHPDriver; class StaticPHPMappingDriverTest extends AbstractMappingDriverTest { @@ -23,4 +21,22 @@ class StaticPHPMappingDriverTest extends AbstractMappingDriverTest { $this->createClassMetadata('Doctrine\Tests\Models\DDC889\DDC889Class'); } + + /** + * @group DDC-2825 + * @group 881 + */ + public function testSchemaDefinitionViaExplicitTableSchemaAnnotationProperty() + { + $this->markTestIncomplete(); + } + + /** + * @group DDC-2825 + * @group 881 + */ + public function testSchemaDefinitionViaSchemaDefinedInTableNameInTableAnnotationProperty() + { + $this->markTestIncomplete(); + } } From 941bfca68c423b768bbbb3d00f830405d7cc1ae0 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 17:27:53 +0100 Subject: [PATCH 07/27] #881 DDC-2825 - providing XML mappings for explicit schema definition --- ...ts.Models.DDC2825.ExplicitSchemaAndTable.dcm.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.xml diff --git a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.xml b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.xml new file mode 100644 index 000000000..938380072 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.xml @@ -0,0 +1,13 @@ + + + + + + + + From 3820fa57d38f103925724e13589b5feed89fb0a5 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 17:33:17 +0100 Subject: [PATCH 08/27] #881 DDC-2825 - XML mappings should handle explicitly defined schema name --- lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php b/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php index 658d9e53e..29e1088ed 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php @@ -86,12 +86,12 @@ class XmlDriver extends FileDriver // Split schema and table name from a table name like "myschema.mytable" if (strpos($tableName, '.') !== false) { - list($schemaName, $tableName) = explode('.', $tableName); + list($metadata->table['schema'], $tableName) = explode('.', $tableName); } } if (isset($xmlRoot['schema'])) { - $schemaName = (string)$xmlRoot['schema']; + $metadata->table['schema'] = (string) $xmlRoot['schema']; } if (null !== $tableName) { From 53845b79e1d20a370f18c17907dd7671497ce5bd Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 17:34:44 +0100 Subject: [PATCH 09/27] #881 DDC-2825 - providing XML mappings for implicit schema definition --- ...Models.DDC2825.SchemaAndTableInTableName.dcm.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.xml diff --git a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.xml b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.xml new file mode 100644 index 000000000..0f6be73f0 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.xml @@ -0,0 +1,13 @@ + + + + + + + + From d96cd1b690b8b63a3ca6f8659d9171dbd564b696 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 17:52:51 +0100 Subject: [PATCH 10/27] #881 DDC-2825 - providing PHP mappings for explicit schema definition --- ...ts.Models.DDC2825.ExplicitSchemaAndTable.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.php diff --git a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.php b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.php new file mode 100644 index 000000000..27f555944 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.php @@ -0,0 +1,17 @@ +setPrimaryTable(array( + 'name' => 'mytable', + 'schema' => 'myschema', +)); + +$metadata->mapField(array( + 'id' => true, + 'fieldName' => 'id', +)); + +$metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_AUTO); From 0fd51cf85225dccf98423b706157a0e088ad2cce Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 17:53:01 +0100 Subject: [PATCH 11/27] #881 DDC-2825 - providing PHP mappings for implicit schema definition --- ....Models.DDC2825.SchemaAndTableInTableName.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.php diff --git a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.php b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.php new file mode 100644 index 000000000..75ca602b5 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.php @@ -0,0 +1,16 @@ +setPrimaryTable(array( + 'name' => 'myschema.mytable', +)); + +$metadata->mapField(array( + 'id' => true, + 'fieldName' => 'id', +)); + +$metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_AUTO); From 51bf82b7e75e677916faf08fa1afa19590e35f93 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 17:54:00 +0100 Subject: [PATCH 12/27] #881 DDC-2825 - correcting PHP mapping behavior when using implicit schema in table name --- lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php index dfaa40111..8d482e84d 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php @@ -2246,6 +2246,11 @@ class ClassMetadataInfo implements ClassMetadata public function setPrimaryTable(array $table) { if (isset($table['name'])) { + // Split schema and table name from a table name like "myschema.mytable" + if (strpos($table['name'], '.') !== false) { + list($this->table['schema'], $table['name']) = explode('.', $table['name'], 2); + } + if ($table['name'][0] === '`') { $table['name'] = trim($table['name'], '`'); $this->table['quoted'] = true; From 7911beaf1c22e02356e4089d2467d95de8e0d1c2 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 18:05:38 +0100 Subject: [PATCH 13/27] #881 DDC-2825 - providing YAML mappings for implicit schema definition --- ....Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.yml diff --git a/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.yml b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.yml new file mode 100644 index 000000000..a63173daa --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.yml @@ -0,0 +1,7 @@ +Doctrine\Tests\Models\DDC2825\SchemaAndTableInTableName: + type: entity + table: myschema.mytable + id: + id: + generator: + strategy: AUTO From 04467218a3976d656a32550f4779d2c2a66bb91e Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 18:05:58 +0100 Subject: [PATCH 14/27] #881 DDC-2825 - providing YAML mappings for explicit schema definition --- ...ne.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.yml diff --git a/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.yml b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.yml new file mode 100644 index 000000000..7675a6e5d --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.yml @@ -0,0 +1,8 @@ +Doctrine\Tests\Models\DDC2825\ExplicitSchemaAndTable: + type: entity + table: mytable + schema: myschema + id: + id: + generator: + strategy: AUTO From eefa3b2e53fe694cc2638ac1a2c4bddb2899eb2a Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 18:06:29 +0100 Subject: [PATCH 15/27] #881 DDC-2825 - correcting YAML driver implementation (wasn't using extracted schema) --- lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php b/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php index be1cd2ed0..ffeee6df6 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php @@ -83,12 +83,12 @@ class YamlDriver extends FileDriver // Split schema and table name from a table name like "myschema.mytable" if (strpos($tableName, '.') !== false) { - list($schemaName, $tableName) = explode('.', $tableName); + list($table['schema'], $tableName) = explode('.', $tableName, 2); } } if (isset($element['schema'])) { - $schemaName = $element['schema']; + $table['schema'] = $element['schema']; } if (null !== $tableName) { From f0102a69f933646dff25f5fdf17bd20263f49bfc Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 18:12:12 +0100 Subject: [PATCH 16/27] #881 DDC-2825 - refactoring mapping driver to use `ClassMetadata#setPrimaryTable()` instead of duplicating `explode()` logic --- .../ORM/Mapping/Driver/AnnotationDriver.php | 15 +++----------- lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php | 20 ++++--------------- .../ORM/Mapping/Driver/YamlDriver.php | 20 ++++--------------- 3 files changed, 11 insertions(+), 44 deletions(-) diff --git a/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php b/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php index 774e45651..df8b7b80c 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php @@ -93,19 +93,10 @@ class AnnotationDriver extends AbstractAnnotationDriver // Evaluate Table annotation if (isset($classAnnotations['Doctrine\ORM\Mapping\Table'])) { - $tableAnnot = $classAnnotations['Doctrine\ORM\Mapping\Table']; - - $tableName = $tableAnnot->name; - $schemaName = $tableAnnot->schema; - - // Split schema and table name from a table name like "myschema.mytable" - if (strpos($tableName, '.') !== false) { - list($schemaName, $tableName) = explode('.', $tableName); - } - + $tableAnnot = $classAnnotations['Doctrine\ORM\Mapping\Table']; $primaryTable = array( - 'name' => $tableName, - 'schema' => $schemaName + 'name' => $tableAnnot->name, + 'schema' => $tableAnnot->schema ); if ($tableAnnot->indexes !== null) { diff --git a/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php b/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php index 29e1088ed..c917eb245 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php @@ -76,29 +76,17 @@ class XmlDriver extends FileDriver } // Evaluate attributes - $table = array(); - - $tableName = null; - $schemaName = null; + $primaryTable = array(); if (isset($xmlRoot['table'])) { - $tableName = (string)$xmlRoot['table']; - - // Split schema and table name from a table name like "myschema.mytable" - if (strpos($tableName, '.') !== false) { - list($metadata->table['schema'], $tableName) = explode('.', $tableName); - } + $primaryTable['name'] = (string) $xmlRoot['table']; } if (isset($xmlRoot['schema'])) { - $metadata->table['schema'] = (string) $xmlRoot['schema']; + $primaryTable['schema'] = (string) $xmlRoot['schema']; } - if (null !== $tableName) { - $table['name'] = $tableName; - } - - $metadata->setPrimaryTable($table); + $metadata->setPrimaryTable($primaryTable); // Evaluate second level cache if (isset($xmlRoot->cache)) { diff --git a/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php b/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php index ffeee6df6..95d148318 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/YamlDriver.php @@ -73,26 +73,14 @@ class YamlDriver extends FileDriver } // Evaluate root level properties - $table = array(); - - $tableName = null; - $schemaName = null; + $primaryTable = array(); if (isset($element['table'])) { - $tableName = $element['table']; - - // Split schema and table name from a table name like "myschema.mytable" - if (strpos($tableName, '.') !== false) { - list($table['schema'], $tableName) = explode('.', $tableName, 2); - } + $primaryTable['name'] = $element['table']; } if (isset($element['schema'])) { - $table['schema'] = $element['schema']; - } - - if (null !== $tableName) { - $table['name'] = $tableName; + $primaryTable['schema'] = $element['schema']; } // Evaluate second level cache @@ -100,7 +88,7 @@ class YamlDriver extends FileDriver $metadata->enableCache($this->cacheToArray($element['cache'])); } - $metadata->setPrimaryTable($table); + $metadata->setPrimaryTable($primaryTable); // Evaluate named queries if (isset($element['namedQueries'])) { From 3ba968944848720a03598c70de2a811b477ea5ee Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 18:19:22 +0100 Subject: [PATCH 17/27] #881 DDC-2825 - aligning assignments --- lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php index 976847f33..cf0c6d9cd 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php @@ -576,12 +576,11 @@ class ClassMetadataFactory extends AbstractClassMetadataFactory // Platforms that do not have native IDENTITY support need a sequence to emulate this behaviour. if ($this->targetPlatform->usesSequenceEmulatedIdentityColumns()) { - $columnName = $class->getSingleIdentifierColumnName(); - $quoted = isset($class->fieldMappings[$fieldName]['quoted']) || isset($class->table['quoted']); - $sequencePrefix = $class->getSequencePrefix($this->targetPlatform); - - $sequenceName = $this->targetPlatform->getIdentitySequenceName($sequencePrefix, $columnName); - $definition = array( + $columnName = $class->getSingleIdentifierColumnName(); + $quoted = isset($class->fieldMappings[$fieldName]['quoted']) || isset($class->table['quoted']); + $sequencePrefix = $class->getSequencePrefix($this->targetPlatform); + $sequenceName = $this->targetPlatform->getIdentitySequenceName($sequencePrefix, $columnName); + $definition = array( 'sequenceName' => $this->targetPlatform->fixSchemaElementName($sequenceName) ); From 6f85ca33567e9b5b0516dd165c6282e518cfbbf9 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 18:31:11 +0100 Subject: [PATCH 18/27] #881 DDC-2825 - exploding test case into smaller units --- .../ORM/Functional/Ticket/DDC2825Test.php | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php index 93628a5a4..c3a07514a 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php @@ -2,7 +2,8 @@ namespace Doctrine\Tests\ORM\Functional\Ticket; -use Doctrine\ORM\Mapping\ClassMetadataFactory; +use Doctrine\ORM\Mapping\ClassMetadata; +use Doctrine\ORM\Tools\ToolsException; /** * This class makes tests on the correct use of a database schema when entities are stored @@ -24,14 +25,18 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase $this->markTestSkipped("This test is only useful for databases that support schemas or can emulate them."); } - $this->_schemaTool->createSchema(array( - $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaMyTable'), - $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaMyTable2'), - $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaOrder'), - )); + try { + $this->_schemaTool->createSchema(array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaMyTable'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaMyTable2'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaOrder'), + )); + } catch (ToolsException $e) { + // tables already exist + } } - public function testIssue() + public function testFetchingFromEntityWithExplicitlyDefinedSchemaInMappings() { // Test with a table with a schema $myEntity = new DDC2825MySchemaMyTable(); @@ -40,9 +45,14 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase $this->_em->flush(); $this->_em->clear(); - $entities = $this->_em->createQuery('SELECT mt FROM ' . __NAMESPACE__ . '\\DDC2825MySchemaMyTable mt')->execute(); - $this->assertEquals(count($entities), 1); + $this->assertCount( + 1, + $this->_em->createQuery('SELECT mt FROM ' . DDC2825MySchemaMyTable::CLASSNAME . ' mt')->getResult() + ); + } + public function testFetchingFromEntityWithImplicitlyDefinedSchemaInMappings() + { $classMetadata = $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaMyTable'); $this->checkClassMetadata($classMetadata, 'myschema', 'mytable'); @@ -83,7 +93,7 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase * @param string $expectedSchemaName Expected schema name * @param string $expectedTableName Expected table name */ - protected function checkClassMetadata($classMetadata, $expectedSchemaName, $expectedTableName) + protected function checkClassMetadata(ClassMetadata $classMetadata, $expectedSchemaName, $expectedTableName) { $quoteStrategy = $this->_em->getConfiguration()->getQuoteStrategy(); $platform = $this->_em->getConnection()->getDatabasePlatform(); @@ -113,6 +123,8 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase */ class DDC2825MySchemaMyTable { + const CLASSNAME = __CLASS__; + /** * Test with a quoted column name to check that sequence names are * correctly handled @@ -131,6 +143,8 @@ class DDC2825MySchemaMyTable */ class DDC2825MySchemaMyTable2 { + const CLASSNAME = __CLASS__; + /** * @Id @GeneratedValue * @Column(type="integer") @@ -147,6 +161,8 @@ class DDC2825MySchemaMyTable2 */ class DDC2825MySchemaOrder { + const CLASSNAME = __CLASS__; + /** * @Id @GeneratedValue * @Column(type="integer") From 0a91b83e276d3bf6344981079c03a37724d525fb Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 18:34:58 +0100 Subject: [PATCH 19/27] #881 DDC-2825 - exploding test case into smaller units --- .../Tests/ORM/Functional/Ticket/DDC2825Test.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php index c3a07514a..a55f38491 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php @@ -54,6 +54,7 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase public function testFetchingFromEntityWithImplicitlyDefinedSchemaInMappings() { $classMetadata = $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaMyTable'); + $this->checkClassMetadata($classMetadata, 'myschema', 'mytable'); // Test with schema defined directly as a table annotation property @@ -63,9 +64,14 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase $this->_em->flush(); $this->_em->clear(); - $entities = $this->_em->createQuery('SELECT mt2 FROM ' . __NAMESPACE__ . '\\DDC2825MySchemaMyTable2 mt2')->execute(); - $this->assertEquals(count($entities), 1); + $this->assertCount( + 1, + $this->_em->createQuery('SELECT mt2 FROM ' . DDC2825MySchemaMyTable2::CLASSNAME . ' mt2')->getResult() + ); + } + public function testFetchingFromEntityWithImplicitlyDefinedSchemaAndQuotedTableNameInMappings() + { $classMetadata = $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaMyTable2'); $this->checkClassMetadata($classMetadata, 'myschema', 'mytable2'); From 67788d89b52d61683797aadf38660963394be4d6 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 18:47:17 +0100 Subject: [PATCH 20/27] #881 DDC-2825 - simplifying/extracting test logic: moved verifying metadata into separate test method --- .../ORM/Functional/Ticket/DDC2825Test.php | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php index a55f38491..a403a0932 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php @@ -36,58 +36,57 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase } } + public function testMappingsContainCorrectlyDefinedOrEmulatedSchema() + { + $this->checkClassMetadata(DDC2825MySchemaMyTable::CLASSNAME, 'myschema', 'mytable'); + $this->checkClassMetadata(DDC2825MySchemaMyTable2::CLASSNAME, 'myschema', 'mytable2'); + $this->checkClassMetadata(DDC2825MySchemaOrder::CLASSNAME, 'myschema', 'order'); + } + + /** + * Test with a table with a schema + */ public function testFetchingFromEntityWithExplicitlyDefinedSchemaInMappings() { - // Test with a table with a schema - $myEntity = new DDC2825MySchemaMyTable(); - - $this->_em->persist($myEntity); + $this->_em->persist(new DDC2825MySchemaMyTable()); $this->_em->flush(); $this->_em->clear(); $this->assertCount( 1, - $this->_em->createQuery('SELECT mt FROM ' . DDC2825MySchemaMyTable::CLASSNAME . ' mt')->getResult() + $this->_em->createQuery('SELECT e FROM ' . DDC2825MySchemaMyTable::CLASSNAME . ' e')->getResult() ); } + /** + * Test with schema defined directly as a table annotation property + */ public function testFetchingFromEntityWithImplicitlyDefinedSchemaInMappings() { - $classMetadata = $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaMyTable'); - - $this->checkClassMetadata($classMetadata, 'myschema', 'mytable'); - - // Test with schema defined directly as a table annotation property - $myEntity2 = new DDC2825MySchemaMyTable2(); - - $this->_em->persist($myEntity2); + $this->_em->persist(new DDC2825MySchemaMyTable2()); $this->_em->flush(); $this->_em->clear(); $this->assertCount( 1, - $this->_em->createQuery('SELECT mt2 FROM ' . DDC2825MySchemaMyTable2::CLASSNAME . ' mt2')->getResult() + $this->_em->createQuery('SELECT e FROM ' . DDC2825MySchemaMyTable2::CLASSNAME . ' e')->getResult() ); } + /** + * Test with a table named "order" (which is a reserved keyword) to make sure the table name is not + * incorrectly escaped when a schema is used and that the platform doesn't support schemas + */ public function testFetchingFromEntityWithImplicitlyDefinedSchemaAndQuotedTableNameInMappings() { - $classMetadata = $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaMyTable2'); - $this->checkClassMetadata($classMetadata, 'myschema', 'mytable2'); - - // Test with a table named "order" (which is a reserved keyword) to make sure the table name is not - // incorrectly escaped when a schema is used and that the platform doesn't support schemas - $order = new DDC2825MySchemaOrder(); - - $this->_em->persist($order); + $this->_em->persist(new DDC2825MySchemaOrder()); $this->_em->flush(); $this->_em->clear(); - $classMetadata = $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaOrder'); - $this->checkClassMetadata($classMetadata, 'myschema', 'order'); - - $entities = $this->_em->createQuery('SELECT mso FROM ' . __NAMESPACE__ . '\\DDC2825MySchemaOrder mso')->execute(); - $this->assertEquals(count($entities), 1); + $this->assertCount( + 1, + $this->_em->createQuery('SELECT e FROM ' . DDC2825MySchemaOrder::CLASSNAME . ' e')->getResult() + ); } /** @@ -95,12 +94,13 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase * checks that the table name is correctly converted whether the platform supports database * schemas or not * - * @param ClassMetadata $classMetadata Class metadata + * @param string $className Class metadata * @param string $expectedSchemaName Expected schema name * @param string $expectedTableName Expected table name */ - protected function checkClassMetadata(ClassMetadata $classMetadata, $expectedSchemaName, $expectedTableName) + protected function checkClassMetadata($className, $expectedSchemaName, $expectedTableName) { + $classMetadata = $this->_em->getClassMetadata($className); $quoteStrategy = $this->_em->getConfiguration()->getQuoteStrategy(); $platform = $this->_em->getConnection()->getDatabasePlatform(); $quotedTableName = $quoteStrategy->getTableName($classMetadata, $platform); From 9d6890e6cad85f41d7d593394d0015a0b96eda7f Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 18:50:17 +0100 Subject: [PATCH 21/27] #881 DDC-2825 - expectations are the first parameter in an assertion --- .../Tests/ORM/Functional/Ticket/DDC2825Test.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php index a403a0932..e87329e9a 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php @@ -101,13 +101,12 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase protected function checkClassMetadata($className, $expectedSchemaName, $expectedTableName) { $classMetadata = $this->_em->getClassMetadata($className); - $quoteStrategy = $this->_em->getConfiguration()->getQuoteStrategy(); $platform = $this->_em->getConnection()->getDatabasePlatform(); - $quotedTableName = $quoteStrategy->getTableName($classMetadata, $platform); + $quotedTableName = $this->_em->getConfiguration()->getQuoteStrategy()->getTableName($classMetadata, $platform); // Check if table name and schema properties are defined in the class metadata - $this->assertEquals($classMetadata->table['name'], $expectedTableName); - $this->assertEquals($classMetadata->table['schema'], $expectedSchemaName); + $this->assertEquals($expectedTableName, $classMetadata->table['name']); + $this->assertEquals($expectedSchemaName, $classMetadata->table['schema']); if ($this->_em->getConnection()->getDatabasePlatform()->supportsSchemas()) { $fullTableName = sprintf('%s.%s', $expectedSchemaName, $expectedTableName); @@ -115,11 +114,13 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase $fullTableName = sprintf('%s__%s', $expectedSchemaName, $expectedTableName); } - $this->assertEquals($quotedTableName, $fullTableName); + $this->assertEquals($fullTableName, $quotedTableName); // Checks sequence name validity - $expectedSchemaName = $fullTableName . '_' . $classMetadata->getSingleIdentifierColumnName() . '_seq'; - $this->assertEquals($expectedSchemaName, $classMetadata->getSequenceName($platform)); + $this->assertEquals( + $fullTableName . '_' . $classMetadata->getSingleIdentifierColumnName() . '_seq', + $classMetadata->getSequenceName($platform) + ); } } From f874189456eddca35515edec68e3817aa0774d95 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 18:56:37 +0100 Subject: [PATCH 22/27] #881 DDC-2825 - refactoring tests for clarity/readability and ease of use --- .../ORM/Functional/Ticket/DDC2825Test.php | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php index e87329e9a..230833e48 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php @@ -38,9 +38,9 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase public function testMappingsContainCorrectlyDefinedOrEmulatedSchema() { - $this->checkClassMetadata(DDC2825MySchemaMyTable::CLASSNAME, 'myschema', 'mytable'); - $this->checkClassMetadata(DDC2825MySchemaMyTable2::CLASSNAME, 'myschema', 'mytable2'); - $this->checkClassMetadata(DDC2825MySchemaOrder::CLASSNAME, 'myschema', 'order'); + $this->checkClassMetadata(DDC2825ClassWithExplicitlyDefinedSchema::CLASSNAME, 'myschema', 'mytable'); + $this->checkClassMetadata(DDC2825ClassWithImplicitlyDefinedSchema::CLASSNAME, 'myschema', 'mytable2'); + $this->checkClassMetadata(DDC2825ClassWithImplicitlyDefinedSchemaAndQuotedTableName::CLASSNAME, 'myschema', 'order'); } /** @@ -48,13 +48,13 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase */ public function testFetchingFromEntityWithExplicitlyDefinedSchemaInMappings() { - $this->_em->persist(new DDC2825MySchemaMyTable()); + $this->_em->persist(new DDC2825ClassWithExplicitlyDefinedSchema()); $this->_em->flush(); $this->_em->clear(); $this->assertCount( 1, - $this->_em->createQuery('SELECT e FROM ' . DDC2825MySchemaMyTable::CLASSNAME . ' e')->getResult() + $this->_em->getRepository(DDC2825ClassWithExplicitlyDefinedSchema::CLASSNAME)->findAll() ); } @@ -63,13 +63,13 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase */ public function testFetchingFromEntityWithImplicitlyDefinedSchemaInMappings() { - $this->_em->persist(new DDC2825MySchemaMyTable2()); + $this->_em->persist(new DDC2825ClassWithImplicitlyDefinedSchema()); $this->_em->flush(); $this->_em->clear(); $this->assertCount( 1, - $this->_em->createQuery('SELECT e FROM ' . DDC2825MySchemaMyTable2::CLASSNAME . ' e')->getResult() + $this->_em->getRepository(DDC2825ClassWithImplicitlyDefinedSchema::CLASSNAME)->findAll() ); } @@ -79,13 +79,13 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase */ public function testFetchingFromEntityWithImplicitlyDefinedSchemaAndQuotedTableNameInMappings() { - $this->_em->persist(new DDC2825MySchemaOrder()); + $this->_em->persist(new DDC2825ClassWithImplicitlyDefinedSchemaAndQuotedTableName()); $this->_em->flush(); $this->_em->clear(); $this->assertCount( 1, - $this->_em->createQuery('SELECT e FROM ' . DDC2825MySchemaOrder::CLASSNAME . ' e')->getResult() + $this->_em->getRepository(DDC2825ClassWithImplicitlyDefinedSchemaAndQuotedTableName::CLASSNAME)->findAll() ); } @@ -128,7 +128,7 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase * @Entity * @Table(name="myschema.mytable") */ -class DDC2825MySchemaMyTable +class DDC2825ClassWithExplicitlyDefinedSchema { const CLASSNAME = __CLASS__; @@ -148,7 +148,7 @@ class DDC2825MySchemaMyTable * @Entity * @Table(name="mytable2",schema="myschema") */ -class DDC2825MySchemaMyTable2 +class DDC2825ClassWithImplicitlyDefinedSchema { const CLASSNAME = __CLASS__; @@ -166,7 +166,7 @@ class DDC2825MySchemaMyTable2 * @Entity * @Table(name="myschema.order") */ -class DDC2825MySchemaOrder +class DDC2825ClassWithImplicitlyDefinedSchemaAndQuotedTableName { const CLASSNAME = __CLASS__; From 80ce601eae98c076b1045a95c3cac2b8697c6728 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 19:02:44 +0100 Subject: [PATCH 23/27] #881 DDC-2825 - refactoring test logic to use data-provider instead of code repetitions --- .../ORM/Functional/Ticket/DDC2825Test.php | 83 ++++++++----------- 1 file changed, 33 insertions(+), 50 deletions(-) diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php index 230833e48..b33d2fa30 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php @@ -24,68 +24,51 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase if ( ! $platform->supportsSchemas() && ! $platform->canEmulateSchemas()) { $this->markTestSkipped("This test is only useful for databases that support schemas or can emulate them."); } + } + /** + * @dataProvider getTestedClasses + * + * @param string $className + * @param string $schema + * @param string $table + */ + public function testClassSchemaMappingsValidity($className, $schema, $table) + { + $this->checkClassMetadata($className, $schema, $table); + } + + /** + * @dataProvider getTestedClasses + * + * @param string $className + */ + public function testPersistenceOfEntityWithSchemaMapping($className) + { try { - $this->_schemaTool->createSchema(array( - $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaMyTable'), - $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaMyTable2'), - $this->_em->getClassMetadata(__NAMESPACE__ . '\DDC2825MySchemaOrder'), - )); + $this->_schemaTool->createSchema(array($this->_em->getClassMetadata($className))); } catch (ToolsException $e) { - // tables already exist + // table already exists } - } - public function testMappingsContainCorrectlyDefinedOrEmulatedSchema() - { - $this->checkClassMetadata(DDC2825ClassWithExplicitlyDefinedSchema::CLASSNAME, 'myschema', 'mytable'); - $this->checkClassMetadata(DDC2825ClassWithImplicitlyDefinedSchema::CLASSNAME, 'myschema', 'mytable2'); - $this->checkClassMetadata(DDC2825ClassWithImplicitlyDefinedSchemaAndQuotedTableName::CLASSNAME, 'myschema', 'order'); - } - - /** - * Test with a table with a schema - */ - public function testFetchingFromEntityWithExplicitlyDefinedSchemaInMappings() - { - $this->_em->persist(new DDC2825ClassWithExplicitlyDefinedSchema()); + $this->_em->persist(new $className()); $this->_em->flush(); $this->_em->clear(); - $this->assertCount( - 1, - $this->_em->getRepository(DDC2825ClassWithExplicitlyDefinedSchema::CLASSNAME)->findAll() - ); + $this->assertCount(1, $this->_em->getRepository($className)->findAll()); } /** - * Test with schema defined directly as a table annotation property + * Data provider + * + * @return string[][] */ - public function testFetchingFromEntityWithImplicitlyDefinedSchemaInMappings() + public function getTestedClasses() { - $this->_em->persist(new DDC2825ClassWithImplicitlyDefinedSchema()); - $this->_em->flush(); - $this->_em->clear(); - - $this->assertCount( - 1, - $this->_em->getRepository(DDC2825ClassWithImplicitlyDefinedSchema::CLASSNAME)->findAll() - ); - } - - /** - * Test with a table named "order" (which is a reserved keyword) to make sure the table name is not - * incorrectly escaped when a schema is used and that the platform doesn't support schemas - */ - public function testFetchingFromEntityWithImplicitlyDefinedSchemaAndQuotedTableNameInMappings() - { - $this->_em->persist(new DDC2825ClassWithImplicitlyDefinedSchemaAndQuotedTableName()); - $this->_em->flush(); - $this->_em->clear(); - - $this->assertCount( - 1, - $this->_em->getRepository(DDC2825ClassWithImplicitlyDefinedSchemaAndQuotedTableName::CLASSNAME)->findAll() + return array( + array(DDC2825ClassWithExplicitlyDefinedSchema::CLASSNAME, 'myschema', 'mytable'), + array(DDC2825ClassWithImplicitlyDefinedSchema::CLASSNAME, 'myschema', 'mytable2'), + array(DDC2825ClassWithImplicitlyDefinedSchemaAndQuotedTableName::CLASSNAME, 'myschema', 'order'), ); } @@ -98,7 +81,7 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase * @param string $expectedSchemaName Expected schema name * @param string $expectedTableName Expected table name */ - protected function checkClassMetadata($className, $expectedSchemaName, $expectedTableName) + private function checkClassMetadata($className, $expectedSchemaName, $expectedTableName) { $classMetadata = $this->_em->getClassMetadata($className); $platform = $this->_em->getConnection()->getDatabasePlatform(); From 962f4793185974800c0d0f4fb104a338f68a4e8b Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 19:04:58 +0100 Subject: [PATCH 24/27] #881 DDC-2825 - refactoring test logic, removing dead private method --- .../ORM/Functional/Ticket/DDC2825Test.php | 62 +++++++------------ 1 file changed, 24 insertions(+), 38 deletions(-) diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php index b33d2fa30..c5de5ccf6 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php @@ -30,12 +30,32 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase * @dataProvider getTestedClasses * * @param string $className - * @param string $schema - * @param string $table + * @param string $expectedSchemaName + * @param string $expectedTableName */ - public function testClassSchemaMappingsValidity($className, $schema, $table) + public function testClassSchemaMappingsValidity($className, $expectedSchemaName, $expectedTableName) { - $this->checkClassMetadata($className, $schema, $table); + $classMetadata = $this->_em->getClassMetadata($className); + $platform = $this->_em->getConnection()->getDatabasePlatform(); + $quotedTableName = $this->_em->getConfiguration()->getQuoteStrategy()->getTableName($classMetadata, $platform); + + // Check if table name and schema properties are defined in the class metadata + $this->assertEquals($expectedTableName, $classMetadata->table['name']); + $this->assertEquals($expectedSchemaName, $classMetadata->table['schema']); + + if ($this->_em->getConnection()->getDatabasePlatform()->supportsSchemas()) { + $fullTableName = sprintf('%s.%s', $expectedSchemaName, $expectedTableName); + } else { + $fullTableName = sprintf('%s__%s', $expectedSchemaName, $expectedTableName); + } + + $this->assertEquals($fullTableName, $quotedTableName); + + // Checks sequence name validity + $this->assertEquals( + $fullTableName . '_' . $classMetadata->getSingleIdentifierColumnName() . '_seq', + $classMetadata->getSequenceName($platform) + ); } /** @@ -71,40 +91,6 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase array(DDC2825ClassWithImplicitlyDefinedSchemaAndQuotedTableName::CLASSNAME, 'myschema', 'order'), ); } - - /** - * Checks that class metadata is correctly stored when a database schema is used and - * checks that the table name is correctly converted whether the platform supports database - * schemas or not - * - * @param string $className Class metadata - * @param string $expectedSchemaName Expected schema name - * @param string $expectedTableName Expected table name - */ - private function checkClassMetadata($className, $expectedSchemaName, $expectedTableName) - { - $classMetadata = $this->_em->getClassMetadata($className); - $platform = $this->_em->getConnection()->getDatabasePlatform(); - $quotedTableName = $this->_em->getConfiguration()->getQuoteStrategy()->getTableName($classMetadata, $platform); - - // Check if table name and schema properties are defined in the class metadata - $this->assertEquals($expectedTableName, $classMetadata->table['name']); - $this->assertEquals($expectedSchemaName, $classMetadata->table['schema']); - - if ($this->_em->getConnection()->getDatabasePlatform()->supportsSchemas()) { - $fullTableName = sprintf('%s.%s', $expectedSchemaName, $expectedTableName); - } else { - $fullTableName = sprintf('%s__%s', $expectedSchemaName, $expectedTableName); - } - - $this->assertEquals($fullTableName, $quotedTableName); - - // Checks sequence name validity - $this->assertEquals( - $fullTableName . '_' . $classMetadata->getSingleIdentifierColumnName() . '_seq', - $classMetadata->getSequenceName($platform) - ); - } } /** From 7b168de236f9f799f57eb73d67f5b9ff62cbbb5a Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 19:05:40 +0100 Subject: [PATCH 25/27] #881 DDC-2825 - removing unused imports --- tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php index c5de5ccf6..dd897a71a 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php @@ -2,7 +2,6 @@ namespace Doctrine\Tests\ORM\Functional\Ticket; -use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Tools\ToolsException; /** From 7164e28138892e655d926945416f32d46fe5b6de Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 19:16:42 +0100 Subject: [PATCH 26/27] #881 DDC-2825 - renaming table/schema name for clarity and to avoid collisions --- .../Tests/Models/DDC2825/ExplicitSchemaAndTable.php | 9 ++------- .../Tests/Models/DDC2825/SchemaAndTableInTableName.php | 7 ++----- .../Tests/ORM/Mapping/AbstractMappingDriverTest.php | 8 ++++---- ...trine.Tests.Models.DDC2825.ExplicitSchemaAndTable.php | 4 ++-- ...ne.Tests.Models.DDC2825.SchemaAndTableInTableName.php | 2 +- ...e.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.xml | 2 +- ...ests.Models.DDC2825.SchemaAndTableInTableName.dcm.xml | 2 +- ...e.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.yml | 4 ++-- ...ests.Models.DDC2825.SchemaAndTableInTableName.dcm.yml | 2 +- 9 files changed, 16 insertions(+), 24 deletions(-) diff --git a/tests/Doctrine/Tests/Models/DDC2825/ExplicitSchemaAndTable.php b/tests/Doctrine/Tests/Models/DDC2825/ExplicitSchemaAndTable.php index fea220c1b..60b5d5625 100644 --- a/tests/Doctrine/Tests/Models/DDC2825/ExplicitSchemaAndTable.php +++ b/tests/Doctrine/Tests/Models/DDC2825/ExplicitSchemaAndTable.php @@ -2,16 +2,11 @@ namespace Doctrine\Tests\Models\DDC2825; -/** - * @Entity - * @Table(name="mytable", schema="myschema") - */ +/** @Entity @Table(name="explicit_table", schema="explicit_schema") */ class ExplicitSchemaAndTable { const CLASSNAME = __CLASS__; - /** - * @Id @Column() - */ + /** @Id @Column(type="integer") @GeneratedValue(strategy="AUTO") */ public $id; } diff --git a/tests/Doctrine/Tests/Models/DDC2825/SchemaAndTableInTableName.php b/tests/Doctrine/Tests/Models/DDC2825/SchemaAndTableInTableName.php index e049befac..bd22c2b23 100644 --- a/tests/Doctrine/Tests/Models/DDC2825/SchemaAndTableInTableName.php +++ b/tests/Doctrine/Tests/Models/DDC2825/SchemaAndTableInTableName.php @@ -6,15 +6,12 @@ namespace Doctrine\Tests\Models\DDC2825; * Quoted column name to check that sequence names are * correctly handled * - * @Entity - * @Table(name="myschema.mytable") + * @Entity @Table(name="implicit_schema.implicit_table") */ class SchemaAndTableInTableName { const CLASSNAME = __CLASS__; - /** - * @Id @Column() - */ + /** @Id @Column(type="integer") @GeneratedValue(strategy="AUTO") */ public $id; } \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php b/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php index 871f0c153..8a619dcf0 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/AbstractMappingDriverTest.php @@ -944,8 +944,8 @@ abstract class AbstractMappingDriverTest extends \Doctrine\Tests\OrmTestCase /* @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */ $metadata = $this->createClassMetadataFactory()->getMetadataFor(ExplicitSchemaAndTable::CLASSNAME); - $this->assertSame('myschema', $metadata->getSchemaName()); - $this->assertSame('mytable', $metadata->getTableName()); + $this->assertSame('explicit_schema', $metadata->getSchemaName()); + $this->assertSame('explicit_table', $metadata->getTableName()); } /** @@ -957,8 +957,8 @@ abstract class AbstractMappingDriverTest extends \Doctrine\Tests\OrmTestCase /* @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */ $metadata = $this->createClassMetadataFactory()->getMetadataFor(SchemaAndTableInTableName::CLASSNAME); - $this->assertSame('myschema', $metadata->getSchemaName()); - $this->assertSame('mytable', $metadata->getTableName()); + $this->assertSame('implicit_schema', $metadata->getSchemaName()); + $this->assertSame('implicit_table', $metadata->getTableName()); } } diff --git a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.php b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.php index 27f555944..4a163c9bd 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.php +++ b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.php @@ -5,8 +5,8 @@ use Doctrine\ORM\Mapping\ClassMetadata; /* @var $metadata ClassMetadata */ $metadata->setPrimaryTable(array( - 'name' => 'mytable', - 'schema' => 'myschema', + 'name' => 'explicit_table', + 'schema' => 'explicit_schema', )); $metadata->mapField(array( diff --git a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.php b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.php index 75ca602b5..045a97858 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.php +++ b/tests/Doctrine/Tests/ORM/Mapping/php/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.php @@ -5,7 +5,7 @@ use Doctrine\ORM\Mapping\ClassMetadata; /* @var $metadata ClassMetadata */ $metadata->setPrimaryTable(array( - 'name' => 'myschema.mytable', + 'name' => 'implicit_schema.implicit_table', )); $metadata->mapField(array( diff --git a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.xml b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.xml index 938380072..11bb55706 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.xml +++ b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.xml @@ -5,7 +5,7 @@ xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping https://raw.github.com/doctrine/doctrine2/master/doctrine-mapping.xsd" > - + diff --git a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.xml b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.xml index 0f6be73f0..3a89dd973 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.xml +++ b/tests/Doctrine/Tests/ORM/Mapping/xml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.xml @@ -5,7 +5,7 @@ xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping https://raw.github.com/doctrine/doctrine2/master/doctrine-mapping.xsd" > - + diff --git a/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.yml b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.yml index 7675a6e5d..f28adbb61 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.yml +++ b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.DDC2825.ExplicitSchemaAndTable.dcm.yml @@ -1,7 +1,7 @@ Doctrine\Tests\Models\DDC2825\ExplicitSchemaAndTable: type: entity - table: mytable - schema: myschema + table: explicit_table + schema: explicit_schema id: id: generator: diff --git a/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.yml b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.yml index a63173daa..bf072816c 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.yml +++ b/tests/Doctrine/Tests/ORM/Mapping/yaml/Doctrine.Tests.Models.DDC2825.SchemaAndTableInTableName.dcm.yml @@ -1,6 +1,6 @@ Doctrine\Tests\Models\DDC2825\SchemaAndTableInTableName: type: entity - table: myschema.mytable + table: implicit_schema.implicit_table id: id: generator: From 0106cba60273546d8691d3ead9b6423e2fb176e8 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Wed, 14 Jan 2015 19:17:39 +0100 Subject: [PATCH 27/27] #881 DDC-2825 - reusing mapping files that already exist in models, where applicable --- .../ORM/Functional/Ticket/DDC2825Test.php | 44 ++----------------- 1 file changed, 4 insertions(+), 40 deletions(-) diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php index dd897a71a..0ba50564f 100644 --- a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC2825Test.php @@ -3,6 +3,8 @@ namespace Doctrine\Tests\ORM\Functional\Ticket; use Doctrine\ORM\Tools\ToolsException; +use Doctrine\Tests\Models\DDC2825\ExplicitSchemaAndTable; +use Doctrine\Tests\Models\DDC2825\SchemaAndTableInTableName; /** * This class makes tests on the correct use of a database schema when entities are stored @@ -85,51 +87,13 @@ class DDC2825Test extends \Doctrine\Tests\OrmFunctionalTestCase public function getTestedClasses() { return array( - array(DDC2825ClassWithExplicitlyDefinedSchema::CLASSNAME, 'myschema', 'mytable'), - array(DDC2825ClassWithImplicitlyDefinedSchema::CLASSNAME, 'myschema', 'mytable2'), + array(ExplicitSchemaAndTable::CLASSNAME, 'explicit_schema', 'explicit_table'), + array(SchemaAndTableInTableName::CLASSNAME, 'implicit_schema', 'implicit_table'), array(DDC2825ClassWithImplicitlyDefinedSchemaAndQuotedTableName::CLASSNAME, 'myschema', 'order'), ); } } -/** - * @Entity - * @Table(name="myschema.mytable") - */ -class DDC2825ClassWithExplicitlyDefinedSchema -{ - const CLASSNAME = __CLASS__; - - /** - * Test with a quoted column name to check that sequence names are - * correctly handled - * - * @Id @GeneratedValue - * @Column(name="`number`", type="integer") - * - * @var integer - */ - public $id; -} - -/** - * @Entity - * @Table(name="mytable2",schema="myschema") - */ -class DDC2825ClassWithImplicitlyDefinedSchema -{ - const CLASSNAME = __CLASS__; - - /** - * @Id @GeneratedValue - * @Column(type="integer") - * - * @var integer - */ - public $id; -} - - /** * @Entity * @Table(name="myschema.order")