ConjunctionConditionBuilder   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 60
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 16
dl 0
loc 60
rs 10
c 0
b 0
f 0
wmc 9

3 Methods

Rating   Name   Duplication   Size   Complexity  
A build() 0 14 3
A buildExpressionsFrom() 0 22 5
A __construct() 0 2 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Db\QueryBuilder\Condition\Builder;
6
7
use Yiisoft\Db\Exception\Exception;
8
use Yiisoft\Db\Exception\InvalidArgumentException;
9
use Yiisoft\Db\Exception\InvalidConfigException;
10
use Yiisoft\Db\Exception\NotSupportedException;
11
use Yiisoft\Db\Expression\ExpressionBuilderInterface;
12
use Yiisoft\Db\Expression\ExpressionInterface;
13
use Yiisoft\Db\QueryBuilder\Condition\AbstractConjunctionCondition;
14
use Yiisoft\Db\QueryBuilder\Condition\AndCondition;
15
use Yiisoft\Db\QueryBuilder\Condition\Interface\ConjunctionConditionInterface;
16
use Yiisoft\Db\QueryBuilder\QueryBuilderInterface;
17
18
use function count;
19
use function implode;
20
use function is_array;
21
use function reset;
22
23
/**
24
 * Build an object of {@see AbstractConjunctionCondition} into SQL expressions.
25
 */
26
class ConjunctionConditionBuilder implements ExpressionBuilderInterface
27
{
28
    public function __construct(private QueryBuilderInterface $queryBuilder)
29
    {
30
    }
31
32
    /**
33
     * Build SQL for {@see AndCondition} and {@see OrCondition}.
34
     *
35
     * @throws Exception
36
     * @throws InvalidArgumentException
37
     * @throws InvalidConfigException
38
     * @throws NotSupportedException
39
     */
40
    public function build(ConjunctionConditionInterface $expression, array &$params = []): string
41
    {
42
        /** @psalm-var string[] $parts */
43
        $parts = $this->buildExpressionsFrom($expression, $params);
44
45
        if (empty($parts)) {
46
            return '';
47
        }
48
49
        if (count($parts) === 1) {
50
            return reset($parts);
51
        }
52
53
        return '(' . implode(") {$expression->getOperator()} (", $parts) . ')';
54
    }
55
56
    /**
57
     * Builds expressions, that are stored in `$condition`.
58
     *
59
     * @throws Exception
60
     * @throws InvalidArgumentException
61
     * @throws InvalidConfigException
62
     * @throws NotSupportedException
63
     */
64
    private function buildExpressionsFrom(ConjunctionConditionInterface $condition, array &$params = []): array
65
    {
66
        $parts = [];
67
68
        /** @psalm-var array<array-key, array|ExpressionInterface|string> $expressions */
69
        $expressions = $condition->getExpressions();
70
71
        foreach ($expressions as $conditionValue) {
72
            if (is_array($conditionValue)) {
73
                $conditionValue = $this->queryBuilder->buildCondition($conditionValue, $params);
74
            }
75
76
            if ($conditionValue instanceof ExpressionInterface) {
77
                $conditionValue = $this->queryBuilder->buildExpression($conditionValue, $params);
78
            }
79
80
            if ($conditionValue !== '') {
81
                $parts[] = $conditionValue;
82
            }
83
        }
84
85
        return $parts;
86
    }
87
}
88