Skip to content

Commit dd46d78

Browse files
committed
Implement - WIP
1 parent ac7a7a4 commit dd46d78

File tree

4 files changed

+57
-50
lines changed

4 files changed

+57
-50
lines changed

src/lib/migrations/BaseMigrationBuilder.php

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ function (string $unknownColumn) {
199199

200200
$columnsForChange = array_intersect($wantNames, $haveNames);
201201

202-
$columnsForRename = $this->findColumnsToRename($columnsForCreate, $columnsForDrop, $this->newColumns);
202+
$columnsForRename = $this->handleColumnsRename($columnsForCreate, $columnsForDrop, $this->newColumns);
203203

204204
if ($this->model->drop) {
205205
$this->newColumns = [];
@@ -620,21 +620,41 @@ protected function shouldCompareComment(ColumnSchema $desired): bool
620620
* @param array $columnsForCreate
621621
* @param array $columnsForDrop
622622
* @param $newColumns
623-
* @return string[]
624623
*/
625-
public function findColumnsToRename(array &$columnsForCreate, array &$columnsForDrop, $newColumns): array
624+
public function handleColumnsRename(array &$columnsForCreate, array &$columnsForDrop, $newColumns)
626625
{
627-
$columnNames = [];
626+
$keys = [];
628627
$existingColumns = $this->tableSchema->columns;
629-
$existingColumnNames = array_flip(array_keys($existingColumns));
628+
$existingColumnNames = array_keys($existingColumns);
630629
$newColumnNames = array_flip(array_keys($newColumns));
631-
632-
foreach ($columnsForCreate as $name) {
633-
if ($existingColumnNames[$name] === $newColumnNames[$name]) {
634-
// TODO compare column
630+
foreach ($columnsForCreate as $key => $column) {
631+
$index = $newColumnNames[$column->name];
632+
$previousColumnName = $existingColumnNames[$index] ?? null;
633+
if ($previousColumnName) {
634+
$current = $existingColumns[$previousColumnName];
635+
$desired = $newColumns[$column->name];
636+
$changedAttributes = $this->compareColumns($current, $desired);
637+
if (empty($changedAttributes)) {
638+
$keys[] = $key;
639+
$dropKeyOut = null;
640+
array_walk($columnsForDrop, function ($value, $dropKey) use ($previousColumnName, &$dropKeyOut) {
641+
if ($value->name === $previousColumnName) {
642+
$dropKeyOut = $dropKey;
643+
}
644+
});
645+
// existing column name should be removed from $columnsForDrop
646+
unset($columnsForDrop[$dropKeyOut]);
647+
648+
// Create ALTER COLUMN NAME query
649+
$this->migration->addUpCode($this->recordBuilder->renameColumn($this->model->tableAlias, $previousColumnName, $column->name))
650+
->addDownCode($this->recordBuilder->renameColumn($this->model->tableAlias, $column->name, $previousColumnName));
651+
}
635652
}
636653
}
637654

638-
return $columnNames;
655+
// new column name should be removed from $columnsForCreate
656+
foreach ($keys as $key) {
657+
unset($columnsForCreate[$key], $columnsForDrop[$previousColumnName]);
658+
}
639659
}
640660
}

src/lib/migrations/MigrationRecordBuilder.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ final class MigrationRecordBuilder
4949
public const ADD_COMMENT_ON_COLUMN = MigrationRecordBuilder::INDENT . "\$this->addCommentOnColumn('%s', '%s', %s);";
5050

5151
public const DROP_COMMENT_FROM_COLUMN = MigrationRecordBuilder::INDENT . "\$this->dropCommentFromColumn('%s', '%s');";
52+
public const RENAME_COLUMN = MigrationRecordBuilder::INDENT . "\$this->renameColumn('%s', '%s', '%s');";
5253

5354
/**
5455
* @var \yii\db\Schema
@@ -387,4 +388,9 @@ public function dropCommentFromColumn($table, string $column): string
387388
{
388389
return sprintf(self::DROP_COMMENT_FROM_COLUMN, $table, $column);
389390
}
391+
392+
public function renameColumn(string $table, string $fromColumn, string $toColumn): string
393+
{
394+
return sprintf(self::RENAME_COLUMN, $table, $fromColumn, $toColumn);
395+
}
390396
}

tests/specs/issue_fix/63_just_column_name_rename/index.yml

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
openapi: 3.0.3
2-
x-description-is-comment: true
32
info:
4-
title: 'Description of a property in spec must correspond to DB TABLE COLUMN COMMENT #60'
3+
title: '63_just_column_name_rename'
54
version: 1.0.0
65

76
components:
@@ -11,35 +10,12 @@ components:
1110
properties:
1211
id:
1312
type: integer
14-
name:
13+
name_2:
1514
type: string
16-
description: desc with ' quote
17-
description:
18-
type: number
19-
x-db-type: double precision
20-
description: desc ' 2
21-
Animal:
22-
type: object
23-
properties:
24-
id:
25-
type: integer
26-
name:
27-
type: integer
28-
g:
29-
type: string
30-
description: desc for g
31-
g2:
15+
description_2:
3216
type: string
33-
description: changed comment on g2 col
34-
g3:
35-
type: string
36-
description: the comment on g3 col remains same
37-
g4:
38-
type: integer
39-
description: data type changes but comment remains same
40-
new_col:
17+
colour:
4118
type: string
42-
description: new col added
4319

4420
paths:
4521
'/':

tests/unit/IssueFixTest.php

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -889,20 +889,25 @@ public function test25GenerateInverseRelations()
889889
// https://github.com/php-openapi/yii2-openapi/issues/63
890890
public function test63JustColumnNameRename()
891891
{
892-
$this->assertTrue(4);
893-
894-
return;
895-
892+
Yii::$app->db->createCommand('DROP TABLE IF EXISTS {{%fruits}}')->execute();
893+
Yii::$app->db->createCommand()->createTable('{{%fruits}}', [
894+
'id' => 'pk',
895+
'name' => 'text',
896+
'description' => 'text',
897+
'colour' => 'text',
898+
])->execute();
896899

897900
$testFile = Yii::getAlias("@specs/issue_fix/63_just_column_name_rename/index.php");
898901
$this->runGenerator($testFile);
899-
$this->runActualMigrations('mysql', 1);
900-
$actualFiles = FileHelper::findFiles(Yii::getAlias('@app'), [
901-
'recursive' => true,
902-
]);
903-
$expectedFiles = FileHelper::findFiles(Yii::getAlias("@specs/issue_fix/63_just_column_name_rename/mysql"), [
904-
'recursive' => true,
905-
]);
906-
$this->checkFiles($actualFiles, $expectedFiles);
902+
// $this->runActualMigrations('mysql', 1);
903+
// $actualFiles = FileHelper::findFiles(Yii::getAlias('@app'), [
904+
// 'recursive' => true,
905+
// ]);
906+
// $expectedFiles = FileHelper::findFiles(Yii::getAlias("@specs/issue_fix/63_just_column_name_rename/mysql"), [
907+
// 'recursive' => true,
908+
// ]);
909+
// $this->checkFiles($actualFiles, $expectedFiles);
910+
911+
Yii::$app->db->createCommand('DROP TABLE IF EXISTS {{%fruits}}')->execute();
907912
}
908913
}

0 commit comments

Comments
 (0)