Skip to content

Commit dae6772

Browse files
authored
Adapt to split Like condition in Yii DB (#436)
1 parent 6264c10 commit dae6772

File tree

3 files changed

+19
-37
lines changed

3 files changed

+19
-37
lines changed

src/Builder/LikeBuilder.php

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,18 @@
55
namespace Yiisoft\Db\Pgsql\Builder;
66

77
use Yiisoft\Db\QueryBuilder\Condition\Like;
8+
use Yiisoft\Db\QueryBuilder\Condition\NotLike;
89

910
/**
1011
* Build an object of {@see Like} into SQL expressions for PostgreSQL Server.
1112
*/
1213
final class LikeBuilder extends \Yiisoft\Db\QueryBuilder\Condition\Builder\LikeBuilder
1314
{
14-
protected function parseOperator(Like $condition): array
15+
protected function getOperatorData(Like|NotLike $condition): array
1516
{
16-
[$not, $operator] = parent::parseOperator($condition);
17-
18-
$operator = match ($condition->caseSensitive) {
19-
true => 'LIKE',
20-
false => 'ILIKE',
21-
default => $operator,
17+
return match ($condition::class) {
18+
Like::class => [false, $condition->caseSensitive === false ? 'ILIKE' : 'LIKE'],
19+
NotLike::class => [true, $condition->caseSensitive === false ? 'NOT ILIKE' : 'NOT LIKE'],
2220
};
23-
24-
return [$not, $operator];
2521
}
2622
}

src/DQLQueryBuilder.php

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,28 +19,13 @@
1919
use Yiisoft\Db\QueryBuilder\Condition\Like;
2020
use Yiisoft\Db\QueryBuilder\Condition\ArrayOverlaps;
2121
use Yiisoft\Db\QueryBuilder\Condition\JsonOverlaps;
22+
use Yiisoft\Db\QueryBuilder\Condition\NotLike;
2223

2324
/**
2425
* Implements a DQL (Data Query Language) SQL statements for PostgreSQL Server.
2526
*/
2627
final class DQLQueryBuilder extends AbstractDQLQueryBuilder
2728
{
28-
/**
29-
* Has an array of default condition classes.
30-
*
31-
* Extend this method if you want to change default condition classes for the query builder.
32-
*
33-
* {@see conditionClasses} docs for details.
34-
*/
35-
protected function defaultConditionClasses(): array
36-
{
37-
return [
38-
...parent::defaultConditionClasses(),
39-
'ILIKE' => Like::class,
40-
'NOT ILIKE' => Like::class,
41-
];
42-
}
43-
4429
protected function defaultExpressionBuilders(): array
4530
{
4631
return [
@@ -51,6 +36,7 @@ protected function defaultExpressionBuilders(): array
5136
JsonOverlaps::class => JsonOverlapsBuilder::class,
5237
StructuredExpression::class => StructuredExpressionBuilder::class,
5338
Like::class => LikeBuilder::class,
39+
NotLike::class => LikeBuilder::class,
5440
CaseExpression::class => CaseExpressionBuilder::class,
5541
];
5642
}

tests/Provider/QueryBuilderProvider.php

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,34 +66,34 @@ public static function buildCondition(): array
6666
* {@see https://www.postgresql.org/docs/8.3/static/functions-matching.html#FUNCTIONS-LIKE}
6767
*/
6868
/* empty values */
69-
[['ilike', 'name', []], '0=1', []],
70-
[['not ilike', 'name', []], '', []],
71-
[['ilike', 'name', [], 'conjunction' => LikeConjunction::Or], '0=1', []],
72-
[['not ilike', 'name', [], 'conjunction' => LikeConjunction::Or], '', []],
69+
[['like', 'name', [], 'caseSensitive' => false], '0=1', []],
70+
[['not like', 'name', [], 'caseSensitive' => false], '', []],
71+
[['like', 'name', [], 'conjunction' => LikeConjunction::Or, 'caseSensitive' => false], '0=1', []],
72+
[['not like', 'name', [], 'conjunction' => LikeConjunction::Or, 'caseSensitive' => false], '', []],
7373

7474
/* simple ilike */
75-
[['ilike', 'name', 'heyho'], '"name" ILIKE :qp0', [':qp0' => new Param('%heyho%', DataType::STRING)]],
76-
[['not ilike', 'name', 'heyho'], '"name" NOT ILIKE :qp0', [':qp0' => new Param('%heyho%', DataType::STRING)]],
77-
[['ilike', 'name', 'heyho', 'conjunction' => LikeConjunction::Or], '"name" ILIKE :qp0', [':qp0' => new Param('%heyho%', DataType::STRING)]],
78-
[['not ilike', 'name', 'heyho', 'conjunction' => LikeConjunction::Or], '"name" NOT ILIKE :qp0', [':qp0' => new Param('%heyho%', DataType::STRING)]],
75+
[['like', 'name', 'heyho', 'caseSensitive' => false], '"name" ILIKE :qp0', [':qp0' => new Param('%heyho%', DataType::STRING)]],
76+
[['not like', 'name', 'heyho', 'caseSensitive' => false], '"name" NOT ILIKE :qp0', [':qp0' => new Param('%heyho%', DataType::STRING)]],
77+
[['like', 'name', 'heyho', 'conjunction' => LikeConjunction::Or, 'caseSensitive' => false], '"name" ILIKE :qp0', [':qp0' => new Param('%heyho%', DataType::STRING)]],
78+
[['not like', 'name', 'heyho', 'conjunction' => LikeConjunction::Or, 'caseSensitive' => false], '"name" NOT ILIKE :qp0', [':qp0' => new Param('%heyho%', DataType::STRING)]],
7979

8080
/* ilike for many values */
8181
[
82-
['ilike', 'name', ['heyho', 'abc']],
82+
['like', 'name', ['heyho', 'abc'], 'caseSensitive' => false],
8383
'"name" ILIKE :qp0 AND "name" ILIKE :qp1',
8484
[':qp0' => new Param('%heyho%', DataType::STRING), ':qp1' => new Param('%abc%', DataType::STRING)],
8585
],
8686
[
87-
['not ilike', 'name', ['heyho', 'abc']],
87+
['not like', 'name', ['heyho', 'abc'], 'caseSensitive' => false],
8888
'"name" NOT ILIKE :qp0 AND "name" NOT ILIKE :qp1',
8989
[':qp0' => new Param('%heyho%', DataType::STRING), ':qp1' => new Param('%abc%', DataType::STRING)],
9090
],
9191
[
92-
['ilike', 'name', ['heyho', 'abc'], 'conjunction' => LikeConjunction::Or],
92+
['like', 'name', ['heyho', 'abc'], 'conjunction' => LikeConjunction::Or, 'caseSensitive' => false],
9393
'"name" ILIKE :qp0 OR "name" ILIKE :qp1', [':qp0' => new Param('%heyho%', DataType::STRING), ':qp1' => new Param('%abc%', DataType::STRING)],
9494
],
9595
[
96-
['not ilike', 'name', ['heyho', 'abc'], 'conjunction' => LikeConjunction::Or],
96+
['not like', 'name', ['heyho', 'abc'], 'conjunction' => LikeConjunction::Or, 'caseSensitive' => false],
9797
'"name" NOT ILIKE :qp0 OR "name" NOT ILIKE :qp1',
9898
[':qp0' => new Param('%heyho%', DataType::STRING), ':qp1' => new Param('%abc%', DataType::STRING)],
9999
],

0 commit comments

Comments
 (0)