Completed
Branch master (014e8e)
by Paweł
02:46
created

QueryBuilder::createCompositeCompare()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 2.0625

Importance

Changes 0
Metric Value
dl 0
loc 12
ccs 3
cts 4
cp 0.75
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 9
nc 2
nop 4
crap 2.0625
1
<?php
2
3
namespace Xsolve\SalesforceClient\QueryBuilder;
4
5
use Xsolve\SalesforceClient\QueryBuilder\Expr\Compare\AbstractCompare;
6
use Xsolve\SalesforceClient\QueryBuilder\Expr\Compare\CompositeCompare;
7
use Xsolve\SalesforceClient\QueryBuilder\Expr\Compare\Operator;
8
use Xsolve\SalesforceClient\QueryBuilder\Expr\From\AbstractFrom;
9
use Xsolve\SalesforceClient\QueryBuilder\Expr\GroupBy\AbstractGroupBy;
10
use Xsolve\SalesforceClient\QueryBuilder\Expr\OrderBy\AbstractOrderBy;
11
use Xsolve\SalesforceClient\QueryBuilder\Expr\Select\AbstractSelect;
12
13
class QueryBuilder
14
{
15
    /**
16
     * @var Query
17
     */
18
    private $query;
19
20 53
    public function __construct()
21
    {
22 53
        $this->query = new Query();
23 53
    }
24
25 53
    public function select(AbstractSelect ...$selects): self
26
    {
27 53
        foreach ($selects as $select) {
28 53
            $this->query->addSelect($select);
29
        }
30
31 53
        return $this;
32
    }
33
34 53
    public function from(AbstractFrom $from): self
35
    {
36 53
        $this->query->setFrom($from);
37
38 53
        return $this;
39
    }
40
41 19
    public function where(AbstractCompare $where): self
42
    {
43 19
        $this->query->setWhere($where);
44
45 19
        return $this;
46
    }
47
48 1
    public function andWhere(AbstractCompare $where, bool $wrapPrevious = false): self
49
    {
50 1
        $this->addOrUpdateWhere($where, Operator::CONJUNCTION(), $wrapPrevious);
51
52 1
        return $this;
53
    }
54
55 1
    public function orWhere(AbstractCompare $where, bool $wrapPrevious = false): self
56
    {
57 1
        $this->addOrUpdateWhere($where, Operator::DISJUNCTION(), $wrapPrevious);
58
59 1
        return $this;
60
    }
61
62 4
    public function groupBy(AbstractGroupBy $groupBy): self
63
    {
64 4
        $this->query->setGroupBy($groupBy);
65
66 4
        return $this;
67
    }
68
69 19
    public function having(AbstractCompare $having): self
70
    {
71 19
        $this->query->setHaving($having);
72
73 19
        return $this;
74
    }
75
76 1
    public function andHaving(AbstractCompare $having, bool $wrapPrevious = false): self
77
    {
78 1
        $this->addOrUpdateHaving($having, Operator::CONJUNCTION(), $wrapPrevious);
79
80 1
        return $this;
81
    }
82
83 1
    public function orHaving(AbstractCompare $having, bool $wrapPrevious = false): self
84
    {
85 1
        $this->addOrUpdateHaving($having, Operator::DISJUNCTION(), $wrapPrevious);
86
87 1
        return $this;
88
    }
89
90 1
    private function addOrUpdateWhere(AbstractCompare $where, Operator $operator, bool $wrapPrevious)
91
    {
92 1
        $this->query->setWhere($this->createCompositeCompare(
93
            $where,
94
            $operator,
95
            $wrapPrevious,
96 1
            $this->query->getWhere()
97
        ));
98 1
    }
99
100 1
    private function addOrUpdateHaving(AbstractCompare $having, Operator $operator, bool $wrapPrevious)
101
    {
102 1
        $this->query->setHaving($this->createCompositeCompare(
103
            $having,
104
            $operator,
105
            $wrapPrevious,
106 1
            $this->query->getHaving()
107
        ));
108 1
    }
109
110 1
    private function createCompositeCompare(
111
        AbstractCompare $compare,
112
        Operator $operator,
113
        bool $wrapPrevious,
114
        AbstractCompare $currentCompare = null
115
    ): AbstractCompare {
116 1
        if (null === $currentCompare) {
117
            return $compare;
118
        }
119
120 1
        return new CompositeCompare($currentCompare, $operator, $compare, $wrapPrevious);
121
    }
122
123 4
    public function orderBy(AbstractOrderBy $orderBy): self
124
    {
125 4
        $this->query->setOrderBy($orderBy);
126
127 4
        return $this;
128
    }
129
130 2
    public function limit(int $limit): self
131
    {
132 2
        $this->query->setLimit($limit);
133
134 2
        return $this;
135
    }
136
137 2
    public function offset(int $offset): self
138
    {
139 2
        $this->query->setOffset($offset);
140
141 2
        return $this;
142
    }
143
144 19
    public function setParameters(array $parameters): self
145
    {
146 19
        $this->query->setParameters($parameters);
147
148 19
        return $this;
149
    }
150
151 53
    public function getQuery(): Query
152
    {
153 53
        return $this->query;
154
    }
155
}
156