Skip to content

Commit

Permalink
DiffGenerator: fixes circular references for removed tables
Browse files Browse the repository at this point in the history
  • Loading branch information
janpecha committed Jul 14, 2021
1 parent 47f931a commit bed0b34
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 0 deletions.
54 changes: 54 additions & 0 deletions src/DiffGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ private function prepareChanges()
$this->updatedTables = $this->prepareUpdatedTables();
$this->removedTables = $this->prepareRemovedTables();
$this->fixCreatedCircularReferences();
$this->fixRemovedCircularReferences();
$this->prepared = TRUE;
}

Expand Down Expand Up @@ -501,6 +502,59 @@ private function fixCreatedCircularReferences()
}


/**
* @return void
*/
private function fixRemovedCircularReferences()
{
$sortedTables = $this->sortTables($this->old->getTables(), $this->removedTables);
$exists = [];

foreach ($sortedTables as $sortedTable) {
$exists[$sortedTable->getTableName()] = TRUE;
}

$removedNames = [];

foreach ($sortedTables as $removedTable) {
$tableName = $removedTable->getTableName();

if (!isset($exists[$tableName])) {
$removedNames[$tableName] = [];
continue;
}

$definition = $this->old->getTable($removedTable->getTableName());

if ($definition === NULL) {
continue;
}

$updates = [];

foreach ($definition->getForeignKeys() as $foreignKey) {
$targetTable = $foreignKey->getTargetTable();

if (!isset($exists[$targetTable])) {
continue;
}

if (!isset($removedNames[$targetTable])) { // circular reference
$updates[] = new Diffs\RemovedForeignKey($tableName, $foreignKey->getName());
}
}

$removedNames[$tableName] = $updates;
}

foreach ($removedNames as $tableName => $updates) {
if (count($updates) > 0) {
$this->updatedTables[] = new Diffs\UpdatedTable($tableName, $updates);
}
}
}


private function sortTables(array $allTables, array $tablesToSort)
{
$tableOrder = $this->resolveOrder($allTables);
Expand Down
49 changes: 49 additions & 0 deletions tests/SchemaGenerator/diffs/removed-table.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,52 @@ test(function () {
$generator->generator->generate();
Assert::same("DROP TABLE `book`;\n", $generator->dumper->getSql());
});


test(function () { // circular dependency
$old = new SqlSchema\Schema;
$new = new SqlSchema\Schema;

$oldGallery = $old->addTable('gallery');
$oldGallery->addColumn('id', 'INT');
$oldGallery->addColumn('primaryPhoto_id', 'INT');
$oldGallery->addForeignKey('fk_primaryPhoto', 'primaryPhoto_id', 'photo', 'id');

$oldPhoto = $old->addTable('photo');
$oldPhoto->addColumn('id', 'INT');
$oldPhoto->addColumn('gallery_id', 'INT');
$oldPhoto->addForeignKey('fk_gallery', 'gallery_id', 'gallery', 'id');

$newGallery = $new->addTable('gallery');
$newGallery->addColumn('id', 'INT');

$generator = Test\TestGenerator::create($old, $new);
$generator->generator->generate();
Assert::same(implode("\n", [
'ALTER TABLE `gallery`',
'DROP FOREIGN KEY `fk_primaryPhoto`,',
'DROP COLUMN `primaryPhoto_id`;',
'',
"DROP TABLE `photo`;",
]) . "\n", $generator->dumper->getSql());
});


test(function () { // circular dependency - self reference
$old = new SqlSchema\Schema;
$new = new SqlSchema\Schema;

$oldGallery = $old->addTable('gallery');
$oldGallery->addColumn('id', 'INT');
$oldGallery->addColumn('parent_id', 'INT');
$oldGallery->addForeignKey('fk_parent', 'parent_id', 'gallery', 'id');

$generator = Test\TestGenerator::create($old, $new);
$generator->generator->generate();
Assert::same(implode("\n", [
'ALTER TABLE `gallery`',
'DROP FOREIGN KEY `fk_parent`;',
'',
"DROP TABLE `gallery`;",
]) . "\n", $generator->dumper->getSql());
});

0 comments on commit bed0b34

Please sign in to comment.