Skip to content

Commit 766c68d

Browse files
authored
Merge pull request #21: ChangesCountNameGenerator
2 parents f09c739 + b0bab72 commit 766c68d

File tree

8 files changed

+380
-82
lines changed

8 files changed

+380
-82
lines changed

psalm-baseline.xml

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,26 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<files psalm-version="5.26.1@d747f6500b38ac4f7dfc5edbcae6e4b637d7add0">
3+
<file src="src/Changes/Collector.php">
4+
<MixedArrayAccess>
5+
<code><![CDATA[$column[0]]]></code>
6+
<code><![CDATA[$fk[0]]]></code>
7+
<code><![CDATA[$index[0]]]></code>
8+
</MixedArrayAccess>
9+
<MixedAssignment>
10+
<code><![CDATA[$column]]></code>
11+
<code><![CDATA[$fk]]></code>
12+
<code><![CDATA[$index]]></code>
13+
</MixedAssignment>
14+
<MixedMethodCall>
15+
<code><![CDATA[getName]]></code>
16+
<code><![CDATA[getName]]></code>
17+
<code><![CDATA[getName]]></code>
18+
</MixedMethodCall>
19+
<MixedReturnTypeCoercion>
20+
<code><![CDATA[$result]]></code>
21+
<code><![CDATA[array<array{ChangeType, non-empty-string}>]]></code>
22+
</MixedReturnTypeCoercion>
23+
</file>
324
<file src="src/GenerateMigrations.php">
425
<ArgumentTypeCoercion>
526
<code><![CDATA[$database]]></code>
@@ -25,26 +46,4 @@
2546
<code><![CDATA[$this->database]]></code>
2647
</NullableReturnStatement>
2748
</file>
28-
<file src="src/NameBasedOnChangesGenerator.php">
29-
<MixedArrayAccess>
30-
<code><![CDATA[$column[0]]]></code>
31-
<code><![CDATA[$fk[0]]]></code>
32-
<code><![CDATA[$index[0]]]></code>
33-
</MixedArrayAccess>
34-
<MixedAssignment>
35-
<code><![CDATA[$column]]></code>
36-
<code><![CDATA[$fk]]></code>
37-
<code><![CDATA[$index]]></code>
38-
</MixedAssignment>
39-
<MixedMethodCall>
40-
<code><![CDATA[getName]]></code>
41-
<code><![CDATA[getName]]></code>
42-
<code><![CDATA[getName]]></code>
43-
</MixedMethodCall>
44-
<MixedOperand>
45-
<code><![CDATA[$column[0]->getName()]]></code>
46-
<code><![CDATA[$fk[0]->getName()]]></code>
47-
<code><![CDATA[$index[0]->getName()]]></code>
48-
</MixedOperand>
49-
</file>
5049
</files>

psalm.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
66
errorBaseline="psalm-baseline.xml"
77
errorLevel="1"
8+
findUnusedBaselineEntry="true"
89
>
910
<projectFiles>
1011
<directory name="src" />

src/Changes/ChangeType.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cycle\Schema\Generator\Migrations\Changes;
6+
7+
/**
8+
* @internal
9+
*/
10+
enum ChangeType
11+
{
12+
case CreateTable;
13+
case DropTable;
14+
case RenameTable;
15+
case ChangeTable;
16+
case AddColumn;
17+
case DropColumn;
18+
case AlterColumn;
19+
case AddIndex;
20+
case DropIndex;
21+
case AlterIndex;
22+
case AddFk;
23+
case DropFk;
24+
case AlterFk;
25+
}

