Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
50.00% covered (danger)
50.00%
34 / 68
14.29% covered (danger)
14.29%
2 / 14
CRAP
0.00% covered (danger)
0.00%
0 / 1
Grammar
50.00% covered (danger)
50.00%
34 / 68
14.29% covered (danger)
14.29%
2 / 14
178.50
0.00% covered (danger)
0.00%
0 / 1
 compileComponents
63.41% covered (warning)
63.41%
26 / 41
0.00% covered (danger)
0.00%
0 / 1
26.02
 compileSelectTables
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 compileSelectFields
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 compileCreateFields
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 compilePostQueries
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 compileAlterTable
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 compileAlterColumn
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 compileAlterAdd
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
20
 addColumn
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 addConstraint
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 compileCreateTable
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 compileCreateTableSettings
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 compileDropDatabase
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
2.06
 compileDropTable
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
2.06
1<?php
2/**
3 * Jingga
4 *
5 * PHP Version 8.1
6 *
7 * @package   phpOMS\DataStorage\Database\Schema\Grammar
8 * @copyright Dennis Eichhorn
9 * @license   OMS License 2.0
10 * @version   1.0.0
11 * @link      https://jingga.app
12 */
13declare(strict_types=1);
14
15namespace phpOMS\DataStorage\Database\Schema\Grammar;
16
17use phpOMS\DataStorage\Database\BuilderAbstract;
18use phpOMS\DataStorage\Database\GrammarAbstract;
19use phpOMS\DataStorage\Database\Schema\Builder as SchemaBuilder;
20use phpOMS\DataStorage\Database\Schema\QueryType;
21
22/**
23 * Database query grammar.
24 *
25 * @package phpOMS\DataStorage\Database\Schema\Grammar
26 * @license OMS License 2.0
27 * @link    https://jingga.app
28 * @since   1.0.0
29 */
30class Grammar extends GrammarAbstract
31{
32    /**
33     * {@inheritdoc}
34     */
35    protected function compileComponents(BuilderAbstract $query) : array
36    {
37        /** @var SchemaBuilder $query */
38
39        $sql = [];
40        switch ($query->getType()) {
41            case QueryType::DROP_DATABASE:
42                if (empty($query->dropDatabase)) {
43                    break;
44                }
45
46                $sql[] = $this->compileDropDatabase($query, $query->dropDatabase);
47
48                break;
49            case QueryType::TABLES:
50                if (empty($query->selectTables)) {
51                    break;
52                }
53
54                $sql[] = $this->compileSelectTables($query, $query->selectTables);
55
56                break;
57            case QueryType::FIELDS:
58                if (empty($query->selectFields)) {
59                    break;
60                }
61
62                $sql[] = $this->compileSelectFields($query, $query->selectFields);
63
64                break;
65            case QueryType::CREATE_TABLE:
66                if (empty($query->createTable)) {
67                    break;
68                }
69
70                $sql[] = $this->compileCreateTable($query, $query->createTable);
71                $sql[] = $this->compileCreateFields($query, $query->createFields);
72
73                if (empty($query->createTableSettings)) {
74                    break;
75                }
76
77                $sql[] = $this->compileCreateTableSettings($query, $query->createTableSettings);
78
79                break;
80            case QueryType::DROP_TABLE:
81                if (empty($query->dropTable)) {
82                    break;
83                }
84
85                $sql[] = $this->compileDropTable($query, $query->dropTable);
86
87                break;
88            case QueryType::ALTER:
89                $sql[] = $this->compileAlterTable($query, $query->alterTable);
90                $sql[] = $this->compileAlterColumn($query, $query->alterColumn);
91                $sql[] = $this->compileAlterAdd($query, $query->alterAdd);
92                // $sql[] = $this->compileAlterRename($query, $query->alterRename);
93                // $sql[] = $this->compileAlterRemove($query, $query->alterRemove);
94
95                break;
96            case QueryType::RAW:
97                $sql[] = $query->raw;
98
99                break;
100            default:
101                return [];
102        }
103
104        return $sql;
105    }
106
107    /**
108     * Compile the select tables.
109     *
110     * @param SchemaBuilder $query  Query
111     * @param array         $tables Tables
112     *
113     * @return string
114     *
115     * @since 1.0.0
116     */
117    protected function compileSelectTables(SchemaBuilder $query, array $tables) : string
118    {
119        return '';
120    }
121
122    /**
123     * Compile the select fields from table.
124     *
125     * @param SchemaBuilder $query Query
126     * @param array         $table Table
127     *
128     * @return string
129     *
130     * @since 1.0.0
131     */
132    protected function compileSelectFields(SchemaBuilder $query, string $table) : string
133    {
134        return '';
135    }
136
137    /**
138     * Compile the create fields.
139     *
140     * @param SchemaBuilder $query  Query
141     * @param array         $fields Fields
142     *
143     * @return string
144     *
145     * @since 1.0.0
146     */
147    protected function compileCreateFields(SchemaBuilder $query, array $fields) : string
148    {
149        return '';
150    }
151
152    /**
153     * Compile the select tables.
154     *
155     * @param SchemaBuilder $query Query
156     *
157     * @return string
158     *
159     * @since 1.0.0
160     */
161    public function compilePostQueries(BuilderAbstract $query) : array
162    {
163        return [];
164    }
165
166    /**
167     * Compile alter table query.
168     *
169     * @param BuilderAbstract $query Query
170     * @param string          $table Table to alter
171     *
172     * @return string
173     *
174     * @since 1.0.0
175     */
176    protected function compileAlterTable(BuilderAbstract $query, string $table) : string
177    {
178        return 'ALTER TABLE ' . $this->expressionizeTableColumn([$table]);
179    }
180
181    /**
182     * Compile alter column query.
183     *
184     * @param BuilderAbstract $query  Query
185     * @param string          $column Column to alter
186     *
187     * @return string
188     *
189     * @since 1.0.0
190     */
191    protected function compileAlterColumn(BuilderAbstract $query, string $column) : string
192    {
193        return '';
194    }
195
196    /**
197     * Compile alter add query.
198     *
199     * @param BuilderAbstract $query Query
200     * @param array           $add   Add data
201     *
202     * @return string
203     *
204     * @since 1.0.0
205     */
206    protected function compileAlterAdd(BuilderAbstract $query, array $add) : string
207    {
208        switch ($add['type']) {
209            case 'COLUMN':
210                return $this->addColumn($add);
211            case 'CONSTRAINT':
212                return $this->addConstraint($add);
213            default:
214                return '';
215        }
216    }
217
218    /**
219     * Add a new column.
220     *
221     * @param array $add Add data
222     *
223     * @return string
224     *
225     * @since 1.0.0
226     */
227    private function addColumn(array $add) : string
228    {
229        return 'ADD ' . $this->expressionizeTableColumn([$add['name']]) . ' ' . $add['datatype'];
230    }
231
232    /**
233     * Add a new constraint/foreign key.
234     *
235     * @param array $add Add data
236     *
237     * @return string
238     *
239     * @since 1.0.0
240     */
241    private function addConstraint(array $add) : string
242    {
243        return 'ADD' . (isset($add['constraint']) ? ' CONSTRAINT ' . $add['constraint'] : '')
244            . ' FOREIGN KEY (' .  $this->expressionizeTableColumn([$add['key']]) . ') REFERENCES '
245            . $this->expressionizeTableColumn([$add['foreignTable']])
246            . ' (' . $this->expressionizeTableColumn([$add['foreignKey']]) . ')';
247    }
248
249    /**
250     * Compile create table query.
251     *
252     * @param BuilderAbstract $query Query
253     * @param string          $table Tables to drop
254     *
255     * @return string
256     *
257     * @since 1.0.0
258     */
259    protected function compileCreateTable(BuilderAbstract $query, string $table) : string
260    {
261        return 'CREATE TABLE IF NOT EXISTS ' . $this->expressionizeTableColumn([$table]);
262    }
263
264    /**
265     * Compile create table settings query.
266     *
267     * @param BuilderAbstract $query    Query
268     * @param bool            $settings Has settings
269     *
270     * @return string
271     *
272     * @since 1.0.0
273     */
274    protected function compileCreateTableSettings(BuilderAbstract $query, bool $settings) : string
275    {
276        return '';
277    }
278
279    /**
280     * Compile drop query.
281     *
282     * @param BuilderAbstract $query    Query
283     * @param string          $database Tables to drop
284     *
285     * @return string
286     *
287     * @since 1.0.0
288     */
289    protected function compileDropDatabase(BuilderAbstract $query, string $database) : string
290    {
291        $expression = $this->expressionizeTableColumn([$database]);
292
293        if ($expression === '') {
294            $expression = '*';
295        }
296
297        return 'DROP DATABASE ' . $expression;
298    }
299
300    /**
301     * Compile drop query.
302     *
303     * @param BuilderAbstract $query  Query
304     * @param array           $tables Tables to drop
305     *
306     * @return string
307     *
308     * @since 1.0.0
309     */
310    protected function compileDropTable(BuilderAbstract $query, array $tables) : string
311    {
312        $expression = $this->expressionizeTableColumn($tables);
313
314        if ($expression === '') {
315            $expression = '*';
316        }
317
318        return 'DROP TABLE ' . $expression;
319    }
320}