Test Failed
Pull Request — master (#240)
by Sergei
09:42 queued 03:12
created

DQLQueryBuilder::buildWithQueries()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 3
c 1
b 0
f 0
nc 2
nop 2
dl 0
loc 7
ccs 6
cts 6
cp 1
crap 2
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Db\Oracle;
6
7
use Yiisoft\Db\Expression\ExpressionInterface;
8
use Yiisoft\Db\Oracle\Builder\InConditionBuilder;
9
use Yiisoft\Db\Oracle\Builder\LikeConditionBuilder;
10
use Yiisoft\Db\QueryBuilder\AbstractDQLQueryBuilder;
11
use Yiisoft\Db\QueryBuilder\Condition\InCondition;
12
use Yiisoft\Db\QueryBuilder\Condition\LikeCondition;
13
14
use function array_merge;
15
use function implode;
16
17
/**
18
 * Implements a DQL (Data Query Language) SQL statements for Oracle Server.
19
 */
20
final class DQLQueryBuilder extends AbstractDQLQueryBuilder
21
{
22 221
    public function buildOrderByAndLimit(
23
        string $sql,
24
        array $orderBy,
25
        ExpressionInterface|int|null $limit,
26
        ExpressionInterface|int|null $offset,
27
        array &$params = []
28
    ): string {
29 221
        $orderByString = $this->buildOrderBy($orderBy, $params);
30
31 221
        if ($orderByString !== '') {
32 6
            $sql .= $this->separator . $orderByString;
33
        }
34
35 221
        $filters = [];
36
37 221
        if ($this->hasOffset($offset)) {
38 2
            $filters[] = 'rowNumId > ' .
39 2
                ($offset instanceof ExpressionInterface ? $this->buildExpression($offset) : (string)$offset);
40
        }
41
42 221
        if ($this->hasLimit($limit)) {
43 14
            $filters[] = 'rownum <= ' .
44 14
                ($limit instanceof ExpressionInterface ? $this->buildExpression($limit) : (string)$limit);
45
        }
46
47 221
        if (empty($filters)) {
48 212
            return $sql;
49
        }
50
51 15
        $filter = implode(' AND ', $filters);
52 15
        return <<<SQL
53 15
        WITH USER_SQL AS ($sql), PAGINATION AS (SELECT USER_SQL.*, rownum as rowNumId FROM USER_SQL)
54 15
        SELECT * FROM PAGINATION WHERE $filter
55 15
        SQL;
56
    }
57
58 1
    public function selectExists(string $rawSql): string
59
    {
60 1
        return 'SELECT CASE WHEN EXISTS(' . $rawSql . ') THEN 1 ELSE 0 END FROM DUAL';
61
    }
62
63 511
    public function buildWithQueries(array $withs, array &$params): string
64
    {
65 511
        foreach ($withs as &$with) {
66 511
            $with['recursive'] = false;
67 511
        }
68 511
69 511
        return parent::buildWithQueries($withs, $params);
70 511
    }
71 511
72
    protected function defaultExpressionBuilders(): array
73
    {
74
        return array_merge(
75
            parent::defaultExpressionBuilders(),
76
            [
77
                InCondition::class => InConditionBuilder::class,
78
                LikeCondition::class => LikeConditionBuilder::class,
79
            ],
80
        );
81
    }
82
}
83