src/Changes/Collector.php

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cycle\Schema\Generator\Migrations\Changes;
6+
7+
use Cycle\Database\Schema\AbstractTable;
8+
use Cycle\Migrations\Atomizer\Atomizer;
9+
10+
final class Collector
11+
{
12+
/**
13+
* @return array<array{ChangeType, non-empty-string}>
14+
*/
15+
public function collect(Atomizer $atomizer): array
16+
{
17+
$result = [];
18+
19+
foreach ($atomizer->getTables() as $table) {
20+
if ($table->getStatus() === AbstractTable::STATUS_NEW) {
21+
$result[] = [ChangeType::CreateTable, $table->getName()];
22+
continue;
23+
}
24+
25+
if ($table->getStatus() === AbstractTable::STATUS_DECLARED_DROPPED) {
26+
$result[] = [ChangeType::DropTable, $table->getName()];
27+
continue;
28+
}
29+
30+
if ($table->getComparator()->isRenamed()) {
31+
$result[] = [ChangeType::RenameTable, $table->getInitialName()];
32+
continue;
33+
}
34+
35+
$result[] = [ChangeType::ChangeTable, $table->getName()];
36+
37+
$comparator = $table->getComparator();
38+
39+
foreach ($comparator->addedColumns() as $column) {
40+
$result[] = [ChangeType::AddColumn, $column->getName()];
41+
}
42+
43+
foreach ($comparator->droppedColumns() as $column) {
44+
$result[] = [ChangeType::DropColumn, $column->getName()];
45+
}
46+
47+
foreach ($comparator->alteredColumns() as $column) {
48+
$result[] = [ChangeType::AlterColumn, $column[0]->getName()];
49+
}
50+
51+
foreach ($comparator->addedIndexes() as $index) {
52+
$result[] = [ChangeType::AddIndex, $index->getName()];
53+
}
54+
55+
foreach ($comparator->droppedIndexes() as $index) {
56+
$result[] = [ChangeType::DropIndex, $index->getName()];
57+
}
58+
59+
foreach ($comparator->alteredIndexes() as $index) {
60+
$result[] = [ChangeType::AlterIndex, $index[0]->getName()];
61+
}
62+
63+
foreach ($comparator->addedForeignKeys() as $fk) {
64+
$result[] = [ChangeType::AddFk, $fk->getName()];
65+
}
66+
67+
foreach ($comparator->droppedForeignKeys() as $fk) {
68+
$result[] = [ChangeType::DropFk, $fk->getName()];
69+
}
70+
71+
foreach ($comparator->alteredForeignKeys() as $fk) {
72+
$result[] = [ChangeType::AlterFk, $fk[0]->getName()];
73+
}
74+
}
75+
76+
return $result;
77+
}
78+
}

src/ChangesCountNameGenerator.php

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cycle\Schema\Generator\Migrations;
6+
7+
use Cycle\Migrations\Atomizer\Atomizer;
8+
use Cycle\Schema\Generator\Migrations\Changes\ChangeType;
9+
use Cycle\Schema\Generator\Migrations\Changes\Collector;
10+
11+
/**
12+
* Generates migration name based on changes count.
13+
*
14+
* Like:
15+
* ct1_dt1_t2_c3_i3_fk3
16+
* There are:
17+
* - 1 create table
18+
* - 1 drop table
19+
* - 2 table changes
20+
* - 3 column changes
21+
* - 3 index changes
22+
* - 3 foreign key changes
23+
*/
24+
final class ChangesCountNameGenerator implements NameGeneratorInterface
25+
{
26+
public function generate(Atomizer $atomizer): string
27+
{
28+
$collector = new Collector();
29+
$map = [];
30+
foreach ($collector->collect($atomizer) as $pair) {
31+
$key = $this->changeToString($pair[0]);
32+
$map[$key] ??= 0;
33+
$map[$key]++;
34+
}
35+
36+
$result = [];
37+
foreach ($map as $key => $cnt) {
38+
$result[] = "{$key}{$cnt}";
39+
}
40+
41+
return \implode('_', $result);
42+
}
43+
44+
private function changeToString(ChangeType $change): string
45+
{
46+
return match ($change) {
47+
ChangeType::CreateTable => 'ct',
48+
ChangeType::DropTable => 'dt',
49+
ChangeType::RenameTable,
50+
ChangeType::ChangeTable => 't',
51+
ChangeType::AddColumn,
52+
ChangeType::DropColumn,
53+
ChangeType::AlterColumn => 'c',
54+
ChangeType::AddIndex,
55+
ChangeType::DropIndex,
56+
ChangeType::AlterIndex => 'i',
57+
ChangeType::AddFk,
58+
ChangeType::DropFk,
59+
ChangeType::AlterFk => 'fk',
60+
};
61+
}
62+
}

