-
-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathDQLQueryBuilder.php
93 lines (76 loc) · 2.76 KB
/
DQLQueryBuilder.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?php
declare(strict_types=1);
namespace Yiisoft\Db\Oracle;
use Yiisoft\Db\Expression\Expression;
use Yiisoft\Db\Expression\ExpressionInterface;
use Yiisoft\Db\Oracle\Builder\ExpressionBuilder;
use Yiisoft\Db\Oracle\Builder\InConditionBuilder;
use Yiisoft\Db\Oracle\Builder\LikeConditionBuilder;
use Yiisoft\Db\Query\Query;
use Yiisoft\Db\QueryBuilder\AbstractDQLQueryBuilder;
use Yiisoft\Db\QueryBuilder\Condition\InCondition;
use Yiisoft\Db\QueryBuilder\Condition\LikeCondition;
use function implode;
/**
* Implements a DQL (Data Query Language) SQL statements for Oracle Server.
*/
final class DQLQueryBuilder extends AbstractDQLQueryBuilder
{
public function buildOrderByAndLimit(
string $sql,
array $orderBy,
ExpressionInterface|int|null $limit,
ExpressionInterface|int|null $offset,
array &$params = []
): string {
$orderByString = $this->buildOrderBy($orderBy, $params);
if ($orderByString !== '') {
$sql .= $this->separator . $orderByString;
}
$filters = [];
if ($this->hasOffset($offset)) {
$filters[] = 'rowNumId > ' .
($offset instanceof ExpressionInterface ? $this->buildExpression($offset) : (string)$offset);
}
if ($this->hasLimit($limit)) {
$filters[] = 'rownum <= ' .
($limit instanceof ExpressionInterface ? $this->buildExpression($limit) : (string)$limit);
}
if (empty($filters)) {
return $sql;
}
$filter = implode(' AND ', $filters);
return <<<SQL
WITH USER_SQL AS ($sql), PAGINATION AS (SELECT USER_SQL.*, rownum as rowNumId FROM USER_SQL)
SELECT * FROM PAGINATION WHERE $filter
SQL;
}
public function selectExists(string $rawSql): string
{
return 'SELECT CASE WHEN EXISTS(' . $rawSql . ') THEN 1 ELSE 0 END FROM DUAL';
}
public function buildFrom(array|null $tables, array &$params): string
{
if (empty($tables)) {
return 'FROM DUAL';
}
return parent::buildFrom($tables, $params);
}
public function buildWithQueries(array $withs, array &$params): string
{
/** @psalm-var array{query:string|Query, alias:ExpressionInterface|string, recursive:bool}[] $withs */
foreach ($withs as &$with) {
$with['recursive'] = false;
}
return parent::buildWithQueries($withs, $params);
}
protected function defaultExpressionBuilders(): array
{
return [
...parent::defaultExpressionBuilders(),
InCondition::class => InConditionBuilder::class,
LikeCondition::class => LikeConditionBuilder::class,
Expression::class => ExpressionBuilder::class,
];
}
}