Passed
Push — main ( 77200e...ac11d9 )
by Peter
02:38
created

Insert::getRawValues()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
eloc 7
c 0
b 0
f 0
nc 3
nop 0
dl 0
loc 12
rs 10
ccs 8
cts 8
cp 1
crap 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace QB\Generic\Statement;
6
7
use QB\Generic\Clause\Table;
8
use QB\Generic\IQueryPart;
9
10
class Insert implements IInsert
11
{
12
    /** @var array<int,string|Table> */
13
    protected array $tables = [];
14
15
    /** @var string[] */
16
    protected array $modifiers = [];
17
18
    /** @var array<int|string,string> */
19
    protected array $columns = [];
20
21
    /** @var array<int,mixed> */
22
    protected array $rawValues = [];
23
24
    /**
25
     * @param string|Table $table
26
     *
27
     * @return $this
28
     */
29 28
    public function setInto(string|Table $table): static
30
    {
31 28
        $this->tables = [$table];
32
33 28
        return $this;
34
    }
35
36
    /**
37
     * @param string ...$modifiers
38
     *
39
     * @return $this
40
     */
41 1
    public function addModifier(string ...$modifiers): static
42
    {
43 1
        $this->modifiers = array_merge($this->modifiers, $modifiers);
44
45 1
        return $this;
46
    }
47
48
    /**
49
     * @param string ...$columns
50
     *
51
     * @return $this
52
     */
53 20
    public function setColumns(string ...$columns): static
54
    {
55 20
        if (count($this->rawValues) > 0 && count($columns) !== count($this->rawValues[0])) {
56 3
            throw new \InvalidArgumentException('number of columns does not match the number of values');
57
        }
58
59 17
        $this->columns = $columns;
60
61 17
        return $this;
62
    }
63
64
    /**
65
     * @param mixed ...$values
66
     *
67
     * @return $this
68
     */
69 24
    public function addValues(...$values): static
70
    {
71 24
        if (count($this->columns) > 0 && count($values) !== count($this->columns)) {
72 3
            throw new \InvalidArgumentException('number of values does not match the number of columns');
73
        }
74
75 21
        $this->rawValues[] = $values;
76
77 21
        return $this;
78
    }
79
80
    /**
81
     * @return string
82
     */
83 17
    public function __toString(): string
84
    {
85 17
        if (!$this->isValid()) {
86 3
            throw new \RuntimeException('under-initialized INSERT query');
87
        }
88
89 14
        $sqlParts = array_merge(
90 14
            [$this->getCommand()],
91 14
            $this->getRawValues(),
92
        );
93
94 14
        $sqlParts = array_filter($sqlParts);
95
96 14
        return implode(PHP_EOL, $sqlParts);
97
    }
98
99
    /**
100
     * @return bool
101
     */
102 5
    public function isValid(): bool
103
    {
104 5
        return count($this->tables) === 1 && count($this->rawValues) > 0;
105
    }
106
107 14
    protected function getCommand(): string
108
    {
109 14
        $sql = [];
110 14
        $sql[] = 'INSERT';
111 14
        $sql[] = $this->getModifiers();
112 14
        $sql[] = 'INTO';
113 14
        $sql[] = $this->tables[0];
114
115 14
        $sql = array_filter($sql);
116
117 14
        $sql = implode(' ', $sql);
118
119 14
        if (count($this->columns) === 0) {
120 6
            return $sql;
121
        }
122
123 8
        return $sql . ' (' . implode(', ', $this->columns) . ')';
124
    }
125
126 14
    protected function getModifiers(): string
127
    {
128 14
        if (empty($this->modifiers)) {
129 11
            return '';
130
        }
131
132 3
        return implode(' ', $this->modifiers);
133
    }
134
135
    /**
136
     * @return string[]
137
     */
138 12
    protected function getRawValues(): array
139
    {
140 12
        $lines = [];
141 12
        foreach ($this->rawValues as $values) {
142 12
            $line = [];
143 12
            foreach ($values as $value) {
144 12
                $line[] = (string)$value;
145
            }
146 12
            $lines[] = '(' . implode(', ', $line) . ')';
147
        }
148
149 12
        return ['VALUES ' . implode(",\n", $lines)];
150
    }
151
152
    /**
153
     * @return array
154
     */
155 3
    public function getParams(): array
156
    {
157 3
        $params = [];
158
159 3
        foreach ($this->rawValues as $values) {
160 3
            foreach ($values as $value) {
161 3
                if ($value instanceof IQueryPart) {
162
                    $params = array_merge($params, $value->getParams());
163
                }
164
            }
165
        }
166
167 3
        return $params;
168
    }
169
170
    /**
171
     * @return array
172
     */
173 3
    public function values(): array
174
    {
175 3
        return array_merge(...$this->rawValues);
176
    }
177
}
178