UpdateBuilder   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 84
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 26
dl 0
loc 84
ccs 26
cts 26
cp 1
rs 10
c 0
b 0
f 0
wmc 9

6 Methods

Rating   Name   Duplication   Size   Complexity  
A buildTo() 0 7 2
A getLastParts() 0 3 1
A getInitialParts() 0 3 1
A buildSet() 0 13 3
A getRequiredParts() 0 3 1
A getPartBuilders() 0 9 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\Pdo\MySql\Builders;
19
20
use ArekX\PQL\Contracts\StructuredQuery;
21
use ArekX\PQL\Drivers\Pdo\MySql\Builders\Traits\JoinTrait;
22
use ArekX\PQL\Drivers\Pdo\MySql\Builders\Traits\NumberPartTrait;
23
use ArekX\PQL\Drivers\Pdo\MySql\Builders\Traits\QuoteNameTrait;
24
use ArekX\PQL\Drivers\Pdo\MySql\Builders\Traits\SubQueryTrait;
25
use ArekX\PQL\Drivers\Pdo\MySql\Builders\Traits\WhereTrait;
26
use ArekX\PQL\Drivers\Pdo\MySql\Builders\Traits\WrapValueTrait;
27
use ArekX\PQL\Drivers\Pdo\MySql\MySqlQueryBuilderState;
28
use ArekX\PQL\Sql\Query\Update;
29
30
/**
31
 * Represents a query builder for building UPDATE query.
32
 *
33
 * @see Update
34
 */
35
class UpdateBuilder extends QueryPartBuilder
36
{
37
    use QuoteNameTrait;
38
    use WrapValueTrait;
39
    use SubQueryTrait;
40
    use JoinTrait;
41
    use WhereTrait;
42
    use NumberPartTrait;
43
44
    /**
45
     * @inheritDoc
46
     */
47 7
    protected function getInitialParts(): array
48
    {
49 7
        return ['UPDATE'];
50
    }
51
52
    /**
53
     * @inheritDoc
54
     */
55 7
    protected function getRequiredParts(): array
56
    {
57 7
        return ['to', 'set'];
58
    }
59
60
    /**
61
     * @inheritDoc
62
     */
63 7
    protected function getPartBuilders(): array
64
    {
65 7
        return [
66 7
            'to' => fn($parts, $state) => $this->buildTo($parts, $state),
67 7
            'join' => fn($parts, $state) => $this->buildJoin($parts, $state),
68 7
            'set' => fn($parts, $state) => $this->buildSet($parts, $state),
69 7
            'where' => fn($parts, $state) => $this->buildWhere($parts, $state),
70 7
            'limit' => fn($parts) => $this->buildLimit($parts),
71 7
            'offset' => fn($parts) => $this->buildOffset($parts),
72 7
        ];
73
    }
74
75
    /**
76
     * Builds table which will be updated.
77
     *
78
     * @param string|StructuredQuery $parts Part which will be updated.
79
     * @param MySqlQueryBuilderState $state Query builder state.
80
     * @return string
81
     */
82 7
    protected function buildTo(StructuredQuery|string $parts, MySqlQueryBuilderState $state): string
83
    {
84 7
        if ($parts instanceof StructuredQuery) {
85 1
            return $this->buildQuery($parts, $state);
86
        }
87
88 7
        return $this->quoteName($parts);
89
    }
90
91
    /**
92
     * Build SET part.
93
     *
94
     * @param array|StructuredQuery $parts Part to be built
95
     * @param MySqlQueryBuilderState $state Query builder state
96
     * @return string
97
     */
98 7
    protected function buildSet(StructuredQuery|array $parts, MySqlQueryBuilderState $state): string
99
    {
100 7
        if ($parts instanceof StructuredQuery) {
101 1
            return 'SET ' . $this->buildQuery($parts, $state);
102
        }
103
104 7
        $results = [];
105
106 7
        foreach ($parts as $key => $value) {
107 7
            $results[] = $this->quoteName($key) . ' = ' . $this->buildWrapValue($value, $state);
108
        }
109
110 7
        return 'SET ' . implode(', ', $results);
111
    }
112
113
    /**
114
     * @inheritDoc
115
     */
116 7
    protected function getLastParts(): array
117
    {
118 7
        return [];
119
    }
120
}
121