ConflictResolver::initiateCounters()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 15
rs 9.7666
c 0
b 0
f 0
cc 3
nc 3
nop 1
1
<?php
2
3
/**
4
 * Spiral Framework. Cycle ProxyFactory
5
 *
6
 * @license MIT
7
 * @author  Valentin V (Vvval)
8
 */
9
10
declare(strict_types=1);
11
12
namespace Cycle\ORM\Promise;
13
14
use Cycle\ORM\Promise\ConflictResolver\Sequences;
15
16
final class ConflictResolver
17
{
18
    /** @var ConflictResolver\Sequences */
19
    private $sequences;
20
21
    /**
22
     * @param Sequences|null $sequences
23
     */
24
    public function __construct(ConflictResolver\Sequences $sequences = null)
25
    {
26
        $this->sequences = $sequences ?? new Sequences();
27
    }
28
29
    /**
30
     * @param array  $names
31
     * @param string $name
32
     * @return ConflictResolver\Name
33
     */
34
    public function resolve(array $names, string $name): ConflictResolver\Name
35
    {
36
        return $this->addPostfix($this->initiateCounters($names), $this->parseName($name));
37
    }
38
39
    /**
40
     * @param array                 $counters
41
     * @param ConflictResolver\Name $name
42
     * @return ConflictResolver\Name
43
     */
44
    private function addPostfix(array $counters, ConflictResolver\Name $name): ConflictResolver\Name
45
    {
46
        if (isset($counters[$name->name])) {
47
            $sequence = $this->sequences->find(array_keys($counters[$name->name]), $name->sequence);
48
            if ($sequence !== $name->sequence) {
49
                $name->sequence = $sequence;
50
            }
51
        }
52
53
        return $name;
54
    }
55
56
    /**
57
     * @param array $names
58
     * @return array
59
     */
60
    private function initiateCounters(array $names): array
61
    {
62
        $counters = [];
63
        foreach ($names as $name) {
64
            $name = $this->parseName($name);
65
66
            if (isset($counters[$name->name])) {
67
                $counters[$name->name][$name->sequence] = $name->fullName();
68
            } else {
69
                $counters[$name->name] = [$name->sequence => $name->fullName()];
70
            }
71
        }
72
73
        return $counters;
74
    }
75
76
    /**
77
     * @param string $name
78
     * @return ConflictResolver\Name
79
     */
80
    private function parseName(string $name): ConflictResolver\Name
81
    {
82
        if (preg_match("/\d+$/", $name, $match)) {
83
            $sequence = (int)$match[0];
84
            if ($sequence > 0) {
85
                return ConflictResolver\Name::createWithSequence(
86
                    trimTrailingDigits($name, $sequence),
87
                    $sequence
88
                );
89
            }
90
        }
91
92
        return ConflictResolver\Name::create($name);
93
    }
94
}
95