Completed
Push — master ( 31d87d...869318 )
by Beniamin
02:35
created

QueryCompiler::compileUpdate()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 8
c 0
b 0
f 0
ccs 4
cts 4
cp 1
rs 9.4285
cc 3
eloc 4
nc 3
nop 1
crap 3
1
<?php
2
3
/**
4
 * This file is part of Phuria SQL Builder package.
5
 *
6
 * Copyright (c) 2016 Beniamin Jonatan Šimko
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Phuria\SQLBuilder\QueryCompiler;
13
14
use Phuria\SQLBuilder\Parser\ReferenceParser;
15
use Phuria\SQLBuilder\QueryBuilder\AbstractBuilder;
16
use Phuria\SQLBuilder\QueryBuilder\AbstractInsertBuilder;
17
use Phuria\SQLBuilder\QueryBuilder\Clause;
18
use Phuria\SQLBuilder\QueryBuilder\Component;
19
use Phuria\SQLBuilder\QueryBuilder\InsertSelectBuilder;
20
use Phuria\SQLBuilder\QueryBuilder\UpdateBuilder;
21
22
/**
23
 * @author Beniamin Jonatan Šimko <[email protected]>
24
 */
25
class QueryCompiler implements QueryCompilerInterface
26
{
27
    /**
28
     * @var TableCompiler
29
     */
30
    private $tableCompiler;
31
32 37
    public function __construct()
33
    {
34 37
        $this->tableCompiler = new TableCompiler();
35 37
    }
36
37
    /**
38
     * @inheritdoc
39
     */
40 34
    public function compile(AbstractBuilder $qb)
41
    {
42 34
        return $this->compileReferences($this->compileRaw($qb), $qb);
43
    }
44
45
    /**
46
     * @param AbstractBuilder $qb
47
     *
48
     * @return string
49
     */
50 34
    private function compileRaw(AbstractBuilder $qb)
51
    {
52 34
        return implode(' ', array_filter([
53 34
            $this->compileDelete($qb),
54 34
            $this->compileInsert($qb),
55 34
            $this->compileUpdate($qb),
56 34
            $this->compileSelect($qb),
57 34
            $this->tableCompiler->compileRootTables($qb),
58 34
            $this->tableCompiler->compileJoinTables($qb),
59 34
            $this->compileInsertColumns($qb),
60 34
            $this->compileInsertSelect($qb),
61 34
            $this->compileSet($qb),
62 34
            $this->compileWhere($qb),
63 34
            $this->compileInsertValues($qb),
64 34
            $this->compileGroupBy($qb),
65 34
            $this->compileHaving($qb),
66 34
            $this->compileOrderBy($qb),
67 34
            $this->compileLimit($qb)
68 34
        ]));
69
    }
70
71
    /**
72
     * @param string          $rawSQL
73
     * @param AbstractBuilder $qb
74
     *
75
     * @return string
76
     */
77 34
    private function compileReferences($rawSQL, AbstractBuilder $qb)
78
    {
79 34
        return (new ReferenceParser($rawSQL, $qb->getReferenceManager()))->parseSQL();
80
    }
81
82
    /**
83
     * @param AbstractBuilder $qb
84
     *
85
     * @return string
86
     */
87 34
    private function compileDelete(AbstractBuilder $qb)
88
    {
89 34
        if ($qb instanceof Clause\DeleteClauseInterface) {
90 2
            return $qb->getDeleteClauses() ? 'DELETE ' . implode(', ', $qb->getDeleteClauses()) : 'DELETE';
91
        }
92
93 32
        return '';
94
    }
95
96
    /**
97
     * @param AbstractBuilder $qb
98
     *
99
     * @return string
100
     */
101 34
    private function compileInsert(AbstractBuilder $qb)
102
    {
103 34
        if ($qb instanceof AbstractInsertBuilder) {
104 3
            return 'INSERT INTO';
105
        }
106
107 32
        return '';
108
    }
109
110
    /**
111
     * @param AbstractBuilder $qb
112
     *
113
     * @return string
114
     */
115 34
    private function compileUpdate(AbstractBuilder $qb)
116
    {
117 34
        if ($qb instanceof UpdateBuilder) {
118 4
            return $qb->isIgnore() ? 'UPDATE IGNORE' : 'UPDATE';
119
        }
120
121 30
        return '';
122
    }
123
124
    /**
125
     * @param AbstractBuilder $qb
126
     *
127
     * @return string
128
     */
129 34
    private function compileSelect(AbstractBuilder $qb)
130
    {
131 34
        if ($qb instanceof Clause\SelectClauseInterface) {
132 26
            return 'SELECT ' . implode(', ', $qb->getSelectClauses());
133
        }
134
135 9
        return '';
136
    }
137
138
    /**
139
     * @param AbstractBuilder $qb
140
     *
141
     * @return string
142
     */
143 34
    private function compileSet(AbstractBuilder $qb)
144
    {
145 34
        if ($qb instanceof Clause\SetClauseInterface && $qb->getSetClauses()) {
146 4
            return 'SET ' . implode(', ', $qb->getSetClauses());
147
        }
148
149 30
        return '';
150
    }
151
152
    /**
153
     * @param AbstractBuilder $qb
154
     *
155
     * @return string
156
     */
157 34
    private function compileWhere(AbstractBuilder $qb)
158
    {
159 34
        if ($qb instanceof Clause\WhereClauseInterface && $qb->getWhereClauses()) {
160 9
            return 'WHERE ' . implode(' AND ', $qb->getWhereClauses());
161
        }
162
163 25
        return '';
164
    }
165
166
    /**
167
     * @param AbstractBuilder $qb
168
     *
169
     * @return string
170
     */
171 34
    private function compileGroupBy(AbstractBuilder $qb)
172
    {
173 34
        if ($qb instanceof Clause\GroupByClauseInterface && $qb->getGroupByClauses()) {
174 5
            $clause = 'GROUP BY ' . implode(', ', $qb->getGroupByClauses());
175
176 5
            return $qb->isGroupByWithRollUp() ? $clause . ' WITH ROLLUP' : $clause;
177
        }
178
179 31
        return '';
180
    }
181
182
    /**
183
     * @param AbstractBuilder $qb
184
     *
185
     * @return string
186
     */
187 34
    private function compileHaving(AbstractBuilder $qb)
188
    {
189 34
        if ($qb instanceof Clause\HavingClauseInterface && $qb->getHavingClauses()) {
190 1
            return 'HAVING ' . implode(' AND ', $qb->getHavingClauses());
191
        }
192
193 33
        return '';
194
    }
195
196
    /**
197
     * @param AbstractBuilder $qb
198
     *
199
     * @return string
200
     */
201 34
    private function compileOrderBy(AbstractBuilder $qb)
202
    {
203 34
        if ($qb instanceof Clause\OrderByClauseInterface && $qb->getOrderByClauses()) {
204 2
            return 'ORDER BY ' . implode(', ', $qb->getOrderByClauses());
205
        }
206
207 32
        return '';
208
    }
209
210
    /**
211
     * @param AbstractBuilder $qb
212
     *
213
     * @return string
214
     */
215 34
    private function compileLimit(AbstractBuilder $qb)
216
    {
217 34
        if ($qb instanceof Clause\LimitClauseInterface && $qb->getLimitClause()) {
218 2
            return 'LIMIT ' . $qb->getLimitClause();
219
        }
220
221 32
        return '';
222
    }
223
224
    /**
225
     * @param AbstractBuilder $qb
226
     *
227
     * @return string
228
     */
229 34
    private function compileInsertValues(AbstractBuilder $qb)
230
    {
231 34
        if ($qb instanceof Component\InsertValuesComponentInterface) {
232 2
            return 'VALUES ' . implode(', ', array_map(function (array $values) {
233 2
                return '('. implode(', ', $values) . ')';
234 2
            }, $qb->getValues()));
235
        }
236
237 32
        return '';
238
    }
239
240
    /**
241
     * @param AbstractBuilder $qb
242
     *
243
     * @return string
244
     */
245 34
    private function compileInsertSelect(AbstractBuilder $qb)
246
    {
247 34
        if ($qb instanceof InsertSelectBuilder) {
248 1
            return $qb->getSelectInsert()->buildSQL();
249
        }
250
251 34
        return '';
252
    }
253
254
    /**
255
     * @param AbstractBuilder $qb
256
     *
257
     * @return string
258
     */
259 34
    private function compileInsertColumns(AbstractBuilder $qb)
260
    {
261 34
        if ($qb instanceof Clause\InsertColumnsClauseInterface) {
262 3
            return '(' . implode(', ', $qb->getColumns()) . ')';
263
        }
264
265 32
        return '';
266
    }
267
}