Skip to content

Commit d3c4361

Browse files
authored
Merge branch 'master' into fix-94
2 parents 5a1e7a8 + a253cc1 commit d3c4361

16 files changed

+231
-245
lines changed

CHANGELOG.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
for type casting performance. Related with yiisoft/db#752 (@Tigrov)
99
- Chg #348: Replace call of `SchemaInterface::getRawTableName()` to `QuoterInterface::getRawTableName()` (@Tigrov)
1010
- Enh #349: Add method chaining for column classes (@Tigrov)
11-
- New #350: Add array overlaps and JSON overlaps condition builders (@Tigrov)
11+
- New #350, #449: Add array overlaps and JSON overlaps condition builders (@Tigrov)
1212
- Enh #353: Update `bit` type according to main PR yiisoft/db#860 (@Tigrov)
1313
- Enh #354: Refactor PHP type of `ColumnSchemaInterface` instances (@Tigrov)
1414
- Enh #356: Raise minimum PHP version to `^8.1` with minor refactoring (@Tigrov)
@@ -31,7 +31,7 @@
3131
- Enh #382: Replace `DbArrayHelper::getColumn()` with `array_column()` (@Tigrov)
3232
- New #384: Add `IndexMethod` class (@Tigrov)
3333
- Bug #387: Explicitly mark nullable parameters (@vjik)
34-
- Enh #386: Refactor array, structured and JSON expression builders (@Tigrov)
34+
- Enh #386, #449: Refactor array, structured and JSON expression builders (@Tigrov)
3535
- Chg #388: Change supported PHP versions to `8.1 - 8.4` (@Tigrov)
3636
- Enh #388: Minor refactoring (@Tigrov)
3737
- Chg #390: Remove `yiisoft/json` dependency (@Tigrov)
@@ -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)
@@ -54,6 +54,7 @@
5454
- New #439, #446: Implement `ArrayMergeBuilder` class (@Tigrov)
5555
- Enh #442: Refactor `DMLQueryBuilder::upsert()` method (@Tigrov)
5656
- Enh #444: Improve `ArrayExpressionBuilder` and `JsonExpressionBuilder` classes (@Tigrov)
57+
- Chg #447: Update expression namespaces according to changes in `yiisoft/db` package (@Tigrov)
5758

5859
## 1.3.0 March 21, 2024
5960

src/Builder/ArrayOverlapsBuilder.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44

55
namespace Yiisoft\Db\Pgsql\Builder;
66

7-
use Yiisoft\Db\Expression\ArrayExpression;
8-
use Yiisoft\Db\Expression\Builder\ExpressionBuilderInterface;
7+
use Yiisoft\Db\Expression\Value\ArrayValue;
8+
use Yiisoft\Db\Expression\ExpressionBuilderInterface;
99
use Yiisoft\Db\Expression\ExpressionInterface;
10-
use Yiisoft\Db\Expression\JsonExpression;
10+
use Yiisoft\Db\Expression\Value\JsonValue;
1111
use Yiisoft\Db\QueryBuilder\Condition\ArrayOverlaps;
1212
use Yiisoft\Db\QueryBuilder\QueryBuilderInterface;
1313

@@ -38,10 +38,10 @@ public function build(ExpressionInterface $expression, array &$params = []): str
3838
$values = $expression->values;
3939

4040
if (!$values instanceof ExpressionInterface) {
41-
$values = new ArrayExpression($values);
42-
} elseif ($values instanceof JsonExpression) {
41+
$values = new ArrayValue($values);
42+
} elseif ($values instanceof JsonValue) {
4343
/** @psalm-suppress MixedArgument */
44-
$values = new ArrayExpression($values->getValue());
44+
$values = new ArrayValue($values->value);
4545
}
4646

4747
$values = $this->queryBuilder->buildExpression($values, $params);

src/Builder/ArrayExpressionBuilder.php renamed to src/Builder/ArrayValueBuilder.php

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
use Yiisoft\Db\Constant\ColumnType;
88
use Yiisoft\Db\Constant\DataType;
99
use Yiisoft\Db\Constant\GettypeResult;
10-
use Yiisoft\Db\Expression\ArrayExpression;
11-
use Yiisoft\Db\Expression\Builder\AbstractArrayExpressionBuilder;
10+
use Yiisoft\Db\Expression\Value\ArrayValue;
11+
use Yiisoft\Db\Expression\Value\Builder\AbstractArrayValueBuilder;
1212
use Yiisoft\Db\Expression\ExpressionInterface;
13-
use Yiisoft\Db\Expression\Param;
13+
use Yiisoft\Db\Expression\Value\Param;
1414
use Yiisoft\Db\Pgsql\Data\LazyArray;
1515
use Yiisoft\Db\Query\QueryInterface;
1616
use Yiisoft\Db\Schema\Column\AbstractArrayColumn;
@@ -25,11 +25,11 @@
2525
use function str_repeat;
2626

