From 20c7f6a1b3c29d421da99d0688e270b778af7ac6 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Tue, 22 Jul 2025 17:32:29 +0300 Subject: [PATCH 1/6] Remove "Condition" suffix from condition classes --- CHANGELOG.md | 2 +- docs/guide/en/query/where.md | 4 +- docs/guide/pt-BR/query/where.md | 4 +- src/QueryBuilder/AbstractDQLQueryBuilder.php | 54 ++++++++-------- ...lapsCondition.php => AbstractOverlaps.php} | 2 +- ...verlapsCondition.php => ArrayOverlaps.php} | 2 +- .../{BetweenCondition.php => Between.php} | 2 +- ...olumnsCondition.php => BetweenColumns.php} | 2 +- ...onditionBuilder.php => BetweenBuilder.php} | 12 ++-- ...nBuilder.php => BetweenColumnsBuilder.php} | 12 ++-- ...ConditionBuilder.php => ExistsBuilder.php} | 12 ++-- ...shConditionBuilder.php => HashBuilder.php} | 16 ++--- .../{InConditionBuilder.php => InBuilder.php} | 16 ++--- ...keConditionBuilder.php => LikeBuilder.php} | 18 +++--- ...onditionBuilder.php => LogicalBuilder.php} | 2 +- ...NotConditionBuilder.php => NotBuilder.php} | 12 ++-- ...ConditionBuilder.php => SimpleBuilder.php} | 12 ++-- .../{ExistsCondition.php => Exists.php} | 2 +- .../Condition/{HashCondition.php => Hash.php} | 2 +- .../Condition/{InCondition.php => In.php} | 2 +- ...OverlapsCondition.php => JsonOverlaps.php} | 2 +- .../Condition/{LikeCondition.php => Like.php} | 2 +- .../Condition/{NotCondition.php => Not.php} | 2 +- .../{SimpleCondition.php => Simple.php} | 2 +- tests/AbstractQueryBuilderTest.php | 12 ++-- .../Condition/AndConditionTest.php | 2 - ...nditionTest.php => BetweenColumnsTest.php} | 18 +++--- ...tweenConditionTest.php => BetweenTest.php} | 14 ++--- ...Test.php => BetweenColumnsBuilderTest.php} | 12 ++-- ...ionBuilderTest.php => LikeBuilderTest.php} | 12 ++-- ...ExistsConditionTest.php => ExistsTest.php} | 12 ++-- .../{HashConditionTest.php => HashTest.php} | 10 ++- .../{InConditionTest.php => InTest.php} | 16 +++-- .../{LikeConditionTest.php => LikeTest.php} | 20 +++--- .../{NotConditionTest.php => NotTest.php} | 14 ++--- ...SimpleConditionTest.php => SimpleTest.php} | 20 +++--- tests/Provider/QueryBuilderProvider.php | 62 +++++++++---------- 37 files changed, 201 insertions(+), 221 deletions(-) rename src/QueryBuilder/Condition/{AbstractOverlapsCondition.php => AbstractOverlaps.php} (97%) rename src/QueryBuilder/Condition/{ArrayOverlapsCondition.php => ArrayOverlaps.php} (75%) rename src/QueryBuilder/Condition/{BetweenCondition.php => Between.php} (97%) rename src/QueryBuilder/Condition/{BetweenColumnsCondition.php => BetweenColumns.php} (98%) rename src/QueryBuilder/Condition/Builder/{BetweenConditionBuilder.php => BetweenBuilder.php} (84%) rename src/QueryBuilder/Condition/Builder/{BetweenColumnsConditionBuilder.php => BetweenColumnsBuilder.php} (87%) rename src/QueryBuilder/Condition/Builder/{ExistsConditionBuilder.php => ExistsBuilder.php} (73%) rename src/QueryBuilder/Condition/Builder/{HashConditionBuilder.php => HashBuilder.php} (79%) rename src/QueryBuilder/Condition/Builder/{InConditionBuilder.php => InBuilder.php} (95%) rename src/QueryBuilder/Condition/Builder/{LikeConditionBuilder.php => LikeBuilder.php} (88%) rename src/QueryBuilder/Condition/Builder/{LogicalConditionBuilder.php => LogicalBuilder.php} (97%) rename src/QueryBuilder/Condition/Builder/{NotConditionBuilder.php => NotBuilder.php} (78%) rename src/QueryBuilder/Condition/Builder/{SimpleConditionBuilder.php => SimpleBuilder.php} (82%) rename src/QueryBuilder/Condition/{ExistsCondition.php => Exists.php} (95%) rename src/QueryBuilder/Condition/{HashCondition.php => Hash.php} (90%) rename src/QueryBuilder/Condition/{InCondition.php => In.php} (98%) rename src/QueryBuilder/Condition/{JsonOverlapsCondition.php => JsonOverlaps.php} (75%) rename src/QueryBuilder/Condition/{LikeCondition.php => Like.php} (98%) rename src/QueryBuilder/Condition/{NotCondition.php => Not.php} (97%) rename src/QueryBuilder/Condition/{SimpleCondition.php => Simple.php} (96%) rename tests/Db/QueryBuilder/Condition/{BetweenColumnsConditionTest.php => BetweenColumnsTest.php} (75%) rename tests/Db/QueryBuilder/Condition/{BetweenConditionTest.php => BetweenTest.php} (73%) rename tests/Db/QueryBuilder/Condition/Builder/{BetweenColumnsConditionBuilderTest.php => BetweenColumnsBuilderTest.php} (50%) rename tests/Db/QueryBuilder/Condition/Builder/{LikeConditionBuilderTest.php => LikeBuilderTest.php} (56%) rename tests/Db/QueryBuilder/Condition/{ExistsConditionTest.php => ExistsTest.php} (76%) rename tests/Db/QueryBuilder/Condition/{HashConditionTest.php => HashTest.php} (56%) rename tests/Db/QueryBuilder/Condition/{InConditionTest.php => InTest.php} (74%) rename tests/Db/QueryBuilder/Condition/{LikeConditionTest.php => LikeTest.php} (77%) rename tests/Db/QueryBuilder/Condition/{NotConditionTest.php => NotTest.php} (70%) rename tests/Db/QueryBuilder/Condition/{SimpleConditionTest.php => SimpleTest.php} (71%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d7250451..a21dd0aee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -111,7 +111,7 @@ - Chg #1001: Remove `ParamInterface` (@vjik) - Chg #1001: Add public properties `$type` and `$value` to `Param` class instead of `getType()` and `getValue()` methods that were removed (@vjik) - Chg #1002: Remove specific condition interfaces (@vjik) -- Chg #1003: Refactor namespace of condition objects and use promoted properties instead of getters (@vjik) +- Chg #1003, #1005: Refactor namespace of condition objects and use promoted properties instead of getters (@vjik) ## 1.3.0 March 21, 2024 diff --git a/docs/guide/en/query/where.md b/docs/guide/en/query/where.md index ddbc185ea..a8ebb92e1 100644 --- a/docs/guide/en/query/where.md +++ b/docs/guide/en/query/where.md @@ -276,7 +276,7 @@ Internally, the formats described are implicitly converted to object format befo so it's possible to combine formats in a single condition: ```php -use Yiisoft\Db\QueryBuilder\Condition\InCondition; +use Yiisoft\Db\QueryBuilder\Condition\In; use Yiisoft\Db\QueryBuilder\Condition\OrCondition; use Yiisoft\Db\Query\Query; @@ -285,7 +285,7 @@ use Yiisoft\Db\Query\Query; $query->andWhere( new OrCondition( [ - new InCondition('type', 'in', $types), + new In('type', 'in', $types), ['like', 'name', '%good%'], 'disabled=false', ], diff --git a/docs/guide/pt-BR/query/where.md b/docs/guide/pt-BR/query/where.md index ca246d07f..d37bcfc34 100644 --- a/docs/guide/pt-BR/query/where.md +++ b/docs/guide/pt-BR/query/where.md @@ -251,7 +251,7 @@ Internamente, os formatos descritos são convertidos implicitamente para o forma então é possível combinar formatos em uma única condição: ```php -use Yiisoft\Db\QueryBuilder\Condition\InCondition; +use Yiisoft\Db\QueryBuilder\Condition\In; use Yiisoft\Db\QueryBuilder\Condition\OrCondition; use Yiisoft\Db\Query\Query; @@ -260,7 +260,7 @@ use Yiisoft\Db\Query\Query; $query->andWhere( new OrCondition( [ - new InCondition('type', 'in', $types), + new In('type', 'in', $types), ['like', 'name', '%good%'], 'disabled=false', ], diff --git a/src/QueryBuilder/AbstractDQLQueryBuilder.php b/src/QueryBuilder/AbstractDQLQueryBuilder.php index ab22cf1bc..d79797a6d 100644 --- a/src/QueryBuilder/AbstractDQLQueryBuilder.php +++ b/src/QueryBuilder/AbstractDQLQueryBuilder.php @@ -22,9 +22,9 @@ use Yiisoft\Db\Expression\CaseExpressionBuilder; use Yiisoft\Db\Expression\StructuredExpression; use Yiisoft\Db\Expression\StructuredExpressionBuilder; -use Yiisoft\Db\QueryBuilder\Condition\HashCondition; +use Yiisoft\Db\QueryBuilder\Condition\Hash; use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; -use Yiisoft\Db\QueryBuilder\Condition\SimpleCondition; +use Yiisoft\Db\QueryBuilder\Condition\Simple; use Yiisoft\Db\Query\Query; use Yiisoft\Db\Query\QueryExpressionBuilder; use Yiisoft\Db\Query\QueryInterface; @@ -445,12 +445,12 @@ public function createConditionFromArray(array $condition): ConditionInterface /** operator format: operator, operand 1, operand 2, ... */ if (isset($condition[0])) { $operator = strtoupper((string) array_shift($condition)); - $className = $this->conditionClasses[$operator] ?? SimpleCondition::class; + $className = $this->conditionClasses[$operator] ?? Simple::class; return $className::fromArrayDefinition($operator, $condition); } /** hash format: 'column1' => 'value1', 'column2' => 'value2', ... */ - return new HashCondition($condition); + return new Hash($condition); } public function getExpressionBuilder(ExpressionInterface $expression): object @@ -503,21 +503,21 @@ public function setSeparator(string $separator): void protected function defaultConditionClasses(): array { return [ - 'NOT' => Condition\NotCondition::class, + 'NOT' => Condition\Not::class, 'AND' => Condition\AndCondition::class, 'OR' => Condition\OrCondition::class, - 'BETWEEN' => Condition\BetweenCondition::class, - 'NOT BETWEEN' => Condition\BetweenCondition::class, - 'IN' => Condition\InCondition::class, - 'NOT IN' => Condition\InCondition::class, - 'LIKE' => Condition\LikeCondition::class, - 'NOT LIKE' => Condition\LikeCondition::class, - 'OR LIKE' => Condition\LikeCondition::class, - 'OR NOT LIKE' => Condition\LikeCondition::class, - 'EXISTS' => Condition\ExistsCondition::class, - 'NOT EXISTS' => Condition\ExistsCondition::class, - 'ARRAY OVERLAPS' => Condition\ArrayOverlapsCondition::class, - 'JSON OVERLAPS' => Condition\JsonOverlapsCondition::class, + 'BETWEEN' => Condition\Between::class, + 'NOT BETWEEN' => Condition\Between::class, + 'IN' => Condition\In::class, + 'NOT IN' => Condition\In::class, + 'LIKE' => Condition\Like::class, + 'NOT LIKE' => Condition\Like::class, + 'OR LIKE' => Condition\Like::class, + 'OR NOT LIKE' => Condition\Like::class, + 'EXISTS' => Condition\Exists::class, + 'NOT EXISTS' => Condition\Exists::class, + 'ARRAY OVERLAPS' => Condition\ArrayOverlaps::class, + 'JSON OVERLAPS' => Condition\JsonOverlaps::class, ]; } @@ -536,16 +536,16 @@ protected function defaultExpressionBuilders(): array Query::class => QueryExpressionBuilder::class, Param::class => ParamBuilder::class, Expression::class => ExpressionBuilder::class, - Condition\NotCondition::class => Condition\Builder\NotConditionBuilder::class, - Condition\AndCondition::class => Condition\Builder\LogicalConditionBuilder::class, - Condition\OrCondition::class => Condition\Builder\LogicalConditionBuilder::class, - Condition\BetweenCondition::class => Condition\Builder\BetweenConditionBuilder::class, - Condition\InCondition::class => Condition\Builder\InConditionBuilder::class, - Condition\LikeCondition::class => Condition\Builder\LikeConditionBuilder::class, - Condition\ExistsCondition::class => Condition\Builder\ExistsConditionBuilder::class, - SimpleCondition::class => Condition\Builder\SimpleConditionBuilder::class, - HashCondition::class => Condition\Builder\HashConditionBuilder::class, - Condition\BetweenColumnsCondition::class => Condition\Builder\BetweenColumnsConditionBuilder::class, + Condition\Not::class => Condition\Builder\NotBuilder::class, + Condition\AndCondition::class => Condition\Builder\LogicalBuilder::class, + Condition\OrCondition::class => Condition\Builder\LogicalBuilder::class, + Condition\Between::class => Condition\Builder\BetweenBuilder::class, + Condition\In::class => Condition\Builder\InBuilder::class, + Condition\Like::class => Condition\Builder\LikeBuilder::class, + Condition\Exists::class => Condition\Builder\ExistsBuilder::class, + Simple::class => Condition\Builder\SimpleBuilder::class, + Hash::class => Condition\Builder\HashBuilder::class, + Condition\BetweenColumns::class => Condition\Builder\BetweenColumnsBuilder::class, JsonExpression::class => JsonExpressionBuilder::class, ArrayExpression::class => ArrayExpressionBuilder::class, StructuredExpression::class => StructuredExpressionBuilder::class, diff --git a/src/QueryBuilder/Condition/AbstractOverlapsCondition.php b/src/QueryBuilder/Condition/AbstractOverlaps.php similarity index 97% rename from src/QueryBuilder/Condition/AbstractOverlapsCondition.php rename to src/QueryBuilder/Condition/AbstractOverlaps.php index 27810a68c..59507ef2e 100644 --- a/src/QueryBuilder/Condition/AbstractOverlapsCondition.php +++ b/src/QueryBuilder/Condition/AbstractOverlaps.php @@ -13,7 +13,7 @@ /** * The base class for classes representing the array and JSON overlaps conditions. */ -abstract class AbstractOverlapsCondition implements ConditionInterface +abstract class AbstractOverlaps implements ConditionInterface { /** * @param ExpressionInterface|string $column The column name or an expression. diff --git a/src/QueryBuilder/Condition/ArrayOverlapsCondition.php b/src/QueryBuilder/Condition/ArrayOverlaps.php similarity index 75% rename from src/QueryBuilder/Condition/ArrayOverlapsCondition.php rename to src/QueryBuilder/Condition/ArrayOverlaps.php index 7c215b578..0aa3f367c 100644 --- a/src/QueryBuilder/Condition/ArrayOverlapsCondition.php +++ b/src/QueryBuilder/Condition/ArrayOverlaps.php @@ -7,6 +7,6 @@ /** * Condition that represents `ARRAY OVERLAPS` operator is used to check if a column of array type overlaps another array. */ -final class ArrayOverlapsCondition extends AbstractOverlapsCondition +final class ArrayOverlaps extends AbstractOverlaps { } diff --git a/src/QueryBuilder/Condition/BetweenCondition.php b/src/QueryBuilder/Condition/Between.php similarity index 97% rename from src/QueryBuilder/Condition/BetweenCondition.php rename to src/QueryBuilder/Condition/Between.php index 32dafe769..04550517a 100644 --- a/src/QueryBuilder/Condition/BetweenCondition.php +++ b/src/QueryBuilder/Condition/Between.php @@ -10,7 +10,7 @@ /** * Condition that's represented `BETWEEN` operator is used to check if a value is between two values. */ -final class BetweenCondition implements ConditionInterface +final class Between implements ConditionInterface { /** * @param ExpressionInterface|string $column The column name. diff --git a/src/QueryBuilder/Condition/BetweenColumnsCondition.php b/src/QueryBuilder/Condition/BetweenColumns.php similarity index 98% rename from src/QueryBuilder/Condition/BetweenColumnsCondition.php rename to src/QueryBuilder/Condition/BetweenColumns.php index df38fff5f..e528125a0 100644 --- a/src/QueryBuilder/Condition/BetweenColumnsCondition.php +++ b/src/QueryBuilder/Condition/BetweenColumns.php @@ -37,7 +37,7 @@ * // NOW() NOT BETWEEN (SELECT time FROM log ORDER BY id ASC LIMIT 1) AND update_time * ``` */ -final class BetweenColumnsCondition implements ConditionInterface +final class BetweenColumns implements ConditionInterface { /** * @param array|ExpressionInterface|int|Iterator|string $value The value to compare against. diff --git a/src/QueryBuilder/Condition/Builder/BetweenConditionBuilder.php b/src/QueryBuilder/Condition/Builder/BetweenBuilder.php similarity index 84% rename from src/QueryBuilder/Condition/Builder/BetweenConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/BetweenBuilder.php index 255cf412a..5cd66dfe7 100644 --- a/src/QueryBuilder/Condition/Builder/BetweenConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/BetweenBuilder.php @@ -10,26 +10,26 @@ use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Expression\ExpressionBuilderInterface; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\QueryBuilder\Condition\BetweenCondition; +use Yiisoft\Db\QueryBuilder\Condition\Between; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; use function str_contains; /** - * Build an object of {@see BetweenCondition} into SQL expressions. + * Build an object of {@see Between} into SQL expressions. * - * @implements ExpressionBuilderInterface + * @implements ExpressionBuilderInterface */ -class BetweenConditionBuilder implements ExpressionBuilderInterface +class BetweenBuilder implements ExpressionBuilderInterface { public function __construct(private readonly QueryBuilderInterface $queryBuilder) { } /** - * Build SQL for {@see BetweenCondition}. + * Build SQL for {@see Between}. * - * @param BetweenCondition $expression + * @param Between $expression * * @throws Exception * @throws InvalidArgumentException diff --git a/src/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilder.php b/src/QueryBuilder/Condition/Builder/BetweenColumnsBuilder.php similarity index 87% rename from src/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/BetweenColumnsBuilder.php index 7dafffc78..625bf59c4 100644 --- a/src/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/BetweenColumnsBuilder.php @@ -10,27 +10,27 @@ use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Expression\ExpressionBuilderInterface; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\QueryBuilder\Condition\BetweenColumnsCondition; +use Yiisoft\Db\QueryBuilder\Condition\BetweenColumns; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; use Yiisoft\Db\Query\QueryInterface; use function str_contains; /** - * Build an object of {@see BetweenColumnsCondition} into SQL expressions. + * Build an object of {@see BetweenColumns} into SQL expressions. * - * @implements ExpressionBuilderInterface + * @implements ExpressionBuilderInterface */ -class BetweenColumnsConditionBuilder implements ExpressionBuilderInterface +class BetweenColumnsBuilder implements ExpressionBuilderInterface { public function __construct(private readonly QueryBuilderInterface $queryBuilder) { } /** - * Build SQL for {@see BetweenColumnsCondition}. + * Build SQL for {@see BetweenColumns}. * - * @param BetweenColumnsCondition $expression + * @param BetweenColumns $expression * * @throws Exception * @throws InvalidArgumentException diff --git a/src/QueryBuilder/Condition/Builder/ExistsConditionBuilder.php b/src/QueryBuilder/Condition/Builder/ExistsBuilder.php similarity index 73% rename from src/QueryBuilder/Condition/Builder/ExistsConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/ExistsBuilder.php index 1f52433ce..7d9297edb 100644 --- a/src/QueryBuilder/Condition/Builder/ExistsConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/ExistsBuilder.php @@ -10,24 +10,24 @@ use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Expression\ExpressionBuilderInterface; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\QueryBuilder\Condition\ExistsCondition; +use Yiisoft\Db\QueryBuilder\Condition\Exists; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; /** - * Build an object of {@see ExistsCondition} into SQL expressions. + * Build an object of {@see Exists} into SQL expressions. * - * @implements ExpressionBuilderInterface + * @implements ExpressionBuilderInterface */ -class ExistsConditionBuilder implements ExpressionBuilderInterface +class ExistsBuilder implements ExpressionBuilderInterface { public function __construct(private readonly QueryBuilderInterface $queryBuilder) { } /** - * Build SQL for {@see ExistsCondition}. + * Build SQL for {@see Exists}. * - * @param ExistsCondition $expression + * @param Exists $expression * * @throws Exception * @throws InvalidArgumentException diff --git a/src/QueryBuilder/Condition/Builder/HashConditionBuilder.php b/src/QueryBuilder/Condition/Builder/HashBuilder.php similarity index 79% rename from src/QueryBuilder/Condition/Builder/HashConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/HashBuilder.php index 090e5723b..4ee1cfebd 100644 --- a/src/QueryBuilder/Condition/Builder/HashConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/HashBuilder.php @@ -10,8 +10,8 @@ use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Expression\ExpressionBuilderInterface; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\QueryBuilder\Condition\HashCondition; -use Yiisoft\Db\QueryBuilder\Condition\InCondition; +use Yiisoft\Db\QueryBuilder\Condition\Hash; +use Yiisoft\Db\QueryBuilder\Condition\In; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; use Yiisoft\Db\Query\QueryInterface; @@ -20,20 +20,20 @@ use function is_iterable; /** - * Build an object of {@see HashCondition} into SQL expressions. + * Build an object of {@see Hash} into SQL expressions. * - * @implements ExpressionBuilderInterface + * @implements ExpressionBuilderInterface */ -class HashConditionBuilder implements ExpressionBuilderInterface +class HashBuilder implements ExpressionBuilderInterface { public function __construct(private readonly QueryBuilderInterface $queryBuilder) { } /** - * Build SQL for {@see HashCondition}. + * Build SQL for {@see Hash}. * - * @param HashCondition $expression + * @param Hash $expression * * @throws Exception * @throws InvalidArgumentException @@ -51,7 +51,7 @@ public function build(ExpressionInterface $expression, array &$params = []): str foreach ($hash as $column => $value) { if (is_iterable($value) || $value instanceof QueryInterface) { /** IN condition */ - $parts[] = $this->queryBuilder->buildCondition(new InCondition($column, 'IN', $value), $params); + $parts[] = $this->queryBuilder->buildCondition(new In($column, 'IN', $value), $params); } else { $column = $this->queryBuilder->getQuoter()->quoteColumnName($column); diff --git a/src/QueryBuilder/Condition/Builder/InConditionBuilder.php b/src/QueryBuilder/Condition/Builder/InBuilder.php similarity index 95% rename from src/QueryBuilder/Condition/Builder/InConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/InBuilder.php index 37917cf26..c784eab47 100644 --- a/src/QueryBuilder/Condition/Builder/InConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/InBuilder.php @@ -13,7 +13,7 @@ use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Expression\ExpressionBuilderInterface; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\QueryBuilder\Condition\InCondition; +use Yiisoft\Db\QueryBuilder\Condition\In; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; use Yiisoft\Db\Query\QueryInterface; @@ -31,20 +31,20 @@ use function strtoupper; /** - * Build an object of {@see InCondition} into SQL expressions. + * Build an object of {@see In} into SQL expressions. * - * @implements ExpressionBuilderInterface + * @implements ExpressionBuilderInterface */ -class InConditionBuilder implements ExpressionBuilderInterface +class InBuilder implements ExpressionBuilderInterface { public function __construct(protected QueryBuilderInterface $queryBuilder) { } /** - * Build SQL for {@see InCondition}. + * Build SQL for {@see In}. * - * @param InCondition $expression + * @param In $expression * * @throws Exception * @throws InvalidArgumentException @@ -131,7 +131,7 @@ public function build(ExpressionInterface $expression, array &$params = []): str } /** - * Builds `$values` to use in {@see InCondition}. + * Builds `$values` to use in {@see In}. * * @throws Exception * @throws InvalidArgumentException @@ -143,7 +143,7 @@ public function build(ExpressionInterface $expression, array &$params = []): str * @psalm-suppress MixedArrayTypeCoercion * @psalm-suppress MixedArrayOffset */ - protected function buildValues(InCondition $condition, iterable $values, array &$params = []): array + protected function buildValues(In $condition, iterable $values, array &$params = []): array { $sqlValues = []; $column = $condition->column; diff --git a/src/QueryBuilder/Condition/Builder/LikeConditionBuilder.php b/src/QueryBuilder/Condition/Builder/LikeBuilder.php similarity index 88% rename from src/QueryBuilder/Condition/Builder/LikeConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/LikeBuilder.php index ecf83f98f..9fb0f80ab 100644 --- a/src/QueryBuilder/Condition/Builder/LikeConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/LikeBuilder.php @@ -12,7 +12,7 @@ use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Expression\ExpressionBuilderInterface; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\QueryBuilder\Condition\LikeCondition; +use Yiisoft\Db\QueryBuilder\Condition\Like; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; use function implode; @@ -23,11 +23,11 @@ use function strtr; /** - * Build an object of {@see LikeCondition} into SQL expressions. + * Build an object of {@see Like} into SQL expressions. * - * @implements ExpressionBuilderInterface + * @implements ExpressionBuilderInterface */ -class LikeConditionBuilder implements ExpressionBuilderInterface +class LikeBuilder implements ExpressionBuilderInterface { public function __construct( private readonly QueryBuilderInterface $queryBuilder, @@ -46,9 +46,9 @@ public function __construct( ]; /** - * Build SQL for {@see LikeCondition}. + * Build SQL for {@see Like}. * - * @param LikeCondition $expression + * @param Like $expression * * @throws Exception * @throws InvalidArgumentException @@ -95,7 +95,7 @@ public function build(ExpressionInterface $expression, array &$params = []): str * @throws InvalidConfigException * @throws NotSupportedException */ - protected function prepareColumn(LikeCondition $expression, array &$params): string + protected function prepareColumn(Like $expression, array &$params): string { $column = $expression->column; @@ -121,7 +121,7 @@ protected function prepareColumn(LikeCondition $expression, array &$params): str */ protected function preparePlaceholderName( string|ExpressionInterface $value, - LikeCondition $expression, + Like $expression, array|null $escape, array &$params, ): string { @@ -141,7 +141,7 @@ protected function preparePlaceholderName( * * @psalm-return array{0: string, 1: bool, 2: string} */ - protected function parseOperator(LikeCondition $expression): array + protected function parseOperator(Like $expression): array { $operator = strtoupper($expression->operator); if (!preg_match('/^(AND |OR |)((NOT |)I?LIKE)/', $operator, $matches)) { diff --git a/src/QueryBuilder/Condition/Builder/LogicalConditionBuilder.php b/src/QueryBuilder/Condition/Builder/LogicalBuilder.php similarity index 97% rename from src/QueryBuilder/Condition/Builder/LogicalConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/LogicalBuilder.php index 98dfd52c2..231b65d05 100644 --- a/src/QueryBuilder/Condition/Builder/LogicalConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/LogicalBuilder.php @@ -24,7 +24,7 @@ * * @implements ExpressionBuilderInterface */ -final class LogicalConditionBuilder implements ExpressionBuilderInterface +final class LogicalBuilder implements ExpressionBuilderInterface { public function __construct( private readonly QueryBuilderInterface $queryBuilder diff --git a/src/QueryBuilder/Condition/Builder/NotConditionBuilder.php b/src/QueryBuilder/Condition/Builder/NotBuilder.php similarity index 78% rename from src/QueryBuilder/Condition/Builder/NotConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/NotBuilder.php index 3922fdac4..def268e66 100644 --- a/src/QueryBuilder/Condition/Builder/NotConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/NotBuilder.php @@ -10,24 +10,24 @@ use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Expression\ExpressionBuilderInterface; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\QueryBuilder\Condition\NotCondition; +use Yiisoft\Db\QueryBuilder\Condition\Not; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; /** - * Build an object of {@see NotCondition} into SQL expressions. + * Build an object of {@see Not} into SQL expressions. * - * @implements ExpressionBuilderInterface + * @implements ExpressionBuilderInterface */ -class NotConditionBuilder implements ExpressionBuilderInterface +class NotBuilder implements ExpressionBuilderInterface { public function __construct(private readonly QueryBuilderInterface $queryBuilder) { } /** - * Build SQL for {@see NotCondition}. + * Build SQL for {@see Not}. * - * @param NotCondition $expression + * @param Not $expression * * @throws Exception * @throws InvalidArgumentException diff --git a/src/QueryBuilder/Condition/Builder/SimpleConditionBuilder.php b/src/QueryBuilder/Condition/Builder/SimpleBuilder.php similarity index 82% rename from src/QueryBuilder/Condition/Builder/SimpleConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/SimpleBuilder.php index 5ba3ab0e5..3ed75dd59 100644 --- a/src/QueryBuilder/Condition/Builder/SimpleConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/SimpleBuilder.php @@ -10,26 +10,26 @@ use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Expression\ExpressionBuilderInterface; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\QueryBuilder\Condition\SimpleCondition; +use Yiisoft\Db\QueryBuilder\Condition\Simple; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; use function str_contains; /** - * Build an object of {@see SimpleCondition} into SQL expressions. + * Build an object of {@see Simple} into SQL expressions. * - * @implements ExpressionBuilderInterface + * @implements ExpressionBuilderInterface */ -class SimpleConditionBuilder implements ExpressionBuilderInterface +class SimpleBuilder implements ExpressionBuilderInterface { public function __construct(private readonly QueryBuilderInterface $queryBuilder) { } /** - * Build SQL for {@see SimpleCondition}. + * Build SQL for {@see Simple}. * - * @param SimpleCondition $expression + * @param Simple $expression * * @throws Exception * @throws InvalidArgumentException diff --git a/src/QueryBuilder/Condition/ExistsCondition.php b/src/QueryBuilder/Condition/Exists.php similarity index 95% rename from src/QueryBuilder/Condition/ExistsCondition.php rename to src/QueryBuilder/Condition/Exists.php index e415f3c73..b03c474c9 100644 --- a/src/QueryBuilder/Condition/ExistsCondition.php +++ b/src/QueryBuilder/Condition/Exists.php @@ -10,7 +10,7 @@ /** * Condition that represents `EXISTS` operator that checks whether a sub-query returns any rows */ -final class ExistsCondition implements ConditionInterface +final class Exists implements ConditionInterface { /** * @param string $operator The operator to use (for example, `EXISTS` or `NOT EXISTS`). diff --git a/src/QueryBuilder/Condition/HashCondition.php b/src/QueryBuilder/Condition/Hash.php similarity index 90% rename from src/QueryBuilder/Condition/HashCondition.php rename to src/QueryBuilder/Condition/Hash.php index a7cad2251..1a3d1a57d 100644 --- a/src/QueryBuilder/Condition/HashCondition.php +++ b/src/QueryBuilder/Condition/Hash.php @@ -7,7 +7,7 @@ /** * Condition based on column-value pairs. */ -final class HashCondition implements ConditionInterface +final class Hash implements ConditionInterface { /** * @param array $hash The condition specification. diff --git a/src/QueryBuilder/Condition/InCondition.php b/src/QueryBuilder/Condition/In.php similarity index 98% rename from src/QueryBuilder/Condition/InCondition.php rename to src/QueryBuilder/Condition/In.php index 561d4df87..a001a6ec2 100644 --- a/src/QueryBuilder/Condition/InCondition.php +++ b/src/QueryBuilder/Condition/In.php @@ -12,7 +12,7 @@ /** * Condition that represents `IN` operator. */ -final class InCondition implements ConditionInterface +final class In implements ConditionInterface { /** * @param array|ExpressionInterface|Iterator|string $column The column name. If it's an array, a composite `IN` condition diff --git a/src/QueryBuilder/Condition/JsonOverlapsCondition.php b/src/QueryBuilder/Condition/JsonOverlaps.php similarity index 75% rename from src/QueryBuilder/Condition/JsonOverlapsCondition.php rename to src/QueryBuilder/Condition/JsonOverlaps.php index de6a47403..cd762da06 100644 --- a/src/QueryBuilder/Condition/JsonOverlapsCondition.php +++ b/src/QueryBuilder/Condition/JsonOverlaps.php @@ -7,6 +7,6 @@ /** * Condition that represents `JSON OVERLAPS` operator and is used to check if a column of JSON type overlaps an array. */ -final class JsonOverlapsCondition extends AbstractOverlapsCondition +final class JsonOverlaps extends AbstractOverlaps { } diff --git a/src/QueryBuilder/Condition/LikeCondition.php b/src/QueryBuilder/Condition/Like.php similarity index 98% rename from src/QueryBuilder/Condition/LikeCondition.php rename to src/QueryBuilder/Condition/Like.php index 298a5d467..168244e5c 100644 --- a/src/QueryBuilder/Condition/LikeCondition.php +++ b/src/QueryBuilder/Condition/Like.php @@ -16,7 +16,7 @@ /** * Condition that represents `LIKE` operator. */ -final class LikeCondition implements ConditionInterface +final class Like implements ConditionInterface { protected array|null $escapingReplacements = []; diff --git a/src/QueryBuilder/Condition/NotCondition.php b/src/QueryBuilder/Condition/Not.php similarity index 97% rename from src/QueryBuilder/Condition/NotCondition.php rename to src/QueryBuilder/Condition/Not.php index f96ba198f..ca937f9cd 100644 --- a/src/QueryBuilder/Condition/NotCondition.php +++ b/src/QueryBuilder/Condition/Not.php @@ -15,7 +15,7 @@ /** * Condition that represents `NOT` operator (negation). */ -final class NotCondition implements ConditionInterface +final class Not implements ConditionInterface { /** * @param array|ExpressionInterface|string|null $condition The condition to negate. diff --git a/src/QueryBuilder/Condition/SimpleCondition.php b/src/QueryBuilder/Condition/Simple.php similarity index 96% rename from src/QueryBuilder/Condition/SimpleCondition.php rename to src/QueryBuilder/Condition/Simple.php index 4c54d0cc1..c8d9819ea 100644 --- a/src/QueryBuilder/Condition/SimpleCondition.php +++ b/src/QueryBuilder/Condition/Simple.php @@ -12,7 +12,7 @@ /** * Represents a simple condition like `"column" operator value`. */ -final class SimpleCondition implements ConditionInterface +final class Simple implements ConditionInterface { /** * @param ExpressionInterface|string $column The column name or an expression. diff --git a/tests/AbstractQueryBuilderTest.php b/tests/AbstractQueryBuilderTest.php index 101b93551..eb1258fb1 100644 --- a/tests/AbstractQueryBuilderTest.php +++ b/tests/AbstractQueryBuilderTest.php @@ -23,10 +23,10 @@ use Yiisoft\Db\Query\Query; use Yiisoft\Db\Query\QueryInterface; use Yiisoft\Db\QueryBuilder\Condition\AndCondition; -use Yiisoft\Db\QueryBuilder\Condition\ArrayOverlapsCondition; -use Yiisoft\Db\QueryBuilder\Condition\JsonOverlapsCondition; +use Yiisoft\Db\QueryBuilder\Condition\ArrayOverlaps; +use Yiisoft\Db\QueryBuilder\Condition\JsonOverlaps; use Yiisoft\Db\QueryBuilder\Condition\OrCondition; -use Yiisoft\Db\QueryBuilder\Condition\SimpleCondition; +use Yiisoft\Db\QueryBuilder\Condition\Simple; use Yiisoft\Db\Schema\Column\ColumnInterface; use Yiisoft\Db\Schema\QuoterInterface; use Yiisoft\Db\Tests\Provider\QueryBuilderProvider; @@ -1613,13 +1613,13 @@ public function testCreateOverlapsConditionFromArray(): void $condition = $qb->createConditionFromArray(['array overlaps', 'column', [1, 2, 3]]); - $this->assertInstanceOf(ArrayOverlapsCondition::class, $condition); + $this->assertInstanceOf(ArrayOverlaps::class, $condition); $this->assertSame('column', $condition->column); $this->assertSame([1, 2, 3], $condition->values); $condition = $qb->createConditionFromArray(['json overlaps', 'column', [1, 2, 3]]); - $this->assertInstanceOf(JsonOverlapsCondition::class, $condition); + $this->assertInstanceOf(JsonOverlaps::class, $condition); $this->assertSame('column', $condition->column); $this->assertSame([1, 2, 3], $condition->values); } @@ -1916,7 +1916,7 @@ public function testGetExpressionBuilder(): void $qb = $db->getQueryBuilder(); - $simpleCondition = new SimpleCondition('a', '=', 1); + $simpleCondition = new Simple('a', '=', 1); $this->assertInstanceOf( ExpressionBuilderInterface::class, diff --git a/tests/Db/QueryBuilder/Condition/AndConditionTest.php b/tests/Db/QueryBuilder/Condition/AndConditionTest.php index b4f825264..9b5f673b5 100644 --- a/tests/Db/QueryBuilder/Condition/AndConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/AndConditionTest.php @@ -9,8 +9,6 @@ /** * @group db - * - * @psalm-suppress PropertyNotSetInConstructor */ final class AndConditionTest extends TestCase { diff --git a/tests/Db/QueryBuilder/Condition/BetweenColumnsConditionTest.php b/tests/Db/QueryBuilder/Condition/BetweenColumnsTest.php similarity index 75% rename from tests/Db/QueryBuilder/Condition/BetweenColumnsConditionTest.php rename to tests/Db/QueryBuilder/Condition/BetweenColumnsTest.php index 51972321b..71d71c0d9 100644 --- a/tests/Db/QueryBuilder/Condition/BetweenColumnsConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/BetweenColumnsTest.php @@ -6,18 +6,16 @@ use PHPUnit\Framework\TestCase; use InvalidArgumentException; -use Yiisoft\Db\QueryBuilder\Condition\BetweenColumnsCondition; +use Yiisoft\Db\QueryBuilder\Condition\BetweenColumns; /** * @group db - * - * @psalm-suppress PropertyNotSetInConstructor */ -final class BetweenColumnsConditionTest extends TestCase +final class BetweenColumnsTest extends TestCase { public function testConstructor(): void { - $betweenColumnsCondition = new BetweenColumnsCondition(42, 'BETWEEN', 'min_value', 'max_value'); + $betweenColumnsCondition = new BetweenColumns(42, 'BETWEEN', 'min_value', 'max_value'); $this->assertSame(42, $betweenColumnsCondition->value); $this->assertSame('BETWEEN', $betweenColumnsCondition->operator); @@ -27,7 +25,7 @@ public function testConstructor(): void public function testFromArrayDefinition(): void { - $betweenColumnsCondition = BetweenColumnsCondition::fromArrayDefinition( + $betweenColumnsCondition = BetweenColumns::fromArrayDefinition( 'BETWEEN', [42, 'min_value', 'max_value'] ); @@ -43,7 +41,7 @@ public function testFromArrayDefinitionExceptionWithoutOperands(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage("Operator 'between' requires three operands."); - BetweenColumnsCondition::fromArrayDefinition('between', []); + BetweenColumns::fromArrayDefinition('between', []); } public function testFromArrayDefinitionExceptionOperandsValue(): void @@ -53,7 +51,7 @@ public function testFromArrayDefinitionExceptionOperandsValue(): void "Operator 'between' requires value to be array, int, string, Iterator or ExpressionInterface." ); - BetweenColumnsCondition::fromArrayDefinition('between', [false, 'min_value', 'max_value']); + BetweenColumns::fromArrayDefinition('between', [false, 'min_value', 'max_value']); } public function testFromArrayDefinitionExceptionOperandsIntervalStartColumn(): void @@ -63,7 +61,7 @@ public function testFromArrayDefinitionExceptionOperandsIntervalStartColumn(): v "Operator 'between' requires interval start column to be string or ExpressionInterface." ); - BetweenColumnsCondition::fromArrayDefinition('between', [42, false, 'max_value']); + BetweenColumns::fromArrayDefinition('between', [42, false, 'max_value']); } public function testFromArrayDefinitionExceptionOperandsIntervalEndColumn(): void @@ -73,6 +71,6 @@ public function testFromArrayDefinitionExceptionOperandsIntervalEndColumn(): voi "Operator 'between' requires interval end column to be string or ExpressionInterface." ); - BetweenColumnsCondition::fromArrayDefinition('between', [42, 'min_value', false]); + BetweenColumns::fromArrayDefinition('between', [42, 'min_value', false]); } } diff --git a/tests/Db/QueryBuilder/Condition/BetweenConditionTest.php b/tests/Db/QueryBuilder/Condition/BetweenTest.php similarity index 73% rename from tests/Db/QueryBuilder/Condition/BetweenConditionTest.php rename to tests/Db/QueryBuilder/Condition/BetweenTest.php index 8e62c01c7..1fb1deed3 100644 --- a/tests/Db/QueryBuilder/Condition/BetweenConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/BetweenTest.php @@ -6,18 +6,16 @@ use PHPUnit\Framework\TestCase; use InvalidArgumentException; -use Yiisoft\Db\QueryBuilder\Condition\BetweenCondition; +use Yiisoft\Db\QueryBuilder\Condition\Between; /** * @group db - * - * @psalm-suppress PropertyNotSetInConstructor */ -final class BetweenConditionTest extends TestCase +final class BetweenTest extends TestCase { public function testConstructor(): void { - $betweenCondition = new BetweenCondition('date', 'BETWEEN', 1, 2); + $betweenCondition = new Between('date', 'BETWEEN', 1, 2); $this->assertSame('date', $betweenCondition->column); $this->assertSame('BETWEEN', $betweenCondition->operator); @@ -27,7 +25,7 @@ public function testConstructor(): void public function testFromArrayDefinition(): void { - $betweenCondition = BetweenCondition::fromArrayDefinition('BETWEEN', ['date', 1, 2]); + $betweenCondition = Between::fromArrayDefinition('BETWEEN', ['date', 1, 2]); $this->assertSame('date', $betweenCondition->column); $this->assertSame('BETWEEN', $betweenCondition->operator); @@ -40,7 +38,7 @@ public function testFromArrayDefinitionExceptionWithoutOperands(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage("Operator 'between' requires three operands."); - BetweenCondition::fromArrayDefinition('between', []); + Between::fromArrayDefinition('between', []); } public function testFromArrayDefinitionExceptionColumns(): void @@ -48,6 +46,6 @@ public function testFromArrayDefinitionExceptionColumns(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage("Operator 'between' requires column to be string or ExpressionInterface."); - BetweenCondition::fromArrayDefinition('between', [1, 'min_value', 'max_value']); + Between::fromArrayDefinition('between', [1, 'min_value', 'max_value']); } } diff --git a/tests/Db/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilderTest.php b/tests/Db/QueryBuilder/Condition/Builder/BetweenColumnsBuilderTest.php similarity index 50% rename from tests/Db/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilderTest.php rename to tests/Db/QueryBuilder/Condition/Builder/BetweenColumnsBuilderTest.php index 43e687975..4d7b11385 100644 --- a/tests/Db/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilderTest.php +++ b/tests/Db/QueryBuilder/Condition/Builder/BetweenColumnsBuilderTest.php @@ -5,16 +5,14 @@ namespace Yiisoft\Db\Tests\Db\QueryBuilder\Condition\Builder; use PHPUnit\Framework\TestCase; -use Yiisoft\Db\QueryBuilder\Condition\BetweenColumnsCondition; -use Yiisoft\Db\QueryBuilder\Condition\Builder\BetweenColumnsConditionBuilder; +use Yiisoft\Db\QueryBuilder\Condition\BetweenColumns; +use Yiisoft\Db\QueryBuilder\Condition\Builder\BetweenColumnsBuilder; use Yiisoft\Db\Tests\Support\TestTrait; /** * @group db - * - * @psalm-suppress PropertyNotSetInConstructor */ -final class BetweenColumnsConditionBuilderTest extends TestCase +final class BetweenColumnsBuilderTest extends TestCase { use TestTrait; @@ -22,12 +20,12 @@ public function testEscapeColumnName(): void { $db = $this->getConnection(); - $betweenColumnsCondition = new BetweenColumnsCondition(42, 'BETWEEN', '1', '100'); + $betweenColumnsCondition = new BetweenColumns(42, 'BETWEEN', '1', '100'); $params = []; $this->assertSame( ':qp0 BETWEEN [1] AND [100]', - (new BetweenColumnsConditionBuilder($db->getQueryBuilder()))->build($betweenColumnsCondition, $params) + (new BetweenColumnsBuilder($db->getQueryBuilder()))->build($betweenColumnsCondition, $params) ); $this->assertEquals([':qp0' => 42], $params); diff --git a/tests/Db/QueryBuilder/Condition/Builder/LikeConditionBuilderTest.php b/tests/Db/QueryBuilder/Condition/Builder/LikeBuilderTest.php similarity index 56% rename from tests/Db/QueryBuilder/Condition/Builder/LikeConditionBuilderTest.php rename to tests/Db/QueryBuilder/Condition/Builder/LikeBuilderTest.php index 0105c3349..6adb874f4 100644 --- a/tests/Db/QueryBuilder/Condition/Builder/LikeConditionBuilderTest.php +++ b/tests/Db/QueryBuilder/Condition/Builder/LikeBuilderTest.php @@ -6,16 +6,14 @@ use PHPUnit\Framework\TestCase; use InvalidArgumentException; -use Yiisoft\Db\QueryBuilder\Condition\Builder\LikeConditionBuilder; -use Yiisoft\Db\QueryBuilder\Condition\LikeCondition; +use Yiisoft\Db\QueryBuilder\Condition\Builder\LikeBuilder; +use Yiisoft\Db\QueryBuilder\Condition\Like; use Yiisoft\Db\Tests\Support\TestTrait; /** * @group db - * - * @psalm-suppress PropertyNotSetInConstructor */ -final class LikeConditionBuilderTest extends TestCase +final class LikeBuilderTest extends TestCase { use TestTrait; @@ -23,11 +21,11 @@ public function testOperatorException(): void { $db = $this->getConnection(); - $likeCondition = new LikeCondition('column', 'invalid', 'value'); + $likeCondition = new Like('column', 'invalid', 'value'); $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Invalid operator in like condition: "INVALID"'); - (new LikeConditionBuilder($db->getQueryBuilder()))->build($likeCondition); + (new LikeBuilder($db->getQueryBuilder()))->build($likeCondition); } } diff --git a/tests/Db/QueryBuilder/Condition/ExistsConditionTest.php b/tests/Db/QueryBuilder/Condition/ExistsTest.php similarity index 76% rename from tests/Db/QueryBuilder/Condition/ExistsConditionTest.php rename to tests/Db/QueryBuilder/Condition/ExistsTest.php index 6087c0c92..7e6f559d5 100644 --- a/tests/Db/QueryBuilder/Condition/ExistsConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/ExistsTest.php @@ -8,14 +8,12 @@ use Yiisoft\Db\Connection\ConnectionInterface; use InvalidArgumentException; use Yiisoft\Db\Query\Query; -use Yiisoft\Db\QueryBuilder\Condition\ExistsCondition; +use Yiisoft\Db\QueryBuilder\Condition\Exists; /** * @group db - * - * @psalm-suppress PropertyNotSetInConstructor */ -final class ExistsConditionTest extends TestCase +final class ExistsTest extends TestCase { public function testConstructor(): void { @@ -23,7 +21,7 @@ public function testConstructor(): void ->select('id') ->from('users') ->where(['active' => 1]); - $existCondition = new ExistsCondition('EXISTS', $query); + $existCondition = new Exists('EXISTS', $query); $this->assertSame('EXISTS', $existCondition->operator); $this->assertSame($query, $existCondition->query); @@ -35,7 +33,7 @@ public function testFromArrayDefinition(): void ->select('id') ->from('users') ->where(['active' => 1]); - $existCondition = ExistsCondition::fromArrayDefinition('EXISTS', [$query]); + $existCondition = Exists::fromArrayDefinition('EXISTS', [$query]); $this->assertSame('EXISTS', $existCondition->operator); $this->assertSame($query, $existCondition->query); @@ -46,6 +44,6 @@ public function testFromArrayDefinitionExceptionQuery(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Sub query for EXISTS operator must be a Query object.'); - ExistsCondition::fromArrayDefinition('EXISTS', []); + Exists::fromArrayDefinition('EXISTS', []); } } diff --git a/tests/Db/QueryBuilder/Condition/HashConditionTest.php b/tests/Db/QueryBuilder/Condition/HashTest.php similarity index 56% rename from tests/Db/QueryBuilder/Condition/HashConditionTest.php rename to tests/Db/QueryBuilder/Condition/HashTest.php index 0c2a6447a..992f23025 100644 --- a/tests/Db/QueryBuilder/Condition/HashConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/HashTest.php @@ -5,25 +5,23 @@ namespace Yiisoft\Db\Tests\Db\QueryBuilder\Condition; use PHPUnit\Framework\TestCase; -use Yiisoft\Db\QueryBuilder\Condition\HashCondition; +use Yiisoft\Db\QueryBuilder\Condition\Hash; /** * @group db - * - * @psalm-suppress PropertyNotSetInConstructor */ -final class HashConditionTest extends TestCase +final class HashTest extends TestCase { public function testConstructor(): void { - $hashCondition = new HashCondition(['expired' => false, 'active' => true]); + $hashCondition = new Hash(['expired' => false, 'active' => true]); $this->assertSame(['expired' => false, 'active' => true], $hashCondition->hash); } public function testFromArrayDefinition(): void { - $hashCondition = HashCondition::fromArrayDefinition('AND', ['expired' => false, 'active' => true]); + $hashCondition = Hash::fromArrayDefinition('AND', ['expired' => false, 'active' => true]); $this->assertSame(['expired' => false, 'active' => true], $hashCondition->hash); } diff --git a/tests/Db/QueryBuilder/Condition/InConditionTest.php b/tests/Db/QueryBuilder/Condition/InTest.php similarity index 74% rename from tests/Db/QueryBuilder/Condition/InConditionTest.php rename to tests/Db/QueryBuilder/Condition/InTest.php index 8e2c9541a..cd51a3f7a 100644 --- a/tests/Db/QueryBuilder/Condition/InConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/InTest.php @@ -6,18 +6,16 @@ use PHPUnit\Framework\TestCase; use InvalidArgumentException; -use Yiisoft\Db\QueryBuilder\Condition\InCondition; +use Yiisoft\Db\QueryBuilder\Condition\In; /** * @group db - * - * @psalm-suppress PropertyNotSetInConstructor */ -final class InConditionTest extends TestCase +final class InTest extends TestCase { public function testConstructor(): void { - $inCondition = new InCondition('id', 'IN', [1, 2, 3]); + $inCondition = new In('id', 'IN', [1, 2, 3]); $this->assertSame('id', $inCondition->column); $this->assertSame('IN', $inCondition->operator); @@ -26,7 +24,7 @@ public function testConstructor(): void public function testFromArrayDefinition(): void { - $inCondition = InCondition::fromArrayDefinition('IN', ['id', [1, 2, 3]]); + $inCondition = In::fromArrayDefinition('IN', ['id', [1, 2, 3]]); $this->assertSame('id', $inCondition->column); $this->assertSame('IN', $inCondition->operator); @@ -38,7 +36,7 @@ public function testFromArrayDefinitionException(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage("Operator 'IN' requires two operands."); - InCondition::fromArrayDefinition('IN', []); + In::fromArrayDefinition('IN', []); } public function testFromArrayDefinitionExceptionColumn(): void @@ -46,7 +44,7 @@ public function testFromArrayDefinitionExceptionColumn(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage("Operator 'IN' requires column to be string, array or Iterator."); - InCondition::fromArrayDefinition('IN', [1, [1, 2, 3]]); + In::fromArrayDefinition('IN', [1, [1, 2, 3]]); } public function testFromArrayDefinitionExceptionValues(): void @@ -56,6 +54,6 @@ public function testFromArrayDefinitionExceptionValues(): void "Operator 'IN' requires values to be array, Iterator, int or QueryInterface." ); - InCondition::fromArrayDefinition('IN', ['id', false]); + In::fromArrayDefinition('IN', ['id', false]); } } diff --git a/tests/Db/QueryBuilder/Condition/LikeConditionTest.php b/tests/Db/QueryBuilder/Condition/LikeTest.php similarity index 77% rename from tests/Db/QueryBuilder/Condition/LikeConditionTest.php rename to tests/Db/QueryBuilder/Condition/LikeTest.php index f3fc63974..fe20bde9c 100644 --- a/tests/Db/QueryBuilder/Condition/LikeConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/LikeTest.php @@ -7,16 +7,16 @@ use PHPUnit\Framework\Attributes\TestWith; use PHPUnit\Framework\TestCase; use InvalidArgumentException; -use Yiisoft\Db\QueryBuilder\Condition\LikeCondition; +use Yiisoft\Db\QueryBuilder\Condition\Like; /** * @group db */ -final class LikeConditionTest extends TestCase +final class LikeTest extends TestCase { public function testConstructor(): void { - $likeCondition = new LikeCondition('id', 'LIKE', 'test'); + $likeCondition = new Like('id', 'LIKE', 'test'); $this->assertSame('id', $likeCondition->column); $this->assertSame('LIKE', $likeCondition->operator); @@ -26,7 +26,7 @@ public function testConstructor(): void public function testFromArrayDefinition(): void { - $likeCondition = LikeCondition::fromArrayDefinition('LIKE', ['id', 'test']); + $likeCondition = Like::fromArrayDefinition('LIKE', ['id', 'test']); $this->assertSame('id', $likeCondition->column); $this->assertSame('LIKE', $likeCondition->operator); @@ -39,7 +39,7 @@ public function testFromArrayDefinitionException(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage("Operator 'LIKE' requires two operands."); - LikeCondition::fromArrayDefinition('LIKE', []); + Like::fromArrayDefinition('LIKE', []); } public function testFromArrayDefinitionExceptionColumn(): void @@ -47,7 +47,7 @@ public function testFromArrayDefinitionExceptionColumn(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage("Operator 'LIKE' requires column to be string or ExpressionInterface."); - LikeCondition::fromArrayDefinition('LIKE', [false, 'test']); + Like::fromArrayDefinition('LIKE', [false, 'test']); } public function testFromArrayDefinitionExceptionValue(): void @@ -57,12 +57,12 @@ public function testFromArrayDefinitionExceptionValue(): void "Operator 'LIKE' requires value to be string, array, Iterator or ExpressionInterface." ); - LikeCondition::fromArrayDefinition('LIKE', ['id', false]); + Like::fromArrayDefinition('LIKE', ['id', false]); } public function testFromArrayDefinitionSetEscapingReplacements(): void { - $likeCondition = LikeCondition::fromArrayDefinition('LIKE', ['id', 'test', ['%' => '\%', '_' => '\_']]); + $likeCondition = Like::fromArrayDefinition('LIKE', ['id', 'test', ['%' => '\%', '_' => '\_']]); $this->assertSame('id', $likeCondition->column); $this->assertSame('LIKE', $likeCondition->operator); @@ -72,7 +72,7 @@ public function testFromArrayDefinitionSetEscapingReplacements(): void public function testSetEscapingReplacements(): void { - $likeCondition = new LikeCondition('id', 'LIKE', 'test'); + $likeCondition = new Like('id', 'LIKE', 'test'); $likeCondition->setEscapingReplacements(['%' => '\%', '_' => '\_']); $this->assertSame(['%' => '\%', '_' => '\_'], $likeCondition->getEscapingReplacements()); @@ -83,7 +83,7 @@ public function testSetEscapingReplacements(): void #[TestWith([false])] public function testFromArrayDefinitionCaseSensitive(?bool $caseSensitive): void { - $likeCondition = LikeCondition::fromArrayDefinition('LIKE', ['id', 'test', 'caseSensitive' => $caseSensitive]); + $likeCondition = Like::fromArrayDefinition('LIKE', ['id', 'test', 'caseSensitive' => $caseSensitive]); $this->assertSame('id', $likeCondition->column); $this->assertSame('LIKE', $likeCondition->operator); diff --git a/tests/Db/QueryBuilder/Condition/NotConditionTest.php b/tests/Db/QueryBuilder/Condition/NotTest.php similarity index 70% rename from tests/Db/QueryBuilder/Condition/NotConditionTest.php rename to tests/Db/QueryBuilder/Condition/NotTest.php index 40da90175..9e5af339c 100644 --- a/tests/Db/QueryBuilder/Condition/NotConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/NotTest.php @@ -6,25 +6,23 @@ use PHPUnit\Framework\TestCase; use InvalidArgumentException; -use Yiisoft\Db\QueryBuilder\Condition\NotCondition; +use Yiisoft\Db\QueryBuilder\Condition\Not; /** * @group db - * - * @psalm-suppress PropertyNotSetInConstructor */ -final class NotConditionTest extends TestCase +final class NotTest extends TestCase { public function testConstructor(): void { - $notCondition = new NotCondition('id = 1'); + $notCondition = new Not('id = 1'); $this->assertSame('id = 1', $notCondition->condition); } public function testFromArrayDefinition(): void { - $notCondition = NotCondition::fromArrayDefinition('NOT', ['id = 1']); + $notCondition = Not::fromArrayDefinition('NOT', ['id = 1']); $this->assertSame('id = 1', $notCondition->condition); } @@ -34,7 +32,7 @@ public function testFromArrayDefinitionException(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage("Operator 'NOT' requires exactly one operand."); - NotCondition::fromArrayDefinition('NOT', []); + Not::fromArrayDefinition('NOT', []); } public function testFromArrayDefinitionExceptionCondition(): void @@ -44,6 +42,6 @@ public function testFromArrayDefinitionExceptionCondition(): void "Operator 'NOT' requires condition to be array, string, null or ExpressionInterface." ); - NotCondition::fromArrayDefinition('NOT', [false]); + Not::fromArrayDefinition('NOT', [false]); } } diff --git a/tests/Db/QueryBuilder/Condition/SimpleConditionTest.php b/tests/Db/QueryBuilder/Condition/SimpleTest.php similarity index 71% rename from tests/Db/QueryBuilder/Condition/SimpleConditionTest.php rename to tests/Db/QueryBuilder/Condition/SimpleTest.php index fa5e5990e..579db2aca 100644 --- a/tests/Db/QueryBuilder/Condition/SimpleConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/SimpleTest.php @@ -6,18 +6,16 @@ use PHPUnit\Framework\TestCase; use InvalidArgumentException; -use Yiisoft\Db\QueryBuilder\Condition\SimpleCondition; +use Yiisoft\Db\QueryBuilder\Condition\Simple; /** * @group db - * - * @psalm-suppress PropertyNotSetInConstructor */ -final class SimpleConditionTest extends TestCase +final class SimpleTest extends TestCase { public function testConstructor(): void { - $simpleCondition = new SimpleCondition('id', '=', 1); + $simpleCondition = new Simple('id', '=', 1); $this->assertSame('id', $simpleCondition->column); $this->assertSame('=', $simpleCondition->operator); @@ -26,7 +24,7 @@ public function testConstructor(): void public function testFromArrayDefinition(): void { - $simpleCondition = SimpleCondition::fromArrayDefinition('=', ['id', 1]); + $simpleCondition = Simple::fromArrayDefinition('=', ['id', 1]); $this->assertSame('id', $simpleCondition->column); $this->assertSame('=', $simpleCondition->operator); @@ -38,7 +36,7 @@ public function testFromArrayDefinitionColumnException(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage("Operator '=' requires two operands."); - SimpleCondition::fromArrayDefinition('=', []); + Simple::fromArrayDefinition('=', []); } public function testFromArrayDefinitionValueException(): void @@ -46,7 +44,7 @@ public function testFromArrayDefinitionValueException(): void $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage("Operator 'IN' requires two operands."); - SimpleCondition::fromArrayDefinition('IN', ['column']); + Simple::fromArrayDefinition('IN', ['column']); } public function testFromArrayDefinitionExceptionColumn(): void @@ -56,16 +54,16 @@ public function testFromArrayDefinitionExceptionColumn(): void "Operator '=' requires column to be string or ExpressionInterface." ); - SimpleCondition::fromArrayDefinition('=', [1, 1]); + Simple::fromArrayDefinition('=', [1, 1]); } public function testNullSecondOperand(): void { - $condition = SimpleCondition::fromArrayDefinition('=', ['id', null]); + $condition = Simple::fromArrayDefinition('=', ['id', null]); $this->assertNull($condition->value); - $condition2 = new SimpleCondition('name', 'IS NOT', null); + $condition2 = new Simple('name', 'IS NOT', null); $this->assertSame('IS NOT', $condition2->operator); $this->assertNull($condition2->value); diff --git a/tests/Provider/QueryBuilderProvider.php b/tests/Provider/QueryBuilderProvider.php index 408d6ec9e..0e8c75916 100644 --- a/tests/Provider/QueryBuilderProvider.php +++ b/tests/Provider/QueryBuilderProvider.php @@ -16,9 +16,9 @@ use Yiisoft\Db\Expression\Expression; use Yiisoft\Db\Expression\JsonExpression; use Yiisoft\Db\Query\Query; -use Yiisoft\Db\QueryBuilder\Condition\BetweenColumnsCondition; -use Yiisoft\Db\QueryBuilder\Condition\InCondition; -use Yiisoft\Db\QueryBuilder\Condition\LikeCondition; +use Yiisoft\Db\QueryBuilder\Condition\BetweenColumns; +use Yiisoft\Db\QueryBuilder\Condition\In; +use Yiisoft\Db\QueryBuilder\Condition\Like; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; use Yiisoft\Db\Schema\Column\ColumnBuilder; use Yiisoft\Db\Tests\Support\DbHelper; @@ -346,27 +346,27 @@ public static function buildCondition(): array [':qp0' => 123], ], [ - new BetweenColumnsCondition('2018-02-11', 'BETWEEN', 'create_time', 'update_time'), + new BetweenColumns('2018-02-11', 'BETWEEN', 'create_time', 'update_time'), ':qp0 BETWEEN [[create_time]] AND [[update_time]]', [':qp0' => '2018-02-11'], ], [ - new BetweenColumnsCondition('2018-02-11', 'NOT BETWEEN', 'NOW()', 'update_time'), + new BetweenColumns('2018-02-11', 'NOT BETWEEN', 'NOW()', 'update_time'), ':qp0 NOT BETWEEN NOW() AND [[update_time]]', [':qp0' => '2018-02-11'], ], [ - new BetweenColumnsCondition(new Expression('NOW()'), 'BETWEEN', 'create_time', 'update_time'), + new BetweenColumns(new Expression('NOW()'), 'BETWEEN', 'create_time', 'update_time'), 'NOW() BETWEEN [[create_time]] AND [[update_time]]', [], ], [ - new BetweenColumnsCondition(new Expression('NOW()'), 'NOT BETWEEN', 'create_time', 'update_time'), + new BetweenColumns(new Expression('NOW()'), 'NOT BETWEEN', 'create_time', 'update_time'), 'NOW() NOT BETWEEN [[create_time]] AND [[update_time]]', [], ], [ - new BetweenColumnsCondition( + new BetweenColumns( new Expression('NOW()'), 'NOT BETWEEN', (new Query(static::getDb()))->select('min_date')->from('some_table'), @@ -376,7 +376,7 @@ public static function buildCondition(): array [], ], [ - new BetweenColumnsCondition( + new BetweenColumns( new Expression('NOW()'), 'NOT BETWEEN', new Expression('min_date'), @@ -488,17 +488,17 @@ public static function buildCondition(): array ], /* in object conditions */ - [new InCondition('id', 'in', 1), '[[id]]=:qp0', [':qp0' => 1]], - [new InCondition('id', 'in', [1]), '[[id]]=:qp0', [':qp0' => 1]], - [new InCondition('id', 'not in', 1), '[[id]]<>:qp0', [':qp0' => 1]], - [new InCondition('id', 'not in', [1]), '[[id]]<>:qp0', [':qp0' => 1]], - [new InCondition('id', 'in', [1, 2]), '[[id]] IN (:qp0, :qp1)', [':qp0' => 1, ':qp1' => 2]], - [new InCondition('id', 'not in', [1, 2]), '[[id]] NOT IN (:qp0, :qp1)', [':qp0' => 1, ':qp1' => 2]], - [new InCondition([], 'in', 1), '0=1', []], - [new InCondition([], 'in', [1]), '0=1', []], - 'inCondition-custom-1' => [new InCondition(['id', 'name'], 'in', []), '0=1', []], + [new In('id', 'in', 1), '[[id]]=:qp0', [':qp0' => 1]], + [new In('id', 'in', [1]), '[[id]]=:qp0', [':qp0' => 1]], + [new In('id', 'not in', 1), '[[id]]<>:qp0', [':qp0' => 1]], + [new In('id', 'not in', [1]), '[[id]]<>:qp0', [':qp0' => 1]], + [new In('id', 'in', [1, 2]), '[[id]] IN (:qp0, :qp1)', [':qp0' => 1, ':qp1' => 2]], + [new In('id', 'not in', [1, 2]), '[[id]] NOT IN (:qp0, :qp1)', [':qp0' => 1, ':qp1' => 2]], + [new In([], 'in', 1), '0=1', []], + [new In([], 'in', [1]), '0=1', []], + 'inCondition-custom-1' => [new In(['id', 'name'], 'in', []), '0=1', []], 'inCondition-custom-2' => [ - new InCondition( + new In( ['id'], 'in', (new Query(static::getDb()))->select('id')->from('users')->where(['active' => 1]), @@ -507,22 +507,22 @@ public static function buildCondition(): array [], ], 'inCondition-custom-3' => [ - new InCondition(['id', 'name'], 'in', [['id' => 1]]), + new In(['id', 'name'], 'in', [['id' => 1]]), '([[id]], [[name]]) IN ((:qp0, NULL))', [':qp0' => 1], ], 'inCondition-custom-4' => [ - new InCondition(['id', 'name'], 'in', [['name' => 'John Doe']]), + new In(['id', 'name'], 'in', [['name' => 'John Doe']]), '([[id]], [[name]]) IN ((NULL, :qp0))', [':qp0' => 'John Doe'], ], 'inCondition-custom-5' => [ - new InCondition(['id', 'name'], 'in', [['id' => 1, 'name' => 'John Doe']]), + new In(['id', 'name'], 'in', [['id' => 1, 'name' => 'John Doe']]), '([[id]], [[name]]) IN ((:qp0, :qp1))', [':qp0' => 1, ':qp1' => 'John Doe'], ], 'inCondition-custom-6' => [ - new InCondition( + new In( [new Expression('id')], 'in', (new Query(static::getDb()))->select('id')->from('users')->where(['active' => 1]), @@ -831,41 +831,41 @@ public static function buildLikeCondition(): array /* like object conditions */ [ - new LikeCondition('name', 'like', new Expression('CONCAT("test", name, "%")')), + new Like('name', 'like', new Expression('CONCAT("test", name, "%")')), '[[name]] LIKE CONCAT("test", name, "%")', [], ], [ - new LikeCondition('name', 'not like', new Expression('CONCAT("test", name, "%")')), + new Like('name', 'not like', new Expression('CONCAT("test", name, "%")')), '[[name]] NOT LIKE CONCAT("test", name, "%")', [], ], [ - new LikeCondition('name', 'or like', new Expression('CONCAT("test", name, "%")')), + new Like('name', 'or like', new Expression('CONCAT("test", name, "%")')), '[[name]] LIKE CONCAT("test", name, "%")', [], ], [ - new LikeCondition('name', 'or not like', new Expression('CONCAT("test", name, "%")')), + new Like('name', 'or not like', new Expression('CONCAT("test", name, "%")')), '[[name]] NOT LIKE CONCAT("test", name, "%")', [], ], [ - new LikeCondition('name', 'like', [new Expression('CONCAT("test", name, "%")'), '\ab_c']), + new Like('name', 'like', [new Expression('CONCAT("test", name, "%")'), '\ab_c']), '[[name]] LIKE CONCAT("test", name, "%") AND [[name]] LIKE :qp0', [':qp0' => new Param('%\\\ab\_c%', DataType::STRING)], ], [ - new LikeCondition('name', 'not like', [new Expression('CONCAT("test", name, "%")'), '\ab_c']), + new Like('name', 'not like', [new Expression('CONCAT("test", name, "%")'), '\ab_c']), '[[name]] NOT LIKE CONCAT("test", name, "%") AND [[name]] NOT LIKE :qp0', [':qp0' => new Param('%\\\ab\_c%', DataType::STRING)], ], [ - new LikeCondition('name', 'or like', [new Expression('CONCAT("test", name, "%")'), '\ab_c']), + new Like('name', 'or like', [new Expression('CONCAT("test", name, "%")'), '\ab_c']), '[[name]] LIKE CONCAT("test", name, "%") OR [[name]] LIKE :qp0', [':qp0' => new Param('%\\\ab\_c%', DataType::STRING)], ], [ - new LikeCondition('name', 'or not like', [new Expression('CONCAT("test", name, "%")'), '\ab_c']), + new Like('name', 'or not like', [new Expression('CONCAT("test", name, "%")'), '\ab_c']), '[[name]] NOT LIKE CONCAT("test", name, "%") OR [[name]] NOT LIKE :qp0', [':qp0' => new Param('%\\\ab\_c%', DataType::STRING)], ], From fef5a49baf8937c43b4d30eed14784d3e09e05e7 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Wed, 23 Jul 2025 09:52:46 +0300 Subject: [PATCH 2/6] improve --- docs/guide/en/query/where.md | 13 +++++++------ docs/guide/pt-BR/query/where.md | 11 +++++++---- src/QueryBuilder/Condition/Builder/InBuilder.php | 2 -- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/docs/guide/en/query/where.md b/docs/guide/en/query/where.md index a8ebb92e1..893c8ff15 100644 --- a/docs/guide/en/query/where.md +++ b/docs/guide/en/query/where.md @@ -297,12 +297,13 @@ Conversion from operator format into object format is performed according to `Yiisoft\Db\QueryBuilder\AbstractDQLQueryBuilder::conditionClasses` property that maps operator names to representative class names. -- `AND`, `OR` => `Yiisoft\Db\QueryBuilder\Condition\ConjunctionCondition`; -- `NOT` => `Yiisoft\Db\QueryBuilder\Condition\NotCondition`; -- `IN`, `NOT IN` => `Yiisoft\Db\QueryBuilder\Condition\InCondition`; -- `BETWEEN`, `NOT BETWEEN` => `Yiisoft\Db\QueryBuilder\Condition\BetweenCondition`; -- `ARRAY OVERLAPS` => `Yiisoft\Db\QueryBuilder\Condition\ArrayOverlapsCondition`; -- `JSON OVERLAPS` => `Yiisoft\Db\QueryBuilder\Condition\JsonOverlapsCondition`. +- `AND` => `Yiisoft\Db\QueryBuilder\Condition\AndCondition`; +- `OR` => `Yiisoft\Db\QueryBuilder\Condition\OrCondition`; +- `NOT` => `Yiisoft\Db\QueryBuilder\Condition\Not`; +- `IN`, `NOT IN` => `Yiisoft\Db\QueryBuilder\Condition\In`; +- `BETWEEN`, `NOT BETWEEN` => `Yiisoft\Db\QueryBuilder\Condition\Between`; +- `ARRAY OVERLAPS` => `Yiisoft\Db\QueryBuilder\Condition\ArrayOverlaps`; +- `JSON OVERLAPS` => `Yiisoft\Db\QueryBuilder\Condition\JsonOverlaps`. ## Appending conditions diff --git a/docs/guide/pt-BR/query/where.md b/docs/guide/pt-BR/query/where.md index d37bcfc34..285685478 100644 --- a/docs/guide/pt-BR/query/where.md +++ b/docs/guide/pt-BR/query/where.md @@ -272,10 +272,13 @@ A conversão do formato operador para o formato objeto é realizada de acordo com a propriedade `Yiisoft\Db\QueryBuilder\AbstractDQLQueryBuilder::conditionClasses` que mapeia nomes de operadores para nomes de classes representativos. -- `AND`, `OR` => `Yiisoft\Db\QueryBuilder\Condition\ConjunctionCondition`. -- `NOT` => `Yiisoft\Db\QueryBuilder\Condition\NotCondition`. -- `IN`, `NOT IN` => `Yiisoft\Db\QueryBuilder\Condition\InCondition`. -- `BETWEEN`, `NOT BETWEEN` => `Yiisoft\Db\QueryBuilder\Condition\BetweenCondition`. +- `AND` => `Yiisoft\Db\QueryBuilder\Condition\AndCondition`; +- `OR` => `Yiisoft\Db\QueryBuilder\Condition\OrCondition`; +- `NOT` => `Yiisoft\Db\QueryBuilder\Condition\Not`; +- `IN`, `NOT IN` => `Yiisoft\Db\QueryBuilder\Condition\In`; +- `BETWEEN`, `NOT BETWEEN` => `Yiisoft\Db\QueryBuilder\Condition\Between`; +- `ARRAY OVERLAPS` => `Yiisoft\Db\QueryBuilder\Condition\ArrayOverlaps`; +- `JSON OVERLAPS` => `Yiisoft\Db\QueryBuilder\Condition\JsonOverlaps`. ## Anexando condições diff --git a/src/QueryBuilder/Condition/Builder/InBuilder.php b/src/QueryBuilder/Condition/Builder/InBuilder.php index c784eab47..9800b5f00 100644 --- a/src/QueryBuilder/Condition/Builder/InBuilder.php +++ b/src/QueryBuilder/Condition/Builder/InBuilder.php @@ -80,7 +80,6 @@ public function build(ExpressionInterface $expression, array &$params = []): str return $this->buildCompositeInCondition($operator, $column, $values, $params); } - /** @psalm-var mixed $column */ $column = reset($column); } @@ -90,7 +89,6 @@ public function build(ExpressionInterface $expression, array &$params = []): str } $column->rewind(); - /** @psalm-var mixed $column */ $column = $column->current(); } From 4239dc03123719a580ad743fd5163b0a39a0f836 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Wed, 23 Jul 2025 10:25:19 +0300 Subject: [PATCH 3/6] fix changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd130b969..d986913ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -111,7 +111,7 @@ - Chg #1001: Remove `ParamInterface` (@vjik) - Chg #1001: Add public properties `$type` and `$value` to `Param` class instead of `getType()` and `getValue()` methods that were removed (@vjik) - Chg #1002: Remove specific condition interfaces (@vjik) -- Chg #1003, #1005: Refactor namespace of condition objects and use promoted properties instead of getters (@vjik) +- Chg #1003, #1006: Refactor namespace of condition objects and use promoted properties instead of getters (@vjik) ## 1.3.0 March 21, 2024 From c209dd1ae5ba0129ada1e8ece8734b03aa7aa428 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Thu, 24 Jul 2025 14:45:52 +0300 Subject: [PATCH 4/6] AndX, OrX --- docs/guide/en/query/where.md | 8 ++++---- docs/guide/pt-BR/query/where.md | 8 ++++---- src/QueryBuilder/AbstractDQLQueryBuilder.php | 8 ++++---- .../Condition/{OrCondition.php => AndX.php} | 2 +- .../Condition/Builder/LogicalBuilder.php | 16 ++++++++-------- .../Condition/{AndCondition.php => OrX.php} | 2 +- tests/AbstractQueryBuilderTest.php | 18 +++++++++--------- .../{AndConditionTest.php => AndXTest.php} | 6 +++--- 8 files changed, 34 insertions(+), 34 deletions(-) rename src/QueryBuilder/Condition/{OrCondition.php => AndX.php} (92%) rename src/QueryBuilder/Condition/{AndCondition.php => OrX.php} (92%) rename tests/Db/QueryBuilder/Condition/{AndConditionTest.php => AndXTest.php} (63%) diff --git a/docs/guide/en/query/where.md b/docs/guide/en/query/where.md index 893c8ff15..62201179e 100644 --- a/docs/guide/en/query/where.md +++ b/docs/guide/en/query/where.md @@ -277,13 +277,13 @@ so it's possible to combine formats in a single condition: ```php use Yiisoft\Db\QueryBuilder\Condition\In; -use Yiisoft\Db\QueryBuilder\Condition\OrCondition; +use Yiisoft\Db\QueryBuilder\Condition\OrX; use Yiisoft\Db\Query\Query; /** @var Query $query */ $query->andWhere( - new OrCondition( + new OrX( [ new In('type', 'in', $types), ['like', 'name', '%good%'], @@ -297,8 +297,8 @@ Conversion from operator format into object format is performed according to `Yiisoft\Db\QueryBuilder\AbstractDQLQueryBuilder::conditionClasses` property that maps operator names to representative class names. -- `AND` => `Yiisoft\Db\QueryBuilder\Condition\AndCondition`; -- `OR` => `Yiisoft\Db\QueryBuilder\Condition\OrCondition`; +- `AND` => `Yiisoft\Db\QueryBuilder\Condition\AndX`; +- `OR` => `Yiisoft\Db\QueryBuilder\Condition\OrX`; - `NOT` => `Yiisoft\Db\QueryBuilder\Condition\Not`; - `IN`, `NOT IN` => `Yiisoft\Db\QueryBuilder\Condition\In`; - `BETWEEN`, `NOT BETWEEN` => `Yiisoft\Db\QueryBuilder\Condition\Between`; diff --git a/docs/guide/pt-BR/query/where.md b/docs/guide/pt-BR/query/where.md index 285685478..abeb68db4 100644 --- a/docs/guide/pt-BR/query/where.md +++ b/docs/guide/pt-BR/query/where.md @@ -252,13 +252,13 @@ então é possível combinar formatos em uma única condição: ```php use Yiisoft\Db\QueryBuilder\Condition\In; -use Yiisoft\Db\QueryBuilder\Condition\OrCondition; +use Yiisoft\Db\QueryBuilder\Condition\OrX; use Yiisoft\Db\Query\Query; /** @var Query $query */ $query->andWhere( - new OrCondition( + new OrX( [ new In('type', 'in', $types), ['like', 'name', '%good%'], @@ -272,8 +272,8 @@ A conversão do formato operador para o formato objeto é realizada de acordo com a propriedade `Yiisoft\Db\QueryBuilder\AbstractDQLQueryBuilder::conditionClasses` que mapeia nomes de operadores para nomes de classes representativos. -- `AND` => `Yiisoft\Db\QueryBuilder\Condition\AndCondition`; -- `OR` => `Yiisoft\Db\QueryBuilder\Condition\OrCondition`; +- `AND` => `Yiisoft\Db\QueryBuilder\Condition\AndX`; +- `OR` => `Yiisoft\Db\QueryBuilder\Condition\OrX`; - `NOT` => `Yiisoft\Db\QueryBuilder\Condition\Not`; - `IN`, `NOT IN` => `Yiisoft\Db\QueryBuilder\Condition\In`; - `BETWEEN`, `NOT BETWEEN` => `Yiisoft\Db\QueryBuilder\Condition\Between`; diff --git a/src/QueryBuilder/AbstractDQLQueryBuilder.php b/src/QueryBuilder/AbstractDQLQueryBuilder.php index d79797a6d..8a3aa56eb 100644 --- a/src/QueryBuilder/AbstractDQLQueryBuilder.php +++ b/src/QueryBuilder/AbstractDQLQueryBuilder.php @@ -504,8 +504,8 @@ protected function defaultConditionClasses(): array { return [ 'NOT' => Condition\Not::class, - 'AND' => Condition\AndCondition::class, - 'OR' => Condition\OrCondition::class, + 'AND' => Condition\AndX::class, + 'OR' => Condition\OrX::class, 'BETWEEN' => Condition\Between::class, 'NOT BETWEEN' => Condition\Between::class, 'IN' => Condition\In::class, @@ -537,8 +537,8 @@ protected function defaultExpressionBuilders(): array Param::class => ParamBuilder::class, Expression::class => ExpressionBuilder::class, Condition\Not::class => Condition\Builder\NotBuilder::class, - Condition\AndCondition::class => Condition\Builder\LogicalBuilder::class, - Condition\OrCondition::class => Condition\Builder\LogicalBuilder::class, + Condition\AndX::class => Condition\Builder\LogicalBuilder::class, + Condition\OrX::class => Condition\Builder\LogicalBuilder::class, Condition\Between::class => Condition\Builder\BetweenBuilder::class, Condition\In::class => Condition\Builder\InBuilder::class, Condition\Like::class => Condition\Builder\LikeBuilder::class, diff --git a/src/QueryBuilder/Condition/OrCondition.php b/src/QueryBuilder/Condition/AndX.php similarity index 92% rename from src/QueryBuilder/Condition/OrCondition.php rename to src/QueryBuilder/Condition/AndX.php index 0bf8bb606..4d4d747f6 100644 --- a/src/QueryBuilder/Condition/OrCondition.php +++ b/src/QueryBuilder/Condition/AndX.php @@ -9,7 +9,7 @@ /** * Condition that connects two or more SQL expressions with the `AND` operator. */ -final class OrCondition implements ConditionInterface +final class AndX implements ConditionInterface { /** * @param array $expressions The expressions that are connected by this condition. diff --git a/src/QueryBuilder/Condition/Builder/LogicalBuilder.php b/src/QueryBuilder/Condition/Builder/LogicalBuilder.php index 231b65d05..b781baf7c 100644 --- a/src/QueryBuilder/Condition/Builder/LogicalBuilder.php +++ b/src/QueryBuilder/Condition/Builder/LogicalBuilder.php @@ -10,8 +10,8 @@ use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Expression\ExpressionBuilderInterface; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\QueryBuilder\Condition\AndCondition; -use Yiisoft\Db\QueryBuilder\Condition\OrCondition; +use Yiisoft\Db\QueryBuilder\Condition\AndX; +use Yiisoft\Db\QueryBuilder\Condition\OrX; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; use function count; @@ -20,9 +20,9 @@ use function reset; /** - * Build an object of {@see AndCondition} or {@see OrCondition} into SQL expressions. + * Build an object of {@see AndX} or {@see OrX} into SQL expressions. * - * @implements ExpressionBuilderInterface + * @implements ExpressionBuilderInterface */ final class LogicalBuilder implements ExpressionBuilderInterface { @@ -32,9 +32,9 @@ public function __construct( } /** - * Build SQL for {@see AndCondition} or {@see OrCondition}. + * Build SQL for {@see AndX} or {@see OrX}. * - * @param AndCondition|OrCondition $expression + * @param AndX|OrX $expression * * @throws Exception * @throws InvalidArgumentException @@ -54,8 +54,8 @@ public function build(ExpressionInterface $expression, array &$params = []): str } $operator = match ($expression::class) { - AndCondition::class => 'AND', - OrCondition::class => 'OR', + AndX::class => 'AND', + OrX::class => 'OR', }; return '(' . implode(") $operator (", $parts) . ')'; diff --git a/src/QueryBuilder/Condition/AndCondition.php b/src/QueryBuilder/Condition/OrX.php similarity index 92% rename from src/QueryBuilder/Condition/AndCondition.php rename to src/QueryBuilder/Condition/OrX.php index 4a6ab6c02..ab554b16d 100644 --- a/src/QueryBuilder/Condition/AndCondition.php +++ b/src/QueryBuilder/Condition/OrX.php @@ -9,7 +9,7 @@ /** * Condition that connects two or more SQL expressions with the `AND` operator. */ -final class AndCondition implements ConditionInterface +final class OrX implements ConditionInterface { /** * @param array $expressions The expressions that are connected by this condition. diff --git a/tests/AbstractQueryBuilderTest.php b/tests/AbstractQueryBuilderTest.php index ad2b9eee5..e608da75c 100644 --- a/tests/AbstractQueryBuilderTest.php +++ b/tests/AbstractQueryBuilderTest.php @@ -22,10 +22,10 @@ use Yiisoft\Db\Expression\ExpressionInterface; use Yiisoft\Db\Query\Query; use Yiisoft\Db\Query\QueryInterface; -use Yiisoft\Db\QueryBuilder\Condition\AndCondition; +use Yiisoft\Db\QueryBuilder\Condition\AndX; use Yiisoft\Db\QueryBuilder\Condition\ArrayOverlaps; use Yiisoft\Db\QueryBuilder\Condition\JsonOverlaps; -use Yiisoft\Db\QueryBuilder\Condition\OrCondition; +use Yiisoft\Db\QueryBuilder\Condition\OrX; use Yiisoft\Db\QueryBuilder\Condition\Simple; use Yiisoft\Db\Schema\Column\ColumnInterface; use Yiisoft\Db\Schema\QuoterInterface; @@ -1573,33 +1573,33 @@ public function testsCreateConditionFromArray(): void $qb = $this->getConnection()->getQueryBuilder(); $condition = $qb->createConditionFromArray(['and', 'a = 1', 'b = 2']); - $this->assertInstanceOf(AndCondition::class, $condition); + $this->assertInstanceOf(AndX::class, $condition); $this->assertSame(['a = 1', 'b = 2'], $condition->expressions); $condition = $qb->createConditionFromArray(['or', 'a = 1', 'b = 2']); - $this->assertInstanceOf(OrCondition::class, $condition); + $this->assertInstanceOf(OrX::class, $condition); $this->assertSame(['a = 1', 'b = 2'], $condition->expressions); $condition = $qb->createConditionFromArray(['and', 'a = 1', ['or', 'b = 2', 'c = 3']]); - $this->assertInstanceOf(AndCondition::class, $condition); + $this->assertInstanceOf(AndX::class, $condition); $this->assertSame(['a = 1', ['or', 'b = 2', 'c = 3']], $condition->expressions); $condition = $qb->createConditionFromArray(['or', 'a = 1', ['and', 'b = 2', 'c = 3']]); - $this->assertInstanceOf(OrCondition::class, $condition); + $this->assertInstanceOf(OrX::class, $condition); $this->assertSame(['a = 1', ['and', 'b = 2', 'c = 3']], $condition->expressions); $condition = $qb->createConditionFromArray(['and', 'a = 1', ['or', 'b = 2', ['and', 'c = 3', 'd = 4']]]); - $this->assertInstanceOf(AndCondition::class, $condition); + $this->assertInstanceOf(AndX::class, $condition); $this->assertSame(['a = 1', ['or', 'b = 2', ['and', 'c = 3', 'd = 4']]], $condition->expressions); $condition = $qb->createConditionFromArray(['or', 'a = 1', ['and', 'b = 2', ['or', 'c = 3', 'd = 4']]]); - $this->assertInstanceOf(OrCondition::class, $condition); + $this->assertInstanceOf(OrX::class, $condition); $this->assertSame(['a = 1', ['and', 'b = 2', ['or', 'c = 3', 'd = 4']]], $condition->expressions); $condition = $qb->createConditionFromArray( ['and', 'a = 1', ['or', 'b = 2', ['and', 'c = 3', ['or', 'd = 4', 'e = 5']]]] ); - $this->assertInstanceOf(AndCondition::class, $condition); + $this->assertInstanceOf(AndX::class, $condition); $this->assertSame( ['a = 1', ['or', 'b = 2', ['and', 'c = 3', ['or', 'd = 4', 'e = 5']]]], $condition->expressions, diff --git a/tests/Db/QueryBuilder/Condition/AndConditionTest.php b/tests/Db/QueryBuilder/Condition/AndXTest.php similarity index 63% rename from tests/Db/QueryBuilder/Condition/AndConditionTest.php rename to tests/Db/QueryBuilder/Condition/AndXTest.php index 9b5f673b5..c2799ee04 100644 --- a/tests/Db/QueryBuilder/Condition/AndConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/AndXTest.php @@ -5,16 +5,16 @@ namespace Yiisoft\Db\Tests\Db\QueryBuilder\Condition; use PHPUnit\Framework\TestCase; -use Yiisoft\Db\QueryBuilder\Condition\AndCondition; +use Yiisoft\Db\QueryBuilder\Condition\AndX; /** * @group db */ -final class AndConditionTest extends TestCase +final class AndXTest extends TestCase { public function testConstructor(): void { - $andCondition = new AndCondition(['a' => 1, 'b' => 2]); + $andCondition = new AndX(['a' => 1, 'b' => 2]); $this->assertSame(['a' => 1, 'b' => 2], $andCondition->expressions); } From 82d24c0eed09892e591e3fc82439cf06fa5b3566 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Fri, 25 Jul 2025 06:28:51 +0300 Subject: [PATCH 5/6] Update src/QueryBuilder/Condition/OrX.php Co-authored-by: Sergei Tigrov --- src/QueryBuilder/Condition/OrX.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/QueryBuilder/Condition/OrX.php b/src/QueryBuilder/Condition/OrX.php index ab554b16d..4e6331a02 100644 --- a/src/QueryBuilder/Condition/OrX.php +++ b/src/QueryBuilder/Condition/OrX.php @@ -7,7 +7,7 @@ use Yiisoft\Db\Expression\ExpressionInterface; /** - * Condition that connects two or more SQL expressions with the `AND` operator. + * Condition that connects two or more SQL expressions with the `OR` operator. */ final class OrX implements ConditionInterface { From 69a849f1c14039978755b8190d085d00be4a80b9 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Fri, 25 Jul 2025 23:31:03 +0300 Subject: [PATCH 6/6] Rename "Hash" to "Columns" --- CHANGELOG.md | 2 +- docs/guide/en/query/where.md | 10 ++++---- src/Query/Query.php | 4 +--- src/Query/QueryPartsInterface.php | 4 ++-- src/QueryBuilder/AbstractDQLQueryBuilder.php | 11 +++++---- .../{HashBuilder.php => ColumnsBuilder.php} | 24 ++++++++----------- .../Condition/{Hash.php => Columns.php} | 9 ++++--- tests/AbstractQueryTest.php | 24 +++++-------------- .../{HashTest.php => ColumnsTest.php} | 12 +++++----- tests/Provider/QueryBuilderProvider.php | 2 +- 10 files changed, 45 insertions(+), 57 deletions(-) rename src/QueryBuilder/Condition/Builder/{HashBuilder.php => ColumnsBuilder.php} (73%) rename src/QueryBuilder/Condition/{Hash.php => Columns.php} (61%) rename tests/Db/QueryBuilder/Condition/{HashTest.php => ColumnsTest.php} (56%) diff --git a/CHANGELOG.md b/CHANGELOG.md index e041e45c2..ab6aba6bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -107,7 +107,7 @@ - Enh #991: Improve types in `ConnectionInterface::transaction()` (@kikara) - Chg #998: Add `yiisoft/db-implementation` virtual package as dependency (@vjik) - Chg #999: Remove `requireTransaction()` method and `$isolationLevel` property from `AbstractCommand` (@vjik) -- Enh #1000: Prepare values in `HashCondition` (@vjik) +- Enh #1000: Prepare values in `Columns` (@vjik) - Chg #1001: Remove `ParamInterface` (@vjik) - Chg #1001: Add public properties `$type` and `$value` to `Param` class instead of `getType()` and `getValue()` methods that were removed (@vjik) - Chg #1002: Remove specific condition interfaces (@vjik) diff --git a/docs/guide/en/query/where.md b/docs/guide/en/query/where.md index 62201179e..7ec904623 100644 --- a/docs/guide/en/query/where.md +++ b/docs/guide/en/query/where.md @@ -4,7 +4,7 @@ The `Yiisoft\Db\Query\Query::where()` method specifies the `WHERE` fragment of a You can use one of the four formats to specify a `WHERE` condition. - string format, `status=1`. -- hash format, `['status' => 1, 'type' => 2]`. +- key-value format, `['status' => 1, 'type' => 2]`. - operator format, `['like', 'name', 'test']`. - object format, `new LikeCondition('name', 'LIKE', 'test')`. @@ -60,7 +60,7 @@ WHERE (`status` = 10) AND (`type` IS NULL) AND (`id` IN (4, 8, 15)) As you can see, the query builder is intelligent enough to handle values that are nulls or arrays. -You can also use subqueries with hash format like the following. +You can also use subqueries with key-value format like the following. ```php use Yiisoft\Db\Connection\ConnectionInterface; @@ -78,7 +78,7 @@ The relevant part of SQL is: WHERE `id` IN (SELECT `id` FROM `user`) ``` -Using the hash format, Yii DB internally applies parameter binding for values, so in contrast to the string format, +Using the key-value format, Yii DB internally applies parameter binding for values, so in contrast to the string format, here you don't have to add parameters manually. However, note that Yii DB never escapes column names, so if you pass a variable obtained from the user side as a column @@ -104,7 +104,7 @@ Operator format allows you to specify arbitrary conditions in a programmatic way ['operator', 'operand1', 'operand2', ...] ``` -Where the operands can each be specified in string format, hash format or operator format recursively, +Where the operands can each be specified in string format, key-value format or operator format recursively, while the operator can be one of the following: ### and @@ -344,7 +344,7 @@ $query->filterWhere(['username' => $username, 'email' => $email]); ``` The only difference between `Yiisoft\Db\Query\Query::filterWhere()` and `Yiisoft\Db\Query\Query::where()` -is that the former will ignore empty values provided in the condition in hash format. +is that the former will ignore empty values provided in the condition in key-value format. So, if `$email` is empty while `$username` isn't, the above code will result in the SQL condition `WHERE username=:username`. diff --git a/src/Query/Query.php b/src/Query/Query.php index 458d42ada..97a328abc 100644 --- a/src/Query/Query.php +++ b/src/Query/Query.php @@ -882,9 +882,7 @@ private function filterCondition(array|string $condition): array|string if (!isset($condition[0])) { /** - * Hash format: 'column1' => 'value1', 'column2' => 'value2', ... - * - * @psalm-var mixed $value + * Key-value format: 'column1' => 'value1', 'column2' => 'value2', ... */ foreach ($condition as $name => $value) { if ($this->isEmpty($value)) { diff --git a/src/Query/QueryPartsInterface.php b/src/Query/QueryPartsInterface.php index 16c6263d1..cc2c167e1 100644 --- a/src/Query/QueryPartsInterface.php +++ b/src/Query/QueryPartsInterface.php @@ -644,10 +644,10 @@ public function union(QueryInterface|string $sql, bool $all = false): static; * * The `$condition` specified as an array can be in one of the following two formats: * - * - hash format: `['column1' => value1, 'column2' => value2, ...]` + * - key-value format: `['column1' => value1, 'column2' => value2, ...]` * - operator format: `[operator, operand1, operand2, ...]` * - * A condition in hash format represents the following SQL expression in general: + * A condition in key-value format represents the following SQL expression in general: * `column1=value1 AND column2=value2 AND ...`. In case when a value is an array, * an `IN` expression will be generated. And if a value is `null`, `IS NULL` will be used in the generated * expression. Below are some examples: diff --git a/src/QueryBuilder/AbstractDQLQueryBuilder.php b/src/QueryBuilder/AbstractDQLQueryBuilder.php index 8a3aa56eb..b5001ccb1 100644 --- a/src/QueryBuilder/AbstractDQLQueryBuilder.php +++ b/src/QueryBuilder/AbstractDQLQueryBuilder.php @@ -22,7 +22,7 @@ use Yiisoft\Db\Expression\CaseExpressionBuilder; use Yiisoft\Db\Expression\StructuredExpression; use Yiisoft\Db\Expression\StructuredExpressionBuilder; -use Yiisoft\Db\QueryBuilder\Condition\Hash; +use Yiisoft\Db\QueryBuilder\Condition\Columns; use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; use Yiisoft\Db\QueryBuilder\Condition\Simple; use Yiisoft\Db\Query\Query; @@ -449,8 +449,11 @@ public function createConditionFromArray(array $condition): ConditionInterface return $className::fromArrayDefinition($operator, $condition); } - /** hash format: 'column1' => 'value1', 'column2' => 'value2', ... */ - return new Hash($condition); + /** + * Key-value format: 'column1' => 'value1', 'column2' => 'value2', ... + * @psalm-var array $condition + */ + return new Columns($condition); } public function getExpressionBuilder(ExpressionInterface $expression): object @@ -544,7 +547,7 @@ protected function defaultExpressionBuilders(): array Condition\Like::class => Condition\Builder\LikeBuilder::class, Condition\Exists::class => Condition\Builder\ExistsBuilder::class, Simple::class => Condition\Builder\SimpleBuilder::class, - Hash::class => Condition\Builder\HashBuilder::class, + Columns::class => Condition\Builder\ColumnsBuilder::class, Condition\BetweenColumns::class => Condition\Builder\BetweenColumnsBuilder::class, JsonExpression::class => JsonExpressionBuilder::class, ArrayExpression::class => ArrayExpressionBuilder::class, diff --git a/src/QueryBuilder/Condition/Builder/HashBuilder.php b/src/QueryBuilder/Condition/Builder/ColumnsBuilder.php similarity index 73% rename from src/QueryBuilder/Condition/Builder/HashBuilder.php rename to src/QueryBuilder/Condition/Builder/ColumnsBuilder.php index 4ee1cfebd..50ef1835a 100644 --- a/src/QueryBuilder/Condition/Builder/HashBuilder.php +++ b/src/QueryBuilder/Condition/Builder/ColumnsBuilder.php @@ -10,7 +10,7 @@ use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Expression\ExpressionBuilderInterface; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\QueryBuilder\Condition\Hash; +use Yiisoft\Db\QueryBuilder\Condition\Columns; use Yiisoft\Db\QueryBuilder\Condition\In; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; use Yiisoft\Db\Query\QueryInterface; @@ -20,20 +20,21 @@ use function is_iterable; /** - * Build an object of {@see Hash} into SQL expressions. + * Build an object of {@see Columns} into SQL expressions. * - * @implements ExpressionBuilderInterface + * @implements ExpressionBuilderInterface */ -class HashBuilder implements ExpressionBuilderInterface +class ColumnsBuilder implements ExpressionBuilderInterface { - public function __construct(private readonly QueryBuilderInterface $queryBuilder) - { + public function __construct( + private readonly QueryBuilderInterface $queryBuilder, + ) { } /** - * Build SQL for {@see Hash}. + * Build SQL for {@see Columns}. * - * @param Hash $expression + * @param Columns $expression * * @throws Exception * @throws InvalidArgumentException @@ -42,13 +43,8 @@ public function __construct(private readonly QueryBuilderInterface $queryBuilder */ public function build(ExpressionInterface $expression, array &$params = []): string { - $hash = $expression->hash; $parts = []; - - /** - * @psalm-var array $hash - */ - foreach ($hash as $column => $value) { + foreach ($expression->values as $column => $value) { if (is_iterable($value) || $value instanceof QueryInterface) { /** IN condition */ $parts[] = $this->queryBuilder->buildCondition(new In($column, 'IN', $value), $params); diff --git a/src/QueryBuilder/Condition/Hash.php b/src/QueryBuilder/Condition/Columns.php similarity index 61% rename from src/QueryBuilder/Condition/Hash.php rename to src/QueryBuilder/Condition/Columns.php index 1a3d1a57d..51c613ef1 100644 --- a/src/QueryBuilder/Condition/Hash.php +++ b/src/QueryBuilder/Condition/Columns.php @@ -7,13 +7,15 @@ /** * Condition based on column-value pairs. */ -final class Hash implements ConditionInterface +final class Columns implements ConditionInterface { /** - * @param array $hash The condition specification. + * @param array $values The condition specification. + * + * @psalm-param array $values */ public function __construct( - public readonly array $hash = [], + public readonly array $values = [], ) { } @@ -22,6 +24,7 @@ public function __construct( */ public static function fromArrayDefinition(string $operator, array $operands): self { + /** @psalm-var array $operands */ return new self($operands); } } diff --git a/tests/AbstractQueryTest.php b/tests/AbstractQueryTest.php index 0271b7578..ae8604e3c 100644 --- a/tests/AbstractQueryTest.php +++ b/tests/AbstractQueryTest.php @@ -53,7 +53,7 @@ public function testAddParamsWithNameInt(): void } /** - * @depends testFilterWhereWithHashFormat + * @depends testFilterWhereWithKeyValueFormat * @depends testFilterWhereWithOperatorFormat * * @throws NotSupportedException @@ -111,10 +111,7 @@ public function testAndFilterHaving(): void $this->assertSame(['and', ['>', 'id', 1], ['>', 'id', 2]], $query->getHaving()); } - /** - * @throws NotSupportedException - */ - public function testAndFilterHavingWithHashFormat(): void + public function testAndFilterHavingWithKeyValueFormat(): void { $db = $this->getConnection(); @@ -209,10 +206,7 @@ public function testEmulateExecution(): void $this->assertSame([], $column); } - /** - * @throws NotSupportedException - */ - public function testFilterHavingWithHashFormat(): void + public function testFilterHavingWithKeyValueFormat(): void { $db = $this->getConnection(); @@ -298,7 +292,7 @@ public function testFilterRecursively(): void /** * @throws NotSupportedException */ - public function testFilterWhereWithHashFormat(): void + public function testFilterWhereWithKeyValueFormat(): void { $db = $this->getConnection(); @@ -464,10 +458,7 @@ public function testLimitOffset(): void $this->assertSame(5, $query->getOffset()); } - /** - * @throws NotSupportedException - */ - public function testOrFilterHavingHashFormat(): void + public function testOrFilterHavingKeyValueFormat(): void { $db = $this->getConnection(); @@ -477,10 +468,7 @@ public function testOrFilterHavingHashFormat(): void $this->assertSame(['status' => 1], $query->getHaving()); } - /** - * @throws NotSupportedException - */ - public function testOrFilterWhereHashFormat(): void + public function testOrFilterWhereKeyValueFormat(): void { $db = $this->getConnection(); diff --git a/tests/Db/QueryBuilder/Condition/HashTest.php b/tests/Db/QueryBuilder/Condition/ColumnsTest.php similarity index 56% rename from tests/Db/QueryBuilder/Condition/HashTest.php rename to tests/Db/QueryBuilder/Condition/ColumnsTest.php index 992f23025..646e602e9 100644 --- a/tests/Db/QueryBuilder/Condition/HashTest.php +++ b/tests/Db/QueryBuilder/Condition/ColumnsTest.php @@ -5,24 +5,24 @@ namespace Yiisoft\Db\Tests\Db\QueryBuilder\Condition; use PHPUnit\Framework\TestCase; -use Yiisoft\Db\QueryBuilder\Condition\Hash; +use Yiisoft\Db\QueryBuilder\Condition\Columns; /** * @group db */ -final class HashTest extends TestCase +final class ColumnsTest extends TestCase { public function testConstructor(): void { - $hashCondition = new Hash(['expired' => false, 'active' => true]); + $condition = new Columns(['expired' => false, 'active' => true]); - $this->assertSame(['expired' => false, 'active' => true], $hashCondition->hash); + $this->assertSame(['expired' => false, 'active' => true], $condition->values); } public function testFromArrayDefinition(): void { - $hashCondition = Hash::fromArrayDefinition('AND', ['expired' => false, 'active' => true]); + $condition = Columns::fromArrayDefinition('AND', ['expired' => false, 'active' => true]); - $this->assertSame(['expired' => false, 'active' => true], $hashCondition->hash); + $this->assertSame(['expired' => false, 'active' => true], $condition->values); } } diff --git a/tests/Provider/QueryBuilderProvider.php b/tests/Provider/QueryBuilderProvider.php index 7e1506f95..503dec90c 100644 --- a/tests/Provider/QueryBuilderProvider.php +++ b/tests/Provider/QueryBuilderProvider.php @@ -590,7 +590,7 @@ public static function buildCondition(): array [':qp0' => 0], ], - /* hash condition */ + /* columns */ [['a' => 1, 'b' => 2], '([[a]]=1) AND ([[b]]=2)', []], [ ['a' => new Expression('CONCAT(col1, col2)'), 'b' => 2],