Passed
Push — 2.x ( f09c73...766c68 )
by Aleksei
39:35 queued 23:36
created

ChangesCountNameGenerator::generate()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 16
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 10
nc 4
nop 1
dl 0
loc 16
rs 9.9332
c 0
b 0
f 0
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
}
63