2727
/**
28-
* Builds expressions for {@see ArrayExpression} for PostgreSQL Server.
28+
* Builds expressions for {@see ArrayValue} for PostgreSQL Server.
2929
*/
30-
final class ArrayExpressionBuilder extends AbstractArrayExpressionBuilder
30+
final class ArrayValueBuilder extends AbstractArrayValueBuilder
3131
{
32-
protected function buildStringValue(string $value, ArrayExpression $expression, array &$params): string
32+
protected function buildStringValue(string $value, ArrayValue $expression, array &$params): string
3333
{
3434
$param = new Param($value, DataType::STRING);
3535

@@ -41,15 +41,15 @@ protected function buildStringValue(string $value, ArrayExpression $expression,
4141
return $this->queryBuilder->bindParam($param, $params) . $typeHint;
4242
}
4343

44-
protected function buildSubquery(QueryInterface $query, ArrayExpression $expression, array &$params): string
44+
protected function buildSubquery(QueryInterface $query, ArrayValue $expression, array &$params): string
4545
{
4646
$column = $this->getColumn($expression);
4747
$dbType = $this->getColumnDbType($column);
4848

4949
return $this->buildNestedSubquery($query, $dbType, $column?->getDimension() ?? 1, $params);
5050
}
5151

52-
protected function buildValue(iterable $value, ArrayExpression $expression, array &$params): string
52+
protected function buildValue(iterable $value, ArrayValue $expression, array &$params): string
5353
{
5454
$column = $this->getColumn($expression);
5555
$dbType = $this->getColumnDbType($column);
@@ -125,9 +125,9 @@ private function buildNestedValue(iterable $value, string|null &$dbType, ColumnI
125125
return $this->buildNestedArray($placeholders, $dbType, $dimension);
126126
}
127127

128-
private function getColumn(ArrayExpression $expression): AbstractArrayColumn|null
128+
private function getColumn(ArrayValue $expression): AbstractArrayColumn|null
129129
{
130-
$type = $expression->getType();
130+
$type = $expression->type;
131131

132132
if ($type === null || $type instanceof AbstractArrayColumn) {
133133
return $type;

src/Builder/CaseExpressionBuilder.php renamed to src/Builder/CaseXBuilder.php

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\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\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/Builder/JsonExpressionBuilder.php

Lines changed: 0 additions & 71 deletions
This file was deleted.

src/Builder/JsonOverlapsBuilder.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44

55
namespace Yiisoft\Db\Pgsql\Builder;
66

7-
use Yiisoft\Db\Expression\ArrayExpression;
8-
use Yiisoft\Db\Expression\Builder\ExpressionBuilderInterface;
7+
use Yiisoft\Db\Expression\Value\ArrayValue;
8+
use Yiisoft\Db\Expression\ExpressionBuilderInterface;
99
use Yiisoft\Db\Expression\ExpressionInterface;
10-
use Yiisoft\Db\Expression\JsonExpression;
10+
use Yiisoft\Db\Expression\Value\JsonValue;
1111
use Yiisoft\Db\QueryBuilder\Condition\JsonOverlaps;
1212
use Yiisoft\Db\QueryBuilder\QueryBuilderInterface;
1313

@@ -37,11 +37,11 @@ public function build(ExpressionInterface $expression, array &$params = []): str
3737
: $this->queryBuilder->getQuoter()->quoteColumnName($expression->column);
3838
$values = $expression->values;
3939

40-
if ($values instanceof JsonExpression) {
40+
if ($values instanceof JsonValue) {
4141
/** @psalm-suppress MixedArgument */
42-
$values = new ArrayExpression($values->getValue());
42+
$values = new ArrayValue($values->value);
4343
} elseif (!$values instanceof ExpressionInterface) {
44-
$values = new ArrayExpression($values);
44+
$values = new ArrayValue($values);
4545
}
4646

4747
$values = $this->queryBuilder->buildExpression($values, $params);

src/Builder/JsonValueBuilder.php

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yiisoft\Db\Pgsql\Builder;
6+
7+
use Yiisoft\Db\Expression\Value\ArrayValue;
8+
use Yiisoft\Db\Expression\ExpressionBuilderInterface;
9+
use Yiisoft\Db\Expression\ExpressionInterface;
10+
use Yiisoft\Db\Expression\Value\JsonValue;
11+
use Yiisoft\Db\Expression\Value\Builder\JsonValueBuilder as BaseJsonValueBuilder;
12+
use Yiisoft\Db\QueryBuilder\QueryBuilderInterface;
13+
14+
/**
15+
* Builds expressions for {@see `Yiisoft\Db\Expression\Value\JsonValue`} for PostgreSQL Server.
16+
*
17+
* @implements ExpressionBuilderInterface<JsonValue>
18+
*/
19+
final class JsonValueBuilder implements ExpressionBuilderInterface
20+
{
21+
private BaseJsonValueBuilder $baseValueBuilder;
22+
23+
public function __construct(QueryBuilderInterface $queryBuilder)
24+
{
25+
$this->baseValueBuilder = new BaseJsonValueBuilder($queryBuilder);
26+
}
27+
28+
/**
29+
* The Method builds the raw SQL from the $expression that won't be additionally escaped or quoted.
30+
*
31+
* @param JsonValue $expression The expression to build.
32+
* @param array $params The binding parameters.
33+
*
34+
* @return string The raw SQL that won't be additionally escaped or quoted.
35+
*/
36+
public function build(ExpressionInterface $expression, array &$params = []): string
37+
{
38+
$statement = $this->baseValueBuilder->build($expression, $params);
39+
40+
if ($expression->value instanceof ArrayValue) {
41+
$statement = 'array_to_json(' . $statement . ')';
42+
}
43+
44+
return $statement . $this->getTypeHint($expression);
45+
}
46+
47+
/**
48+
* @return string The typecast expression based on {@see JsonValue::type}.
49+
*/
50+
private function getTypeHint(JsonValue $expression): string
51+
{
52+
$type = $expression->type;
53+
54+
if ($type === null) {
55+
return '';
56+
}
57+
58+
return '::' . $type;
59+
}
60+
}

0 commit comments

Comments
 (0)