1
0
mirror of synced 2025-02-09 00:39:25 +03:00

Merge pull request #1558 from doctrine/DDC-3922

[RFC] remove indexes overruled by primary key
This commit is contained in:
Guilherme Blanco 2015-11-15 22:01:05 -05:00
commit 5ec9a62e2b
2 changed files with 76 additions and 3 deletions

View File

@ -247,12 +247,14 @@ class SchemaTool
}
$pkColumns = array();
foreach ($class->identifier as $identifierField) {
if (isset($class->fieldMappings[$identifierField])) {
$pkColumns[] = $this->quoteStrategy->getColumnName($identifierField, $class, $this->platform);
} elseif (isset($class->associationMappings[$identifierField])) {
/* @var $assoc \Doctrine\ORM\Mapping\OneToOne */
$assoc = $class->associationMappings[$identifierField];
foreach ($assoc['joinColumns'] as $joinColumn) {
$pkColumns[] = $this->quoteStrategy->getJoinColumnName($joinColumn, $class, $this->platform);
}
@ -263,6 +265,17 @@ class SchemaTool
$table->setPrimaryKey($pkColumns);
}
// there can be unique indexes automatically created for join column
// if join column is also primary key we should keep only primary key on this column
// so, remove indexes overruled by primary key
$primaryKey = $table->getIndex('primary');
foreach ($table->getIndexes() as $idxKey => $existingIndex) {
if ($primaryKey->overrules($existingIndex)) {
$table->dropIndex($idxKey);
}
}
if (isset($class->table['indexes'])) {
foreach ($class->table['indexes'] as $indexName => $indexData) {
if( ! isset($indexData['flags'])) {

View File

@ -122,10 +122,9 @@ class SchemaToolTest extends \Doctrine\Tests\OrmTestCase
*/
public function testSchemaHasProperIndexesFromUniqueConstraintAnnotation()
{
$em = $this->_getTestEntityManager();
$em = $this->_getTestEntityManager();
$schemaTool = new SchemaTool($em);
$classes = [
$classes = [
$em->getClassMetadata(__NAMESPACE__ . '\\UniqueConstraintAnnotationModel'),
];
@ -138,6 +137,25 @@ class SchemaToolTest extends \Doctrine\Tests\OrmTestCase
$this->assertTrue($table->hasIndex('primary'));
$this->assertTrue($table->hasIndex('uniq_hash'));
}
public function testRemoveUniqueIndexOverruledByPrimaryKey()
{
$em = $this->_getTestEntityManager();
$schemaTool = new SchemaTool($em);
$classes = [
$em->getClassMetadata(__NAMESPACE__ . '\\FirstEntity'),
$em->getClassMetadata(__NAMESPACE__ . '\\SecondEntity')
];
$schema = $schemaTool->getSchemaFromMetadata($classes);
$this->assertTrue($schema->hasTable('first_entity'), "Table first_entity should exist.");
$indexes = $schema->getTable('first_entity')->getIndexes();
$this->assertCount(1, $indexes, "there should be only one index");
$this->assertTrue(current($indexes)->isPrimary(), "index should be primary");
}
}
/**
@ -187,3 +205,45 @@ class UniqueConstraintAnnotationModel
*/
private $hash;
}
/**
* @Entity
* @Table(name="first_entity")
*/
class FirstEntity
{
/**
* @Id
* @Column(name="id")
*/
public $id;
/**
* @OneToOne(targetEntity="SecondEntity")
* @JoinColumn(name="id", referencedColumnName="fist_entity_id")
*/
public $secondEntity;
/**
* @Column(name="name")
*/
public $name;
}
/**
* @Entity
* @Table(name="second_entity")
*/
class SecondEntity
{
/**
* @Id
* @Column(name="fist_entity_id")
*/
public $fist_entity_id;
/**
* @Column(name="name")
*/
public $name;
}