Passed
Push — master ( d3a94c...76e109 )
by Valentin
05:50
created

ConflictResolver::addPostfix()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 11
rs 9.9
c 0
b 0
f 0
cc 3
nc 3
nop 2
1
<?php
2
declare(strict_types=1);
3
4
namespace Cycle\ORM\Promise;
5
6
class ConflictResolver
7
{
8
    /** @var ConflictResolver\Sequences */
9
    private $sequences;
10
11
    public function __construct(ConflictResolver\Sequences $sequences)
12
    {
13
        $this->sequences = $sequences;
14
    }
15
16
    public function resolve(array $names, string $name): string
17
    {
18
        return $this->addPostfix($this->initiateCounters($names), $this->parseName($name));
19
    }
20
21
    private function addPostfix(array $counters, ConflictResolver\Name $name): string
22
    {
23
        if (isset($counters[$name->name])) {
24
            $sequence = $this->sequences->find(array_keys($counters[$name->name]), $name->sequence);
25
            if ($sequence !== $name->sequence) {
26
                $name->sequence = $sequence;
27
            }
28
        }
29
30
        return $name->fullName();
31
    }
32
33
    private function initiateCounters(array $names): array
34
    {
35
        $counters = [];
36
        foreach ($names as $name) {
37
            $name = $this->parseName($name);
38
39
            if (isset($counters[$name->name])) {
40
                $counters[$name->name][$name->sequence] = $name->fullName();
41
            } else {
42
                $counters[$name->name] = [$name->sequence => $name->fullName()];
43
            }
44
        }
45
46
        return $counters;
47
    }
48
49
    private function parseName(string $name): ConflictResolver\Name
50
    {
51
        if (preg_match("/\d+$/", $name, $match)) {
52
            $sequence = (int)$match[0];
53
            if ($sequence > 0) {
54
                return ConflictResolver\Name::createWithSequence(Utils::trimTrailingDigits($name, $sequence), $sequence);
55
            }
56
        }
57
58
        return ConflictResolver\Name::create($name);
59
    }
60
}