Passed
Push — master ( 3cf8ec...4591f3 )
by Wilmer
16:32 queued 14:58
created

InConditionBuilder   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 62
Duplicated Lines 0 %

Test Coverage

Coverage 89.47%

Importance

Changes 0
Metric Value
eloc 19
dl 0
loc 62
ccs 17
cts 19
cp 0.8947
rs 10
c 0
b 0
f 0
wmc 12

2 Methods

Rating   Name   Duplication   Size   Complexity  
B buildCompositeInCondition() 0 25 10
A buildSubqueryInCondition() 0 7 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Db\Sqlite\Condition;
6
7
use Yiisoft\Db\Exception\Exception;
8
use Yiisoft\Db\Exception\InvalidConfigException;
9
use Yiisoft\Db\Exception\NotSupportedException;
10
use Yiisoft\Db\Query\Query;
11
use Yiisoft\Db\Query\Conditions\InConditionBuilder as BaseInConditionBuilder;
12
13
class InConditionBuilder extends BaseInConditionBuilder
14
{
15
    /**
16
     * Builds SQL for IN condition.
17
     *
18
     * @param string $operator
19
     * @param array|string $columns
20
     * @param Query $values
21
     * @param array $params
22
     *
23
     * @throws NotSupportedException
24
     *
25
     * @return string SQL.
26
     */
27 2
    protected function buildSubqueryInCondition(string $operator, $columns, Query $values, array &$params = []): string
28
    {
29 2
        if (\is_array($columns)) {
30
            throw new NotSupportedException(__METHOD__ . ' is not supported by SQLite.');
31
        }
32
33 2
        return parent::buildSubqueryInCondition($operator, $columns, $values, $params);
34
    }
35
36
    /**
37
     * Builds SQL for IN condition.
38
     *
39
     * @param string $operator
40
     * @param array|\Traversable $columns
41
     * @param array|object $values
42
     * @param array $params
43
     *
44
     * @throws NotSupportedException
45
     * @throws Exception
46
     * @throws InvalidConfigException
47
     *
48
     * @return string SQL.
49
     */
50 2
    protected function buildCompositeInCondition(?string $operator, $columns, $values, array &$params = []): string
51
    {
52 2
        $quotedColumns = [];
53
54 2
        foreach ($columns as $i => $column) {
55 2
            $quotedColumns[$i] = \strpos($column, '(') === false
56 2
                ? $this->queryBuilder->getDb()->quoteColumnName($column) : $column;
57
        }
58
59 2
        $vss = [];
60
61 2
        foreach ($values as $value) {
62 2
            $vs = [];
63 2
            foreach ($columns as $i => $column) {
64 2
                if (isset($value[$column])) {
65 2
                    $phName = $this->queryBuilder->bindParam($value[$column], $params);
66 2
                    $vs[] = $quotedColumns[$i] . ($operator === 'IN' ? ' = ' : ' != ') . $phName;
67
                } else {
68
                    $vs[] = $quotedColumns[$i] . ($operator === 'IN' ? ' IS' : ' IS NOT') . ' NULL';
69
                }
70
            }
71 2
            $vss[] = '(' . \implode($operator === 'IN' ? ' AND ' : ' OR ', $vs) . ')';
72
        }
73
74 2
        return '(' . \implode($operator === 'IN' ? ' OR ' : ' AND ', $vss) . ')';
75
    }
76
}
77