Skip to content

Commit 0372646

Browse files
authored
Adapt for changes in db (#448)
1 parent 2dc56df commit 0372646

5 files changed

Lines changed: 49 additions & 44 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
- New #408, #410: Implement `DMLQueryBuilder::upsertReturning()` method (@Tigrov)
4646
- Enh #412: Reduce binding parameters (@Tigrov)
4747
- Chg #414: Rename `DMLQueryBuilder::insertWithReturningPks()` to `DMLQueryBuilder::insertReturningPks()` (@Tigrov)
48-
- Enh #415: Implement `CaseExpressionBuilder` class (@Tigrov)
48+
- Enh #415, #448: Implement `CaseExpressionBuilder` class (@Tigrov)
4949
- Enh #420: Provide `yiisoft/db-implementation` virtual package (@vjik)
5050
- Enh #424, #425, #428: Adapt to conditions refactoring in `yiisoft/db` package (@vjik)
5151
- Enh #431: Remove `TableSchema` class and refactor `Schema` class (@Tigrov)
Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,44 +4,35 @@
44

55
namespace Yiisoft\Db\Pgsql\Builder;
66

7-
use InvalidArgumentException;
8-
use Yiisoft\Db\Expression\Statement\CaseExpression;
7+
use Yiisoft\Db\Expression\Statement\CaseX;
98
use Yiisoft\Db\Expression\ExpressionInterface;
109
use Yiisoft\Db\Schema\Column\ColumnInterface;
1110

1211
use function is_string;
1312

1413
/**
15-
* Builds expressions for {@see CaseExpression}.
14+
* Builds expressions for {@see CaseX}.
1615
*/
17-
final class CaseExpressionBuilder extends \Yiisoft\Db\Expression\Statement\Builder\CaseExpressionBuilder
16+
final class CaseXBuilder extends \Yiisoft\Db\Expression\Statement\Builder\CaseXBuilder
1817
{
1918
public function build(ExpressionInterface $expression, array &$params = []): string
2019
{
21-
$whenClauses = $expression->getWhen();
22-
23-
if (empty($whenClauses)) {
24-
throw new InvalidArgumentException('The CASE expression must have at least one WHEN clause.');
25-
}
26-
2720
$sql = 'CASE';
2821

29-
$case = $expression->getCase();
30-
31-
if ($case !== null) {
32-
$caseTypeHint = $this->buildTypeHint($expression->getCaseType());
33-
$sql .= ' ' . $this->buildConditionWithTypeHint($case, $caseTypeHint, $params);
22+
if ($expression->value !== null) {
23+
$caseTypeHint = $this->buildTypeHint($expression->valueType);
24+
$sql .= ' ' . $this->buildConditionWithTypeHint($expression->value, $caseTypeHint, $params);
3425
} else {
3526
$caseTypeHint = '';
3627
}
3728

38-
foreach ($whenClauses as $when) {
29+
foreach ($expression->when as $when) {
3930
$sql .= ' WHEN ' . $this->buildConditionWithTypeHint($when->condition, $caseTypeHint, $params);
4031
$sql .= ' THEN ' . $this->buildResult($when->result, $params);
4132
}
4233

4334
if ($expression->hasElse()) {
44-
$sql .= ' ELSE ' . $this->buildResult($expression->getElse(), $params);
35+
$sql .= ' ELSE ' . $this->buildResult($expression->else, $params);
4536
}
4637

4738
return $sql . ' END';

src/DQLQueryBuilder.php

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

77
use Yiisoft\Db\Expression\Value\ArrayExpression;
8-
use Yiisoft\Db\Expression\Statement\CaseExpression;
8+
use Yiisoft\Db\Expression\Statement\CaseX;
99
use Yiisoft\Db\Expression\Function\ArrayMerge;
1010
use Yiisoft\Db\Expression\Value\JsonExpression;
1111
use Yiisoft\Db\Expression\Value\StructuredExpression;
1212
use Yiisoft\Db\Pgsql\Builder\ArrayExpressionBuilder;
1313
use Yiisoft\Db\Pgsql\Builder\ArrayMergeBuilder;
1414
use Yiisoft\Db\Pgsql\Builder\ArrayOverlapsBuilder;
15-
use Yiisoft\Db\Pgsql\Builder\CaseExpressionBuilder;
15+
use Yiisoft\Db\Pgsql\Builder\CaseXBuilder;
1616
use Yiisoft\Db\Pgsql\Builder\JsonOverlapsBuilder;
1717
use Yiisoft\Db\Pgsql\Builder\LikeBuilder;
1818
use Yiisoft\Db\Pgsql\Builder\StructuredExpressionBuilder;
@@ -39,7 +39,7 @@ protected function defaultExpressionBuilders(): array
3939
StructuredExpression::class => StructuredExpressionBuilder::class,
4040
Like::class => LikeBuilder::class,
4141
NotLike::class => LikeBuilder::class,
42-
CaseExpression::class => CaseExpressionBuilder::class,
42+
CaseX::class => CaseXBuilder::class,
4343
ArrayMerge::class => ArrayMergeBuilder::class,
4444
];
4545
}

tests/Provider/QueryBuilderProvider.php

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66

77
use Yiisoft\Db\Constant\DataType;
88
use Yiisoft\Db\Constant\PseudoType;
9+
use Yiisoft\Db\Expression\Statement\When;
910
use Yiisoft\Db\Expression\Value\ArrayExpression;
10-
use Yiisoft\Db\Expression\Statement\CaseExpression;
11+
use Yiisoft\Db\Expression\Statement\CaseX;
1112
use Yiisoft\Db\Expression\Expression;
1213
use Yiisoft\Db\Expression\Function\ArrayMerge;
1314
use Yiisoft\Db\Expression\Value\Param;
15+
use Yiisoft\Db\Expression\Value\Value;
1416
use Yiisoft\Db\Pgsql\Column\ColumnBuilder;
1517
use Yiisoft\Db\Pgsql\Column\IntegerColumn;
1618
use Yiisoft\Db\Pgsql\Tests\Support\TestTrait;
@@ -519,56 +521,68 @@ public static function prepareValue(): array
519521
return $values;
520522
}
521523

522-
public static function caseExpressionBuilder(): array
524+
public static function caseXBuilder(): array
523525
{
524-
$data = parent::caseExpressionBuilder();
526+
$data = parent::caseXBuilder();
525527

526528
$db = self::getDb();
527529
$serverVersion = $db->getServerInfo()->getVersion();
528530
$db->close();
529531

530532
if (version_compare($serverVersion, '10', '<')) {
531533
$data['without case expression'] = [
532-
(new CaseExpression())
533-
->addWhen(['=', 'column_name', 1], $paramA = new Param('a', DataType::STRING))
534-
->addWhen(
534+
new CaseX(
535+
when1: new When(['=', 'column_name', 1], new Value('a')),
536+
when2: new When(
535537
'"column_name" = 2',
536538
$db->select(new Expression(
537539
':pv2::text',
538-
[':pv2' => $paramB = new Param('b', DataType::STRING)],
540+
[':pv2' => $param = new Param('b', DataType::STRING)],
539541
)),
540542
),
543+
),
541544
'CASE WHEN "column_name" = 1 THEN :qp0 WHEN "column_name" = 2 THEN (SELECT :pv2::text) END',
542-
[':qp0' => $paramA, ':pv2' => $paramB],
545+
[
546+
':qp0' => new Param('a', DataType::STRING),
547+
':pv2' => $param,
548+
],
543549
'b',
544550
];
545551
}
546552

547553
return [
548554
...$data,
549555
'without case and type hint' => [
550-
(new CaseExpression())->caseType('int')
551-
->addWhen(true, "'a'"),
556+
new CaseX(
557+
valueType: 'int',
558+
when: new When(true, "'a'"),
559+
),
552560
"CASE WHEN TRUE THEN 'a' END",
553561
[],
554562
'a',
555563
],
556564
'with case and type hint' => [
557-
(new CaseExpression('1 + 1', 'int'))
558-
->addWhen(1, "'a'")
559-
->else("'b'"),
565+
new CaseX(
566+
'1 + 1',
567+
'int',
568+
new When(1, "'a'"),
569+
"'b'",
570+
),
560571
"CASE (1 + 1)::int WHEN (1)::int THEN 'a' ELSE 'b' END",
561572
[],
562573
'b',
563574
],
564575
'with case and type hint with column' => [
565-
(new CaseExpression('1 + 1', new IntegerColumn()))
566-
->addWhen(1, $paramA = new Param('a', DataType::STRING))
567-
->else($paramB = new Param('b', DataType::STRING)),
576+
new CaseX(
577+
'1 + 1',
578+
new IntegerColumn(),
579+
new When(1, new Value('a')),
580+
$param = new Param('b', DataType::STRING),
581+
),
568582
'CASE (1 + 1)::integer WHEN (1)::integer THEN :qp0 ELSE :qp1 END',
569583
[
570-
':qp0' => $paramA,
571-
':qp1' => $paramB,
584+
':qp0' => new Param('a', DataType::STRING),
585+
':qp1' => $param,
572586
],
573587
'b',
574588
],

tests/QueryBuilderTest.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
use Yiisoft\Db\Exception\IntegrityException;
1212
use Yiisoft\Db\Exception\NotSupportedException;
1313
use Yiisoft\Db\Expression\Value\ArrayExpression;
14-
use Yiisoft\Db\Expression\Statement\CaseExpression;
14+
use Yiisoft\Db\Expression\Statement\CaseX;
1515
use Yiisoft\Db\Expression\Expression;
1616
use Yiisoft\Db\Expression\ExpressionInterface;
1717
use Yiisoft\Db\Expression\Function\ArrayMerge;
@@ -585,14 +585,14 @@ public function testPrepareValue(string $expected, mixed $value): void
585585
parent::testPrepareValue($expected, $value);
586586
}
587587

588-
#[DataProviderExternal(QueryBuilderProvider::class, 'caseExpressionBuilder')]
589-
public function testCaseExpressionBuilder(
590-
CaseExpression $case,
588+
#[DataProviderExternal(QueryBuilderProvider::class, 'caseXBuilder')]
589+
public function testCaseXBuilder(
590+
CaseX $case,
591591
string $expectedSql,
592592
array $expectedParams,
593593
string|int $expectedResult,
594594
): void {
595-
parent::testCaseExpressionBuilder($case, $expectedSql, $expectedParams, $expectedResult);
595+
parent::testCaseXBuilder($case, $expectedSql, $expectedParams, $expectedResult);
596596
}
597597

598598
#[DataProviderExternal(QueryBuilderProvider::class, 'lengthBuilder')]

0 commit comments

Comments
 (0)