src/NameBasedOnChangesGenerator.php

Lines changed: 32 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -4,72 +4,44 @@
44

55
namespace Cycle\Schema\Generator\Migrations;
66

7-
use Cycle\Database\Schema\AbstractTable;
87
use Cycle\Migrations\Atomizer\Atomizer;
8+
use Cycle\Schema\Generator\Migrations\Changes\ChangeType;
9+
use Cycle\Schema\Generator\Migrations\Changes\Collector;
910

1011
final class NameBasedOnChangesGenerator implements NameGeneratorInterface
1112
{
1213
public function generate(Atomizer $atomizer): string
1314
{
14-
$name = [];
15-
16-
foreach ($atomizer->getTables() as $table) {
17-
if ($table->getStatus() === AbstractTable::STATUS_NEW) {
18-
$name[] = 'create_' . $table->getName();
19-
continue;
20-
}
21-
22-
if ($table->getStatus() === AbstractTable::STATUS_DECLARED_DROPPED) {
23-
$name[] = 'drop_' . $table->getName();
24-
continue;
25-
}
26-
27-
if ($table->getComparator()->isRenamed()) {
28-
$name[] = 'rename_' . $table->getInitialName();
29-
continue;
30-
}
31-
32-
$name[] = 'change_' . $table->getName();
33-
34-
$comparator = $table->getComparator();
35-
36-
foreach ($comparator->addedColumns() as $column) {
37-
$name[] = 'add_' . $column->getName();
38-
}
39-
40-
foreach ($comparator->droppedColumns() as $column) {
41-
$name[] = 'rm_' . $column->getName();
42-
}
43-
44-
foreach ($comparator->alteredColumns() as $column) {
45-
$name[] = 'alter_' . $column[0]->getName();
46-
}
47-
48-
foreach ($comparator->addedIndexes() as $index) {
49-
$name[] = 'add_index_' . $index->getName();
50-
}
51-
52-
foreach ($comparator->droppedIndexes() as $index) {
53-
$name[] = 'rm_index_' . $index->getName();
54-
}
55-
56-
foreach ($comparator->alteredIndexes() as $index) {
57-
$name[] = 'alter_index_' . $index[0]->getName();
58-
}
59-
60-
foreach ($comparator->addedForeignKeys() as $fk) {
61-
$name[] = 'add_fk_' . $fk->getName();
62-
}
63-
64-
foreach ($comparator->droppedForeignKeys() as $fk) {
65-
$name[] = 'rm_fk_' . $fk->getName();
66-
}
67-
68-
foreach ($comparator->alteredForeignKeys() as $fk) {
69-
$name[] = 'alter_fk_' . $fk[0]->getName();
70-
}
71-
}
15+
$collector = new Collector();
16+
return \implode(
17+
'_',
18+
\array_map(
19+
fn(array $pair): string => $this->changeToString($pair[0], $pair[1]),
20+
$collector->collect($atomizer),
21+
),
22+
);
23+
}
7224

73-
return \implode('_', $name);
25+
private function changeToString(ChangeType $change, string $name): string
26+
{
27+
return sprintf(
28+
'%s_%s',
29+
match ($change) {
30+
ChangeType::CreateTable => 'create',
31+
ChangeType::DropTable => 'drop',
32+
ChangeType::RenameTable => 'rename',
33+
ChangeType::ChangeTable => 'change',
34+
ChangeType::AddColumn => 'add',
35+
ChangeType::DropColumn => 'rm',
36+
ChangeType::AlterColumn => 'alter',
37+
ChangeType::AddIndex => 'add_index',
38+
ChangeType::DropIndex => 'rm_index',
39+
ChangeType::AlterIndex => 'alter_index',
40+
ChangeType::AddFk => 'add_fk',
41+
ChangeType::DropFk => 'rm_fk',
42+
ChangeType::AlterFk => 'alter_fk',
43+
},
44+
$name,
45+
);
7446
}
7547
}

0 commit comments

Comments
 (0)