Passed
Push — master ( 4ac107...bec696 )
by Aleksandar
72:47
created

SelectBuilder   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 107
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 34
dl 0
loc 107
ccs 34
cts 34
cp 1
rs 10
c 1
b 0
f 0
wmc 13

7 Methods

Rating   Name   Duplication   Size   Complexity  
A buildGroupBy() 0 12 3
A getLastParts() 0 3 1
A buildHaving() 0 3 1
A getInitialParts() 0 3 1
A buildOrderBy() 0 16 5
A getRequiredParts() 0 3 1
A getPartBuilders() 0 12 1
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\MySql\Builder\Builders;
19
20
use ArekX\PQL\Contracts\StructuredQuery;
21
use ArekX\PQL\Drivers\MySql\Builder\Builders\Traits\AliasTrait;
22
use ArekX\PQL\Drivers\MySql\Builder\Builders\Traits\FromPartTrait;
23
use ArekX\PQL\Drivers\MySql\Builder\Builders\Traits\JoinTrait;
24
use ArekX\PQL\Drivers\MySql\Builder\Builders\Traits\NumberPartTrait;
25
use ArekX\PQL\Drivers\MySql\Builder\Builders\Traits\WhereTrait;
26
use ArekX\PQL\Drivers\MySql\Builder\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 10
    protected function getInitialParts(): array
46
    {
47 10
        return ['SELECT'];
48
    }
49
50
    /**
51
     * @inheritDoc
52
     */
53 10
    protected function getRequiredParts(): array
54
    {
55 10
        return [];
56
    }
57
58
    /**
59
     * @inheritDoc
60
     */
61 10
    protected function getPartBuilders(): array
62
    {
63
        return [
64 10
            'columns' => fn($part, $state) => $this->buildAliasedNames($part, $state),
65 10
            'from' => fn($part, $state) => $this->buildFrom($part, $state),
66 10
            'join' => fn($part, $state) => $this->buildJoin($part, $state),
67 10
            'where' => fn($part, $state) => $this->buildWhere($part, $state),
68 10
            'groupBy' => fn($part, $state) => $this->buildGroupBy($part, $state),
69 10
            'having' => fn($part, $state) => $this->buildHaving($part, $state),
70 10
            'orderBy' => fn($part, $state) => $this->buildOrderBy($part, $state),
71 10
            'limit' => fn($part) => $this->buildLimit($part),
72 10
            'offset' => fn($part) => $this->buildOffset($part),
73
        ];
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($groupBy, MySqlQueryBuilderState $state)
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($condition, MySqlQueryBuilderState $state)
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($orders, $state)
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 10
    protected function getLastParts(): array
139
    {
140 10
        return [];
141
    }
142
}