SelectBuilder::getPartBuilders()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 10
nc 1
nop 0
dl 0
loc 12
ccs 11
cts 11
cp 1
crap 1
rs 9.9332
c 0
b 0
f 0
1
<?php
2
/**
3
 * Copyright 2021 Aleksandar Panic
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at
8
 *
9
 *   http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 */
17
18
namespace ArekX\PQL\Drivers\Pdo\MySql\Builders;
19
20
use ArekX\PQL\Contracts\StructuredQuery;
21
use ArekX\PQL\Drivers\Pdo\MySql\Builders\Traits\AliasTrait;
22
use ArekX\PQL\Drivers\Pdo\MySql\Builders\Traits\FromPartTrait;
23
use ArekX\PQL\Drivers\Pdo\MySql\Builders\Traits\JoinTrait;
24
use ArekX\PQL\Drivers\Pdo\MySql\Builders\Traits\NumberPartTrait;
25
use ArekX\PQL\Drivers\Pdo\MySql\Builders\Traits\WhereTrait;
26
use ArekX\PQL\Drivers\Pdo\MySql\MySqlQueryBuilderState;
27
use ArekX\PQL\Sql\Query\Select;
28
29
/**
30
 * Represents a query builder for building a SELECT query.
31
 *
32
 * @see Select
33
 */
34
class SelectBuilder extends QueryPartBuilder
35
{
36
    use AliasTrait;
37
    use FromPartTrait;
38
    use WhereTrait;
39
    use NumberPartTrait;
40
    use JoinTrait;
41
42
    /**
43
     * @inheritDoc
44
     */
45 24
    protected function getInitialParts(): array
46
    {
47 24
        return ['SELECT'];
48
    }
49
50
    /**
51
     * @inheritDoc
52
     */
53 24
    protected function getRequiredParts(): array
54
    {
55 24
        return [];
56
    }
57
58
    /**
59
     * @inheritDoc
60
     */
61 24
    protected function getPartBuilders(): array
62
    {
63 24
        return [
64 24
            'columns' => fn($part, $state) => $this->buildAliasedNames($part, $state),
65 24
            'from' => fn($part, $state) => $this->buildFrom($part, $state),
66 24
            'join' => fn($part, $state) => $this->buildJoin($part, $state),
67 24
            'where' => fn($part, $state) => $this->buildWhere($part, $state),
68 24
            'groupBy' => fn($part, $state) => $this->buildGroupBy($part, $state),
69 24
            'having' => fn($part, $state) => $this->buildHaving($part, $state),
70 24
            'orderBy' => fn($part, $state) => $this->buildOrderBy($part, $state),
71 24
            'limit' => fn($part) => $this->buildLimit($part),
72 24
            'offset' => fn($part) => $this->buildOffset($part),
73 24
        ];
74
    }
75
76
    /**
77
     * Build GROUP BY part
78
     *
79
     * @param array|StructuredQuery $groupBy Part to be build
80
     * @param MySqlQueryBuilderState $state Query builder state
81
     * @return string
82
     */
83 1
    protected function buildGroupBy(StructuredQuery|array $groupBy, MySqlQueryBuilderState $state): string
84
    {
85 1
        if ($groupBy instanceof StructuredQuery) {
86 1
            return 'GROUP BY ' . $this->buildQuery($groupBy, $state);
87
        }
88
89 1
        $result = [];
90 1
        foreach ($groupBy as $name) {
91 1
            $result[] = $this->quoteName($name);
92
        }
93
94 1
        return 'GROUP BY ' . implode(', ', $result);
95
    }
96
97
    /**
98
     * Build HAVING part
99
     *
100
     * @param array|StructuredQuery $condition Condition to be built.
101
     * @param MySqlQueryBuilderState $state Query builder state
102
     * @return string
103
     * @throws \Exception
104
     */
105 1
    protected function buildHaving(StructuredQuery|array $condition, MySqlQueryBuilderState $state): string
106
    {
107 1
        return 'HAVING ' . $this->buildCondition($condition, $state);
108
    }
109
110
    /**
111
     * Build ORDER BY part
112
     *
113
     * @param array|StructuredQuery $orders Part to be built
114
     * @param MySqlQueryBuilderState $state Query builder state
115
     * @return string
116
     */
117 1
    protected function buildOrderBy(StructuredQuery|array $orders, MySqlQueryBuilderState $state): string
118
    {
119 1
        if ($orders instanceof StructuredQuery) {
120 1
            return 'ORDER BY '. $this->buildQuery($orders, $state);
121
        }
122
123 1
        $result = [];
124 1
        foreach ($orders as $by => $order) {
125 1
            if (!is_string($order)) {
126 1
                $order = $order === SORT_ASC ? 'asc' : 'desc';
127
            }
128
129 1
            $result[] = $this->quoteName($by) . ' ' . strtoupper($order);
130
        }
131
132 1
        return 'ORDER BY ' . implode(', ', $result);
133
    }
134
135
    /**
136
     * @inheritDoc
137
     */
138 24
    protected function getLastParts(): array
139
    {
140 24
        return [];
141
    }
142
}
143