Passed
Push — master ( c65027...a39d50 )
by Wilmer
18:53 queued 16:02
created

BetweenConditionBuilder   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 35
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 5
eloc 10
dl 0
loc 35
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 2 1
A createPlaceholder() 0 7 2
A build() 0 12 2
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\QueryBuilderInterface;
14
use Yiisoft\Db\QueryBuilder\Condition\Interface\BetweenConditionInterface;
15
16
use function str_contains;
17
18
/**
19
 * Class BetweenConditionBuilder builds objects of {@see BetweenCondition}.
20
 */
21
class BetweenConditionBuilder implements ExpressionBuilderInterface
22
{
23
    public function __construct(private QueryBuilderInterface $queryBuilder)
24
    {
25
    }
26
27
    /**
28
     * @throws Exception|InvalidArgumentException|InvalidConfigException|NotSupportedException
29
     */
30
    public function build(BetweenConditionInterface $expression, array &$params = []): string
31
    {
32
        $operator = $expression->getOperator();
33
        $column = (string) $expression->getColumn();
34
35
        if (!str_contains($column, '(')) {
36
            $column = $this->queryBuilder->quoter()->quoteColumnName($column);
37
        }
38
39
        $phName1 = $this->createPlaceholder($expression->getIntervalStart(), $params);
40
        $phName2 = $this->createPlaceholder($expression->getIntervalEnd(), $params);
41
        return "$column $operator $phName1 AND $phName2";
42
    }
43
44
    /**
45
     * Attaches $value to $params array and returns placeholder.
46
     *
47
     * @throws Exception|InvalidArgumentException|InvalidConfigException|NotSupportedException
48
     */
49
    protected function createPlaceholder(mixed $value, array &$params): string
50
    {
51
        if ($value instanceof ExpressionInterface) {
52
            return $this->queryBuilder->buildExpression($value, $params);
53
        }
54
55
        return $this->queryBuilder->bindParam($value, $params);
56
    }
57
}
58