Passed
Push — master ( 300fb2...9a33a3 )
by Smoren
01:41
created

JoinConditionCollection::count()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 3
rs 10
1
<?php
2
3
namespace Smoren\QueryRelationManager\Base\Structs;
4
5
use Countable;
6
use IteratorAggregate;
7
use Smoren\QueryRelationManager\Base\QueryRelationManagerException;
8
9
/**
10
 * Class JoinConditionManager
11
 * Класс-коллекция объектов условий присоединения
12
 * @author Smoren <[email protected]>
13
 * @implements IteratorAggregate<JoinCondition>
14
 */
15
class JoinConditionCollection implements Countable, IteratorAggregate
16
{
17
    /**
18
     * @var JoinCondition[] карта объектов условий присоединения по псевдониму присоединяемой таблицы
19
     */
20
    protected array $mapByJoinAs = [];
21
22
    /**
23
     * @var JoinCondition[][] карта списка объектов условий присоединения по псевдониму таблицы,
24
     * к которой осуществляется присоединение
25
     */
26
    protected array $matrixByJoinTo = [];
27
28
    /**
29
     * Добавление объекта условия присоединения таблицы
30
     * @param JoinCondition $condition условие присоединения таблицы
31
     * @return $this
32
     * @throws QueryRelationManagerException
33
     */
34
    public function add(JoinCondition $condition): self
35
    {
36
        if(isset($this->mapByJoinAs[$condition->table->alias])) {
37
            throw new QueryRelationManagerException("duplicate table alias '{$condition->table->alias}'");
38
        }
39
        $this->mapByJoinAs[$condition->table->alias] = $condition;
40
41
        if(!isset($this->matrixByJoinTo[$condition->joinTo->alias])) {
42
            $this->matrixByJoinTo[$condition->joinTo->alias] = [];
43
        }
44
        if(isset($this->matrixByJoinTo[$condition->joinTo->alias][$condition->table->alias])) {
45
            throw new QueryRelationManagerException("duplicate table alias '{$condition->table->alias}'");
46
        }
47
        $this->matrixByJoinTo[$condition->joinTo->alias][$condition->table->alias] = $condition;
48
49
        return $this;
50
    }
51
52
    /**
53
     * Проверка наличия объекта условия присоединения таблицы по ее псевдониму в запросе
54
     * @param string $joinAs псевдоним присоединяемой таблицы
55
     * @return bool
56
     */
57
    public function issetByJoinAs(string $joinAs): bool
58
    {
59
        if(!isset($this->mapByJoinAs[$joinAs])) {
60
            return false;
61
        }
62
63
        return true;
64
    }
65
66
    /**
67
     * Получение объекта условия присоединения таблицы по ее псевдониму в запросе
68
     * @param string $joinAs псевдоним присоединяемой таблицы
69
     * @return JoinCondition
70
     */
71
    public function byJoinAs(string $joinAs): JoinCondition
72
    {
73
        return $this->mapByJoinAs[$joinAs];
74
    }
75
76
    /**
77
     * Получение списка объекта условий присоединения таблиц по псевдониму таблицы,
78
     * к которой осуществляется присоединение
79
     * @param string $joinTo псевдоним таблицы, к которой осуществляется присоединение
80
     * @return JoinCondition[]
81
     */
82
    public function byJoinTo(string $joinTo): array
83
    {
84
        if(!isset($this->matrixByJoinTo[$joinTo])) {
85
            return [];
86
        }
87
        return $this->matrixByJoinTo[$joinTo];
88
    }
89
90
    /**
91
     * @inheritDoc
92
     * @return iterable<JoinCondition>
93
     */
94
    public function getIterator(): iterable
95
    {
96
        foreach($this->mapByJoinAs as $condition) {
97
            yield $condition;
98
        }
99
    }
100
101
    /**
102
     * @inheritDoc
103
     */
104
    public function count(): int
105
    {
106
        return count($this->mapByJoinAs);
107
    }
108
}
109