From 3ed17d418789b9160280897784838d6b75292f04 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sun, 20 Jul 2025 16:30:13 +0300 Subject: [PATCH 01/14] and, or, simple --- src/QueryBuilder/AbstractDQLQueryBuilder.php | 5 +-- .../AbstractConjunctionCondition.php | 35 --------------- src/QueryBuilder/Condition/AndCondition.php | 18 ++++++-- .../Conjunction/AndConditionBuilder.php | 43 ++++++++++++++++++ .../ExpressionsConjunctionBuilder.php} | 42 +++++++++--------- .../Conjunction/OrConditionBuilder.php | 44 +++++++++++++++++++ .../Builder/SimpleConditionBuilder.php | 7 ++- src/QueryBuilder/Condition/OrCondition.php | 19 ++++++-- .../Condition/SimpleCondition.php | 35 ++++----------- tests/AbstractQueryBuilderTest.php | 44 ++++++++----------- .../Condition/AndConditionTest.php | 9 +--- .../Condition/SimpleConditionTest.php | 18 ++++---- 12 files changed, 177 insertions(+), 142 deletions(-) delete mode 100644 src/QueryBuilder/Condition/AbstractConjunctionCondition.php create mode 100644 src/QueryBuilder/Condition/Builder/Conjunction/AndConditionBuilder.php rename src/QueryBuilder/Condition/Builder/{ConjunctionConditionBuilder.php => Conjunction/ExpressionsConjunctionBuilder.php} (53%) create mode 100644 src/QueryBuilder/Condition/Builder/Conjunction/OrConditionBuilder.php diff --git a/src/QueryBuilder/AbstractDQLQueryBuilder.php b/src/QueryBuilder/AbstractDQLQueryBuilder.php index 7e8f370dc..cb9d6983a 100644 --- a/src/QueryBuilder/AbstractDQLQueryBuilder.php +++ b/src/QueryBuilder/AbstractDQLQueryBuilder.php @@ -536,10 +536,9 @@ protected function defaultExpressionBuilders(): array Query::class => QueryExpressionBuilder::class, Param::class => ParamBuilder::class, Expression::class => ExpressionBuilder::class, - Condition\AbstractConjunctionCondition::class => Condition\Builder\ConjunctionConditionBuilder::class, Condition\NotCondition::class => Condition\Builder\NotConditionBuilder::class, - Condition\AndCondition::class => Condition\Builder\ConjunctionConditionBuilder::class, - Condition\OrCondition::class => Condition\Builder\ConjunctionConditionBuilder::class, + Condition\AndCondition::class => Condition\Builder\Conjunction\AndConditionBuilder::class, + Condition\OrCondition::class => Condition\Builder\Conjunction\OrConditionBuilder::class, Condition\BetweenCondition::class => Condition\Builder\BetweenConditionBuilder::class, Condition\InCondition::class => Condition\Builder\InConditionBuilder::class, Condition\LikeCondition::class => Condition\Builder\LikeConditionBuilder::class, diff --git a/src/QueryBuilder/Condition/AbstractConjunctionCondition.php b/src/QueryBuilder/Condition/AbstractConjunctionCondition.php deleted file mode 100644 index 7295b8704..000000000 --- a/src/QueryBuilder/Condition/AbstractConjunctionCondition.php +++ /dev/null @@ -1,35 +0,0 @@ -expressions; - } - - public static function fromArrayDefinition(string $operator, array $operands): self - { - return new static($operands); - } -} diff --git a/src/QueryBuilder/Condition/AndCondition.php b/src/QueryBuilder/Condition/AndCondition.php index 464e7286e..4a6ab6c02 100644 --- a/src/QueryBuilder/Condition/AndCondition.php +++ b/src/QueryBuilder/Condition/AndCondition.php @@ -4,16 +4,26 @@ namespace Yiisoft\Db\QueryBuilder\Condition; +use Yiisoft\Db\Expression\ExpressionInterface; + /** * Condition that connects two or more SQL expressions with the `AND` operator. */ -final class AndCondition extends AbstractConjunctionCondition +final class AndCondition implements ConditionInterface { /** - * @return string The operator that's represented by this condition class, such as `AND`, `OR`. + * @param array $expressions The expressions that are connected by this condition. + * + * @psalm-param array $expressions */ - public function getOperator(): string + public function __construct( + public readonly array $expressions, + ) { + } + + public static function fromArrayDefinition(string $operator, array $operands): self { - return 'AND'; + /** @psalm-var array $operands */ + return new self($operands); } } diff --git a/src/QueryBuilder/Condition/Builder/Conjunction/AndConditionBuilder.php b/src/QueryBuilder/Condition/Builder/Conjunction/AndConditionBuilder.php new file mode 100644 index 000000000..b57e04c7a --- /dev/null +++ b/src/QueryBuilder/Condition/Builder/Conjunction/AndConditionBuilder.php @@ -0,0 +1,43 @@ + + */ +final class AndConditionBuilder implements ExpressionBuilderInterface +{ + private ExpressionsConjunctionBuilder $expressionsConjunctionBuilder; + + public function __construct( + QueryBuilderInterface $queryBuilder, + ) { + $this->expressionsConjunctionBuilder = new ExpressionsConjunctionBuilder('AND', $queryBuilder); + } + + /** + * Build SQL for {@see AndCondition}. + * + * @param AndCondition $expression + * + * @throws Exception + * @throws InvalidArgumentException + * @throws InvalidConfigException + * @throws NotSupportedException + */ + public function build(ExpressionInterface $expression, array &$params = []): string + { + return $this->expressionsConjunctionBuilder->build($expression->expressions, $params); + } +} diff --git a/src/QueryBuilder/Condition/Builder/ConjunctionConditionBuilder.php b/src/QueryBuilder/Condition/Builder/Conjunction/ExpressionsConjunctionBuilder.php similarity index 53% rename from src/QueryBuilder/Condition/Builder/ConjunctionConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/Conjunction/ExpressionsConjunctionBuilder.php index 2ef073a52..a406570a0 100644 --- a/src/QueryBuilder/Condition/Builder/ConjunctionConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/Conjunction/ExpressionsConjunctionBuilder.php @@ -2,15 +2,13 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Builder; +namespace Yiisoft\Db\QueryBuilder\Condition\Builder\Conjunction; use Yiisoft\Db\Exception\Exception; use InvalidArgumentException; use Yiisoft\Db\Exception\InvalidConfigException; use Yiisoft\Db\Exception\NotSupportedException; -use Yiisoft\Db\Expression\ExpressionBuilderInterface; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\QueryBuilder\Condition\AbstractConjunctionCondition; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; use function count; @@ -19,57 +17,57 @@ use function reset; /** - * Build an object of {@see AbstractConjunctionCondition} into SQL expressions. + * @internal * - * @implements ExpressionBuilderInterface + * Build an array of expressions' objects into SQL expressions. */ -class ConjunctionConditionBuilder implements ExpressionBuilderInterface +final class ExpressionsConjunctionBuilder { - public function __construct(private readonly QueryBuilderInterface $queryBuilder) - { + public function __construct( + private readonly string $operator, + private readonly QueryBuilderInterface $queryBuilder + ) { } /** - * Build SQL for {@see AbstractConjunctionCondition}. - * - * @param AbstractConjunctionCondition $expression + * @param array $expressions The expressions to be built. + * @param array $params The binding parameters. * * @throws Exception * @throws InvalidArgumentException * @throws InvalidConfigException * @throws NotSupportedException + * + * @psalm-param array $expressions */ - public function build(ExpressionInterface $expression, array &$params = []): string + public function build(array $expressions, array &$params = []): string { - /** @psalm-var string[] $parts */ - $parts = $this->buildExpressionsFrom($expression, $params); + $parts = $this->buildExpressions($expressions, $params); if (empty($parts)) { return ''; } if (count($parts) === 1) { - return reset($parts); + return (string) reset($parts); } - return '(' . implode(") {$expression->getOperator()} (", $parts) . ')'; + return '(' . implode(") $this->operator (", $parts) . ')'; } /** - * Builds expressions, that are stored in `$condition`. - * * @throws Exception * @throws InvalidArgumentException * @throws InvalidConfigException * @throws NotSupportedException + * + * @psalm-param array $expressions + * @psalm-return list */ - private function buildExpressionsFrom(AbstractConjunctionCondition $condition, array &$params = []): array + private function buildExpressions(array $expressions, array &$params = []): array { $parts = []; - /** @psalm-var array $expressions */ - $expressions = $condition->getExpressions(); - foreach ($expressions as $conditionValue) { if (is_array($conditionValue)) { $conditionValue = $this->queryBuilder->buildCondition($conditionValue, $params); diff --git a/src/QueryBuilder/Condition/Builder/Conjunction/OrConditionBuilder.php b/src/QueryBuilder/Condition/Builder/Conjunction/OrConditionBuilder.php new file mode 100644 index 000000000..034a97472 --- /dev/null +++ b/src/QueryBuilder/Condition/Builder/Conjunction/OrConditionBuilder.php @@ -0,0 +1,44 @@ + + */ +final class OrConditionBuilder implements ExpressionBuilderInterface +{ + private ExpressionsConjunctionBuilder $expressionsConjunctionBuilder; + + public function __construct( + QueryBuilderInterface $queryBuilder, + ) { + $this->expressionsConjunctionBuilder = new ExpressionsConjunctionBuilder('OR', $queryBuilder); + } + + /** + * Build SQL for {@see OrCondition}. + * + * @param OrCondition $expression + * + * @throws Exception + * @throws InvalidArgumentException + * @throws InvalidConfigException + * @throws NotSupportedException + */ + public function build(ExpressionInterface $expression, array &$params = []): string + { + return $this->expressionsConjunctionBuilder->build($expression->expressions, $params); + } +} + diff --git a/src/QueryBuilder/Condition/Builder/SimpleConditionBuilder.php b/src/QueryBuilder/Condition/Builder/SimpleConditionBuilder.php index 343a82363..5ba3ab0e5 100644 --- a/src/QueryBuilder/Condition/Builder/SimpleConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/SimpleConditionBuilder.php @@ -38,10 +38,9 @@ public function __construct(private readonly QueryBuilderInterface $queryBuilder */ public function build(ExpressionInterface $expression, array &$params = []): string { - $operator = $expression->getOperator(); - $column = $expression->getColumn(); - /** @psalm-var mixed $value */ - $value = $expression->getValue(); + $operator = $expression->operator; + $column = $expression->column; + $value = $expression->value; if ($column instanceof ExpressionInterface) { $column = $this->queryBuilder->buildExpression($column, $params); diff --git a/src/QueryBuilder/Condition/OrCondition.php b/src/QueryBuilder/Condition/OrCondition.php index 6cb829f57..20372666d 100644 --- a/src/QueryBuilder/Condition/OrCondition.php +++ b/src/QueryBuilder/Condition/OrCondition.php @@ -4,16 +4,27 @@ namespace Yiisoft\Db\QueryBuilder\Condition; +use Yiisoft\Db\Expression\ExpressionInterface; + /** * Condition that connects two or more SQL expressions with the `AND` operator. */ -final class OrCondition extends AbstractConjunctionCondition +final class OrCondition implements ConditionInterface { /** - * @return string The operator that's represented by this condition class, such as `AND`, `OR`. + * @param array $expressions The expressions that are connected by this condition. + * + * @psalm-param array $expressions */ - public function getOperator(): string + public function __construct( + public readonly array $expressions, + ) { + } + + + public static function fromArrayDefinition(string $operator, array $operands): self { - return 'OR'; + /** @psalm-var array $operands */ + return new self($operands); } } diff --git a/src/QueryBuilder/Condition/SimpleCondition.php b/src/QueryBuilder/Condition/SimpleCondition.php index 04a5cb1d6..c07821ca6 100644 --- a/src/QueryBuilder/Condition/SimpleCondition.php +++ b/src/QueryBuilder/Condition/SimpleCondition.php @@ -14,35 +14,16 @@ */ final class SimpleCondition implements ConditionInterface { - public function __construct( - private string|ExpressionInterface $column, - private string $operator, - private mixed $value - ) { - } - - /** - * @return ExpressionInterface|string The column name or an Expression. - */ - public function getColumn(): string|ExpressionInterface - { - return $this->column; - } - /** - * @return string The operator to use such as `>` or `<=`. + * @param string|ExpressionInterface $column The column name or an expression. + * @param string $operator The operator to use such as `>` or `<=`. + * @param mixed $value The value to the right of {@see $operator}. */ - public function getOperator(): string - { - return $this->operator; - } - - /** - * @return mixed The value to the right of {@see operator}. - */ - public function getValue(): mixed - { - return $this->value; + public function __construct( + public readonly string|ExpressionInterface $column, + public readonly string $operator, + public readonly mixed $value + ) { } /** diff --git a/tests/AbstractQueryBuilderTest.php b/tests/AbstractQueryBuilderTest.php index bf0904e66..5a7cfa37f 100644 --- a/tests/AbstractQueryBuilderTest.php +++ b/tests/AbstractQueryBuilderTest.php @@ -22,8 +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\ArrayOverlapsCondition; use Yiisoft\Db\QueryBuilder\Condition\JsonOverlapsCondition; +use Yiisoft\Db\QueryBuilder\Condition\OrCondition; use Yiisoft\Db\QueryBuilder\Condition\SimpleCondition; use Yiisoft\Db\Schema\Column\ColumnInterface; use Yiisoft\Db\Schema\QuoterInterface; @@ -33,6 +35,7 @@ use Yiisoft\Db\Tests\Support\TestTrait; use function PHPUnit\Framework\assertEmpty; +use function PHPUnit\Framework\assertInstanceOf; use function PHPUnit\Framework\assertSame; /** @@ -1566,52 +1569,41 @@ public function testBuildWithWhereExistsWithParameters(): void $this->assertSame([':some_value' => 'asd', ':merchant_id' => 6], $params); } - /** - * @throws InvalidArgumentException - */ public function testsCreateConditionFromArray(): void { - $db = $this->getConnection(); - - $qb = $db->getQueryBuilder(); + $qb = $this->getConnection()->getQueryBuilder(); $condition = $qb->createConditionFromArray(['and', 'a = 1', 'b = 2']); - - $this->assertSame('AND', $condition->getOperator()); - $this->assertSame(['a = 1', 'b = 2'], $condition->getExpressions()); + $this->assertInstanceOf(AndCondition::class, $condition); + $this->assertSame(['a = 1', 'b = 2'], $condition->expressions); $condition = $qb->createConditionFromArray(['or', 'a = 1', 'b = 2']); - - $this->assertSame('OR', $condition->getOperator()); - $this->assertSame(['a = 1', 'b = 2'], $condition->getExpressions()); + $this->assertInstanceOf(OrCondition::class, $condition); + $this->assertSame(['a = 1', 'b = 2'], $condition->expressions); $condition = $qb->createConditionFromArray(['and', 'a = 1', ['or', 'b = 2', 'c = 3']]); - - $this->assertSame('AND', $condition->getOperator()); - $this->assertSame(['a = 1', ['or', 'b = 2', 'c = 3']], $condition->getExpressions()); + $this->assertInstanceOf(AndCondition::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->assertSame('OR', $condition->getOperator()); - $this->assertSame(['a = 1', ['and', 'b = 2', 'c = 3']], $condition->getExpressions()); + $this->assertInstanceOf(OrCondition::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->assertSame('AND', $condition->getOperator()); - $this->assertSame(['a = 1', ['or', 'b = 2', ['and', 'c = 3', 'd = 4']]], $condition->getExpressions()); + $this->assertInstanceOf(AndCondition::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->assertSame('OR', $condition->getOperator()); - $this->assertSame(['a = 1', ['and', 'b = 2', ['or', 'c = 3', 'd = 4']]], $condition->getExpressions()); + $this->assertInstanceOf(OrCondition::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->assertSame('AND', $condition->getOperator()); + $this->assertInstanceOf(AndCondition::class, $condition); $this->assertSame( ['a = 1', ['or', 'b = 2', ['and', 'c = 3', ['or', 'd = 4', 'e = 5']]]], - $condition->getExpressions(), + $condition->expressions, ); } diff --git a/tests/Db/QueryBuilder/Condition/AndConditionTest.php b/tests/Db/QueryBuilder/Condition/AndConditionTest.php index 19b22d6bd..b4f825264 100644 --- a/tests/Db/QueryBuilder/Condition/AndConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/AndConditionTest.php @@ -18,13 +18,6 @@ public function testConstructor(): void { $andCondition = new AndCondition(['a' => 1, 'b' => 2]); - $this->assertSame(['a' => 1, 'b' => 2], $andCondition->getExpressions()); - } - - public function testGetOperator(): void - { - $andCondition = new AndCondition(['a' => 1, 'b' => 2]); - - $this->assertSame('AND', $andCondition->getOperator()); + $this->assertSame(['a' => 1, 'b' => 2], $andCondition->expressions); } } diff --git a/tests/Db/QueryBuilder/Condition/SimpleConditionTest.php b/tests/Db/QueryBuilder/Condition/SimpleConditionTest.php index 581c80632..fa5e5990e 100644 --- a/tests/Db/QueryBuilder/Condition/SimpleConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/SimpleConditionTest.php @@ -19,18 +19,18 @@ public function testConstructor(): void { $simpleCondition = new SimpleCondition('id', '=', 1); - $this->assertSame('id', $simpleCondition->getColumn()); - $this->assertSame('=', $simpleCondition->getOperator()); - $this->assertSame(1, $simpleCondition->getValue()); + $this->assertSame('id', $simpleCondition->column); + $this->assertSame('=', $simpleCondition->operator); + $this->assertSame(1, $simpleCondition->value); } public function testFromArrayDefinition(): void { $simpleCondition = SimpleCondition::fromArrayDefinition('=', ['id', 1]); - $this->assertSame('id', $simpleCondition->getColumn()); - $this->assertSame('=', $simpleCondition->getOperator()); - $this->assertSame(1, $simpleCondition->getValue()); + $this->assertSame('id', $simpleCondition->column); + $this->assertSame('=', $simpleCondition->operator); + $this->assertSame(1, $simpleCondition->value); } public function testFromArrayDefinitionColumnException(): void @@ -63,11 +63,11 @@ public function testNullSecondOperand(): void { $condition = SimpleCondition::fromArrayDefinition('=', ['id', null]); - $this->assertNull($condition->getValue()); + $this->assertNull($condition->value); $condition2 = new SimpleCondition('name', 'IS NOT', null); - $this->assertSame('IS NOT', $condition2->getOperator()); - $this->assertNull($condition2->getValue()); + $this->assertSame('IS NOT', $condition2->operator); + $this->assertNull($condition2->value); } } From b46a0b07270ea042c331b22cabb8a2ca4e10e048 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sun, 20 Jul 2025 16:42:51 +0300 Subject: [PATCH 02/14] overlaps --- docs/guide/en/query/where.md | 2 +- docs/guide/pt-BR/query/where.md | 2 +- src/QueryBuilder/AbstractDQLQueryBuilder.php | 12 +++---- .../AbstractOverlapsConditionBuilder.php | 32 ------------------- .../{ => Conjunction}/AndCondition.php | 3 +- .../Conjunction/AndConditionBuilder.php | 4 +-- .../ExpressionsConjunctionBuilder.php | 2 +- .../{ => Conjunction}/OrCondition.php | 3 +- .../Conjunction/OrConditionBuilder.php | 4 +-- .../AbstractOverlapsCondition.php | 28 ++++++---------- .../{ => Overlaps}/ArrayOverlapsCondition.php | 2 +- .../{ => Overlaps}/JsonOverlapsCondition.php | 2 +- tests/AbstractQueryBuilderTest.php | 16 +++++----- .../{ => Conjunction}/AndConditionTest.php | 4 +-- 14 files changed, 38 insertions(+), 78 deletions(-) delete mode 100644 src/QueryBuilder/Condition/Builder/AbstractOverlapsConditionBuilder.php rename src/QueryBuilder/Condition/{ => Conjunction}/AndCondition.php (86%) rename src/QueryBuilder/Condition/{Builder => }/Conjunction/AndConditionBuilder.php (90%) rename src/QueryBuilder/Condition/{Builder => }/Conjunction/ExpressionsConjunctionBuilder.php (97%) rename src/QueryBuilder/Condition/{ => Conjunction}/OrCondition.php (86%) rename src/QueryBuilder/Condition/{Builder => }/Conjunction/OrConditionBuilder.php (90%) rename src/QueryBuilder/Condition/{ => Overlaps}/AbstractOverlapsCondition.php (79%) rename src/QueryBuilder/Condition/{ => Overlaps}/ArrayOverlapsCondition.php (81%) rename src/QueryBuilder/Condition/{ => Overlaps}/JsonOverlapsCondition.php (81%) rename tests/Db/QueryBuilder/Condition/{ => Conjunction}/AndConditionTest.php (74%) diff --git a/docs/guide/en/query/where.md b/docs/guide/en/query/where.md index ddbc185ea..c49413b4d 100644 --- a/docs/guide/en/query/where.md +++ b/docs/guide/en/query/where.md @@ -277,7 +277,7 @@ so it's possible to combine formats in a single condition: ```php use Yiisoft\Db\QueryBuilder\Condition\InCondition; -use Yiisoft\Db\QueryBuilder\Condition\OrCondition; +use Yiisoft\Db\QueryBuilder\Condition\Conjunction\OrCondition; use Yiisoft\Db\Query\Query; /** @var Query $query */ diff --git a/docs/guide/pt-BR/query/where.md b/docs/guide/pt-BR/query/where.md index ca246d07f..736837eb3 100644 --- a/docs/guide/pt-BR/query/where.md +++ b/docs/guide/pt-BR/query/where.md @@ -252,7 +252,7 @@ então é possível combinar formatos em uma única condição: ```php use Yiisoft\Db\QueryBuilder\Condition\InCondition; -use Yiisoft\Db\QueryBuilder\Condition\OrCondition; +use Yiisoft\Db\QueryBuilder\Condition\Conjunction\OrCondition; use Yiisoft\Db\Query\Query; /** @var Query $query */ diff --git a/src/QueryBuilder/AbstractDQLQueryBuilder.php b/src/QueryBuilder/AbstractDQLQueryBuilder.php index cb9d6983a..38f42e3a3 100644 --- a/src/QueryBuilder/AbstractDQLQueryBuilder.php +++ b/src/QueryBuilder/AbstractDQLQueryBuilder.php @@ -504,8 +504,8 @@ protected function defaultConditionClasses(): array { return [ 'NOT' => Condition\NotCondition::class, - 'AND' => Condition\AndCondition::class, - 'OR' => Condition\OrCondition::class, + 'AND' => Condition\Conjunction\AndCondition::class, + 'OR' => Condition\Conjunction\OrCondition::class, 'BETWEEN' => Condition\BetweenCondition::class, 'NOT BETWEEN' => Condition\BetweenCondition::class, 'IN' => Condition\InCondition::class, @@ -516,8 +516,8 @@ protected function defaultConditionClasses(): array '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, + 'ARRAY OVERLAPS' => Condition\Overlaps\ArrayOverlapsCondition::class, + 'JSON OVERLAPS' => Condition\Overlaps\JsonOverlapsCondition::class, ]; } @@ -537,8 +537,8 @@ protected function defaultExpressionBuilders(): array Param::class => ParamBuilder::class, Expression::class => ExpressionBuilder::class, Condition\NotCondition::class => Condition\Builder\NotConditionBuilder::class, - Condition\AndCondition::class => Condition\Builder\Conjunction\AndConditionBuilder::class, - Condition\OrCondition::class => Condition\Builder\Conjunction\OrConditionBuilder::class, + Condition\Conjunction\AndCondition::class => Condition\Conjunction\AndConditionBuilder::class, + Condition\Conjunction\OrCondition::class => Condition\Conjunction\OrConditionBuilder::class, Condition\BetweenCondition::class => Condition\Builder\BetweenConditionBuilder::class, Condition\InCondition::class => Condition\Builder\InConditionBuilder::class, Condition\LikeCondition::class => Condition\Builder\LikeConditionBuilder::class, diff --git a/src/QueryBuilder/Condition/Builder/AbstractOverlapsConditionBuilder.php b/src/QueryBuilder/Condition/Builder/AbstractOverlapsConditionBuilder.php deleted file mode 100644 index 1f420f06b..000000000 --- a/src/QueryBuilder/Condition/Builder/AbstractOverlapsConditionBuilder.php +++ /dev/null @@ -1,32 +0,0 @@ - - */ -abstract class AbstractOverlapsConditionBuilder implements ExpressionBuilderInterface -{ - public function __construct(protected QueryBuilderInterface $queryBuilder) - { - } - - protected function prepareColumn(ExpressionInterface|string $column): string - { - if ($column instanceof ExpressionInterface) { - return $this->queryBuilder->buildExpression($column); - } - - return $this->queryBuilder->getQuoter()->quoteColumnName($column); - } -} diff --git a/src/QueryBuilder/Condition/AndCondition.php b/src/QueryBuilder/Condition/Conjunction/AndCondition.php similarity index 86% rename from src/QueryBuilder/Condition/AndCondition.php rename to src/QueryBuilder/Condition/Conjunction/AndCondition.php index 4a6ab6c02..a32101aeb 100644 --- a/src/QueryBuilder/Condition/AndCondition.php +++ b/src/QueryBuilder/Condition/Conjunction/AndCondition.php @@ -2,9 +2,10 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition; +namespace Yiisoft\Db\QueryBuilder\Condition\Conjunction; use Yiisoft\Db\Expression\ExpressionInterface; +use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; /** * Condition that connects two or more SQL expressions with the `AND` operator. diff --git a/src/QueryBuilder/Condition/Builder/Conjunction/AndConditionBuilder.php b/src/QueryBuilder/Condition/Conjunction/AndConditionBuilder.php similarity index 90% rename from src/QueryBuilder/Condition/Builder/Conjunction/AndConditionBuilder.php rename to src/QueryBuilder/Condition/Conjunction/AndConditionBuilder.php index b57e04c7a..2484c759d 100644 --- a/src/QueryBuilder/Condition/Builder/Conjunction/AndConditionBuilder.php +++ b/src/QueryBuilder/Condition/Conjunction/AndConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Builder\Conjunction; +namespace Yiisoft\Db\QueryBuilder\Condition\Conjunction; use InvalidArgumentException; use Yiisoft\Db\Exception\Exception; @@ -10,7 +10,7 @@ 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\Conjunction\AndCondition; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; /** diff --git a/src/QueryBuilder/Condition/Builder/Conjunction/ExpressionsConjunctionBuilder.php b/src/QueryBuilder/Condition/Conjunction/ExpressionsConjunctionBuilder.php similarity index 97% rename from src/QueryBuilder/Condition/Builder/Conjunction/ExpressionsConjunctionBuilder.php rename to src/QueryBuilder/Condition/Conjunction/ExpressionsConjunctionBuilder.php index a406570a0..d2247712d 100644 --- a/src/QueryBuilder/Condition/Builder/Conjunction/ExpressionsConjunctionBuilder.php +++ b/src/QueryBuilder/Condition/Conjunction/ExpressionsConjunctionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Builder\Conjunction; +namespace Yiisoft\Db\QueryBuilder\Condition\Conjunction; use Yiisoft\Db\Exception\Exception; use InvalidArgumentException; diff --git a/src/QueryBuilder/Condition/OrCondition.php b/src/QueryBuilder/Condition/Conjunction/OrCondition.php similarity index 86% rename from src/QueryBuilder/Condition/OrCondition.php rename to src/QueryBuilder/Condition/Conjunction/OrCondition.php index 20372666d..559e027fc 100644 --- a/src/QueryBuilder/Condition/OrCondition.php +++ b/src/QueryBuilder/Condition/Conjunction/OrCondition.php @@ -2,9 +2,10 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition; +namespace Yiisoft\Db\QueryBuilder\Condition\Conjunction; use Yiisoft\Db\Expression\ExpressionInterface; +use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; /** * Condition that connects two or more SQL expressions with the `AND` operator. diff --git a/src/QueryBuilder/Condition/Builder/Conjunction/OrConditionBuilder.php b/src/QueryBuilder/Condition/Conjunction/OrConditionBuilder.php similarity index 90% rename from src/QueryBuilder/Condition/Builder/Conjunction/OrConditionBuilder.php rename to src/QueryBuilder/Condition/Conjunction/OrConditionBuilder.php index 034a97472..4e09752c0 100644 --- a/src/QueryBuilder/Condition/Builder/Conjunction/OrConditionBuilder.php +++ b/src/QueryBuilder/Condition/Conjunction/OrConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Builder\Conjunction; +namespace Yiisoft\Db\QueryBuilder\Condition\Conjunction; use InvalidArgumentException; use Yiisoft\Db\Exception\Exception; @@ -10,7 +10,7 @@ use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Expression\ExpressionBuilderInterface; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\QueryBuilder\Condition\OrCondition; +use Yiisoft\Db\QueryBuilder\Condition\Conjunction\OrCondition; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; /** diff --git a/src/QueryBuilder/Condition/AbstractOverlapsCondition.php b/src/QueryBuilder/Condition/Overlaps/AbstractOverlapsCondition.php similarity index 79% rename from src/QueryBuilder/Condition/AbstractOverlapsCondition.php rename to src/QueryBuilder/Condition/Overlaps/AbstractOverlapsCondition.php index 7adc5c69f..13f341bd8 100644 --- a/src/QueryBuilder/Condition/AbstractOverlapsCondition.php +++ b/src/QueryBuilder/Condition/Overlaps/AbstractOverlapsCondition.php @@ -2,11 +2,13 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition; +namespace Yiisoft\Db\QueryBuilder\Condition\Overlaps; use InvalidArgumentException; use Yiisoft\Db\Expression\ExpressionInterface; +use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; + use function is_iterable; use function is_string; @@ -15,26 +17,14 @@ */ abstract class AbstractOverlapsCondition implements ConditionInterface { - public function __construct( - private string|ExpressionInterface $column, - private iterable|ExpressionInterface $values, - ) { - } - /** - * @return ExpressionInterface|string The column name or an Expression. + * @param string|ExpressionInterface $column The column name or an expression. + * @param iterable|ExpressionInterface $values An array of values that {@see $columns} value should overlap. */ - public function getColumn(): string|ExpressionInterface - { - return $this->column; - } - - /** - * @return ExpressionInterface|iterable An array of values that {@see columns} value should overlap. - */ - public function getValues(): iterable|ExpressionInterface - { - return $this->values; + public function __construct( + public readonly string|ExpressionInterface $column, + public readonly iterable|ExpressionInterface $values, + ) { } /** diff --git a/src/QueryBuilder/Condition/ArrayOverlapsCondition.php b/src/QueryBuilder/Condition/Overlaps/ArrayOverlapsCondition.php similarity index 81% rename from src/QueryBuilder/Condition/ArrayOverlapsCondition.php rename to src/QueryBuilder/Condition/Overlaps/ArrayOverlapsCondition.php index 7c215b578..aed13d210 100644 --- a/src/QueryBuilder/Condition/ArrayOverlapsCondition.php +++ b/src/QueryBuilder/Condition/Overlaps/ArrayOverlapsCondition.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition; +namespace Yiisoft\Db\QueryBuilder\Condition\Overlaps; /** * Condition that represents `ARRAY OVERLAPS` operator is used to check if a column of array type overlaps another array. diff --git a/src/QueryBuilder/Condition/JsonOverlapsCondition.php b/src/QueryBuilder/Condition/Overlaps/JsonOverlapsCondition.php similarity index 81% rename from src/QueryBuilder/Condition/JsonOverlapsCondition.php rename to src/QueryBuilder/Condition/Overlaps/JsonOverlapsCondition.php index de6a47403..2d3586e9c 100644 --- a/src/QueryBuilder/Condition/JsonOverlapsCondition.php +++ b/src/QueryBuilder/Condition/Overlaps/JsonOverlapsCondition.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition; +namespace Yiisoft\Db\QueryBuilder\Condition\Overlaps; /** * Condition that represents `JSON OVERLAPS` operator and is used to check if a column of JSON type overlaps an array. diff --git a/tests/AbstractQueryBuilderTest.php b/tests/AbstractQueryBuilderTest.php index 5a7cfa37f..4e588d89f 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\ArrayOverlapsCondition; -use Yiisoft\Db\QueryBuilder\Condition\JsonOverlapsCondition; -use Yiisoft\Db\QueryBuilder\Condition\OrCondition; +use Yiisoft\Db\QueryBuilder\Condition\Conjunction\AndCondition; +use Yiisoft\Db\QueryBuilder\Condition\Overlaps\ArrayOverlapsCondition; +use Yiisoft\Db\QueryBuilder\Condition\Overlaps\JsonOverlapsCondition; +use Yiisoft\Db\QueryBuilder\Condition\Conjunction\OrCondition; use Yiisoft\Db\QueryBuilder\Condition\SimpleCondition; use Yiisoft\Db\Schema\Column\ColumnInterface; use Yiisoft\Db\Schema\QuoterInterface; @@ -1615,14 +1615,14 @@ public function testCreateOverlapsConditionFromArray(): void $condition = $qb->createConditionFromArray(['array overlaps', 'column', [1, 2, 3]]); $this->assertInstanceOf(ArrayOverlapsCondition::class, $condition); - $this->assertSame('column', $condition->getColumn()); - $this->assertSame([1, 2, 3], $condition->getValues()); + $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->assertSame('column', $condition->getColumn()); - $this->assertSame([1, 2, 3], $condition->getValues()); + $this->assertSame('column', $condition->column); + $this->assertSame([1, 2, 3], $condition->values); } public function testCreateOverlapsConditionFromArrayWithInvalidOperandsCount(): void diff --git a/tests/Db/QueryBuilder/Condition/AndConditionTest.php b/tests/Db/QueryBuilder/Condition/Conjunction/AndConditionTest.php similarity index 74% rename from tests/Db/QueryBuilder/Condition/AndConditionTest.php rename to tests/Db/QueryBuilder/Condition/Conjunction/AndConditionTest.php index b4f825264..1d46e7da7 100644 --- a/tests/Db/QueryBuilder/Condition/AndConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/Conjunction/AndConditionTest.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Yiisoft\Db\Tests\Db\QueryBuilder\Condition; +namespace Yiisoft\Db\Tests\Db\QueryBuilder\Condition\Conjunction; use PHPUnit\Framework\TestCase; -use Yiisoft\Db\QueryBuilder\Condition\AndCondition; +use Yiisoft\Db\QueryBuilder\Condition\Conjunction\AndCondition; /** * @group db From 804ebf915f3116b6dbd3c09dcd52a69647ae2cdd Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sun, 20 Jul 2025 16:53:02 +0300 Subject: [PATCH 03/14] move --- src/QueryBuilder/AbstractDQLQueryBuilder.php | 16 ++++++++-------- .../BetweenColumnsConditionBuilder.php | 2 +- .../{Builder => }/BetweenConditionBuilder.php | 2 +- .../{Builder => }/ExistsConditionBuilder.php | 2 +- .../{Builder => }/HashConditionBuilder.php | 2 +- .../{Builder => }/InConditionBuilder.php | 2 +- .../{Builder => }/LikeConditionBuilder.php | 2 +- .../{Builder => }/NotConditionBuilder.php | 2 +- .../{Builder => }/SimpleConditionBuilder.php | 2 +- .../BetweenColumnsConditionBuilderTest.php | 2 +- .../Builder/LikeConditionBuilderTest.php | 2 +- 11 files changed, 18 insertions(+), 18 deletions(-) rename src/QueryBuilder/Condition/{Builder => }/BetweenColumnsConditionBuilder.php (98%) rename src/QueryBuilder/Condition/{Builder => }/BetweenConditionBuilder.php (97%) rename src/QueryBuilder/Condition/{Builder => }/ExistsConditionBuilder.php (95%) rename src/QueryBuilder/Condition/{Builder => }/HashConditionBuilder.php (97%) rename src/QueryBuilder/Condition/{Builder => }/InConditionBuilder.php (99%) rename src/QueryBuilder/Condition/{Builder => }/LikeConditionBuilder.php (98%) rename src/QueryBuilder/Condition/{Builder => }/NotConditionBuilder.php (96%) rename src/QueryBuilder/Condition/{Builder => }/SimpleConditionBuilder.php (97%) diff --git a/src/QueryBuilder/AbstractDQLQueryBuilder.php b/src/QueryBuilder/AbstractDQLQueryBuilder.php index 38f42e3a3..2cc864226 100644 --- a/src/QueryBuilder/AbstractDQLQueryBuilder.php +++ b/src/QueryBuilder/AbstractDQLQueryBuilder.php @@ -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\NotCondition::class => Condition\NotConditionBuilder::class, Condition\Conjunction\AndCondition::class => Condition\Conjunction\AndConditionBuilder::class, Condition\Conjunction\OrCondition::class => Condition\Conjunction\OrConditionBuilder::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\BetweenCondition::class => Yiisoft\Db\QueryBuilder\Condition\BetweenConditionBuilder::class, + Condition\InCondition::class => Yiisoft\Db\QueryBuilder\Condition\InConditionBuilder::class, + Condition\LikeCondition::class => Yiisoft\Db\QueryBuilder\Condition\LikeConditionBuilder::class, + Condition\ExistsCondition::class => Yiisoft\Db\QueryBuilder\Condition\ExistsConditionBuilder::class, + SimpleCondition::class => Condition\SimpleConditionBuilder::class, + HashCondition::class => Yiisoft\Db\QueryBuilder\Condition\HashConditionBuilder::class, + Condition\BetweenColumnsCondition::class => Yiisoft\Db\QueryBuilder\Condition\BetweenColumnsConditionBuilder::class, JsonExpression::class => JsonExpressionBuilder::class, ArrayExpression::class => ArrayExpressionBuilder::class, StructuredExpression::class => StructuredExpressionBuilder::class, diff --git a/src/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilder.php b/src/QueryBuilder/Condition/BetweenColumnsConditionBuilder.php similarity index 98% rename from src/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilder.php rename to src/QueryBuilder/Condition/BetweenColumnsConditionBuilder.php index 10f87d61a..bf03fb6ed 100644 --- a/src/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilder.php +++ b/src/QueryBuilder/Condition/BetweenColumnsConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Builder; +namespace Yiisoft\Db\QueryBuilder\Condition; use Yiisoft\Db\Exception\Exception; use InvalidArgumentException; diff --git a/src/QueryBuilder/Condition/Builder/BetweenConditionBuilder.php b/src/QueryBuilder/Condition/BetweenConditionBuilder.php similarity index 97% rename from src/QueryBuilder/Condition/Builder/BetweenConditionBuilder.php rename to src/QueryBuilder/Condition/BetweenConditionBuilder.php index 0815e3883..ef9b79ba5 100644 --- a/src/QueryBuilder/Condition/Builder/BetweenConditionBuilder.php +++ b/src/QueryBuilder/Condition/BetweenConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Builder; +namespace Yiisoft\Db\QueryBuilder\Condition; use Yiisoft\Db\Exception\Exception; use InvalidArgumentException; diff --git a/src/QueryBuilder/Condition/Builder/ExistsConditionBuilder.php b/src/QueryBuilder/Condition/ExistsConditionBuilder.php similarity index 95% rename from src/QueryBuilder/Condition/Builder/ExistsConditionBuilder.php rename to src/QueryBuilder/Condition/ExistsConditionBuilder.php index ca1a55da5..2fd3509a1 100644 --- a/src/QueryBuilder/Condition/Builder/ExistsConditionBuilder.php +++ b/src/QueryBuilder/Condition/ExistsConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Builder; +namespace Yiisoft\Db\QueryBuilder\Condition; use Yiisoft\Db\Exception\Exception; use InvalidArgumentException; diff --git a/src/QueryBuilder/Condition/Builder/HashConditionBuilder.php b/src/QueryBuilder/Condition/HashConditionBuilder.php similarity index 97% rename from src/QueryBuilder/Condition/Builder/HashConditionBuilder.php rename to src/QueryBuilder/Condition/HashConditionBuilder.php index 871edcff2..70647dd9d 100644 --- a/src/QueryBuilder/Condition/Builder/HashConditionBuilder.php +++ b/src/QueryBuilder/Condition/HashConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Builder; +namespace Yiisoft\Db\QueryBuilder\Condition; use Yiisoft\Db\Exception\Exception; use InvalidArgumentException; diff --git a/src/QueryBuilder/Condition/Builder/InConditionBuilder.php b/src/QueryBuilder/Condition/InConditionBuilder.php similarity index 99% rename from src/QueryBuilder/Condition/Builder/InConditionBuilder.php rename to src/QueryBuilder/Condition/InConditionBuilder.php index ac73d45c9..df32a7e65 100644 --- a/src/QueryBuilder/Condition/Builder/InConditionBuilder.php +++ b/src/QueryBuilder/Condition/InConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Builder; +namespace Yiisoft\Db\QueryBuilder\Condition; use ArrayAccess; use Iterator; diff --git a/src/QueryBuilder/Condition/Builder/LikeConditionBuilder.php b/src/QueryBuilder/Condition/LikeConditionBuilder.php similarity index 98% rename from src/QueryBuilder/Condition/Builder/LikeConditionBuilder.php rename to src/QueryBuilder/Condition/LikeConditionBuilder.php index 5d4d1efcd..0ef427988 100644 --- a/src/QueryBuilder/Condition/Builder/LikeConditionBuilder.php +++ b/src/QueryBuilder/Condition/LikeConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Builder; +namespace Yiisoft\Db\QueryBuilder\Condition; use Yiisoft\Db\Command\Param; use Yiisoft\Db\Constant\DataType; diff --git a/src/QueryBuilder/Condition/Builder/NotConditionBuilder.php b/src/QueryBuilder/Condition/NotConditionBuilder.php similarity index 96% rename from src/QueryBuilder/Condition/Builder/NotConditionBuilder.php rename to src/QueryBuilder/Condition/NotConditionBuilder.php index 882f254eb..cf7c0f636 100644 --- a/src/QueryBuilder/Condition/Builder/NotConditionBuilder.php +++ b/src/QueryBuilder/Condition/NotConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Builder; +namespace Yiisoft\Db\QueryBuilder\Condition; use Yiisoft\Db\Exception\Exception; use InvalidArgumentException; diff --git a/src/QueryBuilder/Condition/Builder/SimpleConditionBuilder.php b/src/QueryBuilder/Condition/SimpleConditionBuilder.php similarity index 97% rename from src/QueryBuilder/Condition/Builder/SimpleConditionBuilder.php rename to src/QueryBuilder/Condition/SimpleConditionBuilder.php index 5ba3ab0e5..2cdb95f9c 100644 --- a/src/QueryBuilder/Condition/Builder/SimpleConditionBuilder.php +++ b/src/QueryBuilder/Condition/SimpleConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Builder; +namespace Yiisoft\Db\QueryBuilder\Condition; use Yiisoft\Db\Exception\Exception; use InvalidArgumentException; diff --git a/tests/Db/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilderTest.php b/tests/Db/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilderTest.php index 43e687975..a96896512 100644 --- a/tests/Db/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilderTest.php +++ b/tests/Db/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilderTest.php @@ -6,7 +6,7 @@ use PHPUnit\Framework\TestCase; use Yiisoft\Db\QueryBuilder\Condition\BetweenColumnsCondition; -use Yiisoft\Db\QueryBuilder\Condition\Builder\BetweenColumnsConditionBuilder; +use Yiisoft\Db\QueryBuilder\Condition\BetweenColumnsConditionBuilder; use Yiisoft\Db\Tests\Support\TestTrait; /** diff --git a/tests/Db/QueryBuilder/Condition/Builder/LikeConditionBuilderTest.php b/tests/Db/QueryBuilder/Condition/Builder/LikeConditionBuilderTest.php index 0105c3349..d3345628b 100644 --- a/tests/Db/QueryBuilder/Condition/Builder/LikeConditionBuilderTest.php +++ b/tests/Db/QueryBuilder/Condition/Builder/LikeConditionBuilderTest.php @@ -6,7 +6,7 @@ use PHPUnit\Framework\TestCase; use InvalidArgumentException; -use Yiisoft\Db\QueryBuilder\Condition\Builder\LikeConditionBuilder; +use Yiisoft\Db\QueryBuilder\Condition\LikeConditionBuilder; use Yiisoft\Db\QueryBuilder\Condition\LikeCondition; use Yiisoft\Db\Tests\Support\TestTrait; From ca66c23799a56aa118ddc22b1b69e1001512fdd7 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sun, 20 Jul 2025 16:57:20 +0300 Subject: [PATCH 04/14] between columns --- src/QueryBuilder/AbstractDQLQueryBuilder.php | 12 ++--- .../Condition/BetweenColumnsCondition.php | 46 ++++--------------- .../BetweenColumnsConditionBuilder.php | 8 ++-- .../Condition/BetweenColumnsConditionTest.php | 16 +++---- 4 files changed, 28 insertions(+), 54 deletions(-) diff --git a/src/QueryBuilder/AbstractDQLQueryBuilder.php b/src/QueryBuilder/AbstractDQLQueryBuilder.php index 2cc864226..0634ebae5 100644 --- a/src/QueryBuilder/AbstractDQLQueryBuilder.php +++ b/src/QueryBuilder/AbstractDQLQueryBuilder.php @@ -539,13 +539,13 @@ protected function defaultExpressionBuilders(): array Condition\NotCondition::class => Condition\NotConditionBuilder::class, Condition\Conjunction\AndCondition::class => Condition\Conjunction\AndConditionBuilder::class, Condition\Conjunction\OrCondition::class => Condition\Conjunction\OrConditionBuilder::class, - Condition\BetweenCondition::class => Yiisoft\Db\QueryBuilder\Condition\BetweenConditionBuilder::class, - Condition\InCondition::class => Yiisoft\Db\QueryBuilder\Condition\InConditionBuilder::class, - Condition\LikeCondition::class => Yiisoft\Db\QueryBuilder\Condition\LikeConditionBuilder::class, - Condition\ExistsCondition::class => Yiisoft\Db\QueryBuilder\Condition\ExistsConditionBuilder::class, + Condition\BetweenCondition::class => Condition\BetweenConditionBuilder::class, + Condition\InCondition::class => Condition\InConditionBuilder::class, + Condition\LikeCondition::class => Condition\LikeConditionBuilder::class, + Condition\ExistsCondition::class => Condition\ExistsConditionBuilder::class, SimpleCondition::class => Condition\SimpleConditionBuilder::class, - HashCondition::class => Yiisoft\Db\QueryBuilder\Condition\HashConditionBuilder::class, - Condition\BetweenColumnsCondition::class => Yiisoft\Db\QueryBuilder\Condition\BetweenColumnsConditionBuilder::class, + HashCondition::class => Condition\HashConditionBuilder::class, + Condition\BetweenColumnsCondition::class => Condition\BetweenColumnsConditionBuilder::class, JsonExpression::class => JsonExpressionBuilder::class, ArrayExpression::class => ArrayExpressionBuilder::class, StructuredExpression::class => StructuredExpressionBuilder::class, diff --git a/src/QueryBuilder/Condition/BetweenColumnsCondition.php b/src/QueryBuilder/Condition/BetweenColumnsCondition.php index 25cbeded1..3bd0b80df 100644 --- a/src/QueryBuilder/Condition/BetweenColumnsCondition.php +++ b/src/QueryBuilder/Condition/BetweenColumnsCondition.php @@ -39,44 +39,18 @@ */ final class BetweenColumnsCondition implements ConditionInterface { - public function __construct( - private array|int|string|Iterator|ExpressionInterface $value, - private string $operator, - private string|ExpressionInterface $intervalStartColumn, - private string|ExpressionInterface $intervalEndColumn - ) { - } - - /** - * @return ExpressionInterface|string The column name or expression that's the end of the interval. - */ - public function getIntervalEndColumn(): string|ExpressionInterface - { - return $this->intervalEndColumn; - } - - /** - * @return ExpressionInterface|string The column name or expression that's the beginning of the interval. - */ - public function getIntervalStartColumn(): string|ExpressionInterface - { - return $this->intervalStartColumn; - } - /** - * @return string The operator to use (for example `BETWEEN` or `NOT BETWEEN`). + * @param array|int|string|Iterator|ExpressionInterface $value The value to compare against. + * @param string $operator The operator to use (for example `BETWEEN` or `NOT BETWEEN`). + * @param string|ExpressionInterface $intervalStartColumn The column name or expression that's the beginning of the interval. + * @param string|ExpressionInterface $intervalEndColumn The column name or expression that's the end of the interval. */ - public function getOperator(): string - { - return $this->operator; - } - - /** - * @return array|ExpressionInterface|int|Iterator|string The value to compare against. - */ - public function getValue(): array|int|string|Iterator|ExpressionInterface - { - return $this->value; + public function __construct( + public readonly array|int|string|Iterator|ExpressionInterface $value, + public readonly string $operator, + public readonly string|ExpressionInterface $intervalStartColumn, + public readonly string|ExpressionInterface $intervalEndColumn, + ) { } /** diff --git a/src/QueryBuilder/Condition/BetweenColumnsConditionBuilder.php b/src/QueryBuilder/Condition/BetweenColumnsConditionBuilder.php index bf03fb6ed..31acee9ac 100644 --- a/src/QueryBuilder/Condition/BetweenColumnsConditionBuilder.php +++ b/src/QueryBuilder/Condition/BetweenColumnsConditionBuilder.php @@ -39,10 +39,10 @@ public function __construct(private readonly QueryBuilderInterface $queryBuilder */ public function build(ExpressionInterface $expression, array &$params = []): string { - $operator = $expression->getOperator(); - $startColumn = $this->escapeColumnName($expression->getIntervalStartColumn(), $params); - $endColumn = $this->escapeColumnName($expression->getIntervalEndColumn(), $params); - $value = $this->createPlaceholder($expression->getValue(), $params); + $operator = $expression->operator; + $startColumn = $this->escapeColumnName($expression->intervalStartColumn, $params); + $endColumn = $this->escapeColumnName($expression->intervalEndColumn, $params); + $value = $this->createPlaceholder($expression->value, $params); return "$value $operator $startColumn AND $endColumn"; } diff --git a/tests/Db/QueryBuilder/Condition/BetweenColumnsConditionTest.php b/tests/Db/QueryBuilder/Condition/BetweenColumnsConditionTest.php index f55734d61..51972321b 100644 --- a/tests/Db/QueryBuilder/Condition/BetweenColumnsConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/BetweenColumnsConditionTest.php @@ -19,10 +19,10 @@ public function testConstructor(): void { $betweenColumnsCondition = new BetweenColumnsCondition(42, 'BETWEEN', 'min_value', 'max_value'); - $this->assertSame(42, $betweenColumnsCondition->getValue()); - $this->assertSame('BETWEEN', $betweenColumnsCondition->getOperator()); - $this->assertSame('min_value', $betweenColumnsCondition->getIntervalStartColumn()); - $this->assertSame('max_value', $betweenColumnsCondition->getIntervalEndColumn()); + $this->assertSame(42, $betweenColumnsCondition->value); + $this->assertSame('BETWEEN', $betweenColumnsCondition->operator); + $this->assertSame('min_value', $betweenColumnsCondition->intervalStartColumn); + $this->assertSame('max_value', $betweenColumnsCondition->intervalEndColumn); } public function testFromArrayDefinition(): void @@ -32,10 +32,10 @@ public function testFromArrayDefinition(): void [42, 'min_value', 'max_value'] ); - $this->assertSame(42, $betweenColumnsCondition->getValue()); - $this->assertSame('BETWEEN', $betweenColumnsCondition->getOperator()); - $this->assertSame('min_value', $betweenColumnsCondition->getIntervalStartColumn()); - $this->assertSame('max_value', $betweenColumnsCondition->getIntervalEndColumn()); + $this->assertSame(42, $betweenColumnsCondition->value); + $this->assertSame('BETWEEN', $betweenColumnsCondition->operator); + $this->assertSame('min_value', $betweenColumnsCondition->intervalStartColumn); + $this->assertSame('max_value', $betweenColumnsCondition->intervalEndColumn); } public function testFromArrayDefinitionExceptionWithoutOperands(): void From 6873e33384df43748bc462cce7738afac3c95e89 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sun, 20 Jul 2025 17:00:16 +0300 Subject: [PATCH 05/14] between --- .../Condition/BetweenCondition.php | 46 ++++--------------- .../Condition/BetweenConditionBuilder.php | 12 +++-- .../Condition/BetweenConditionTest.php | 16 +++---- 3 files changed, 25 insertions(+), 49 deletions(-) diff --git a/src/QueryBuilder/Condition/BetweenCondition.php b/src/QueryBuilder/Condition/BetweenCondition.php index d752fd09d..2f9aa7280 100644 --- a/src/QueryBuilder/Condition/BetweenCondition.php +++ b/src/QueryBuilder/Condition/BetweenCondition.php @@ -12,44 +12,18 @@ */ final class BetweenCondition implements ConditionInterface { - public function __construct( - private string|ExpressionInterface $column, - private string $operator, - private mixed $intervalStart, - private mixed $intervalEnd - ) { - } - - /** - * @return ExpressionInterface|string The column name. - */ - public function getColumn(): string|ExpressionInterface - { - return $this->column; - } - - /** - * @return mixed End of the interval. - */ - public function getIntervalEnd(): mixed - { - return $this->intervalEnd; - } - /** - * @return mixed Beginning of the interval. + * @param string|ExpressionInterface $column The column name. + * @param string $operator The operator to use (for example `BETWEEN` or `NOT BETWEEN`). + * @param mixed $intervalStart Beginning of the interval. + * @param mixed $intervalEnd End of the interval. */ - public function getIntervalStart(): mixed - { - return $this->intervalStart; - } - - /** - * @return string The operator to use (for example `BETWEEN` or `NOT BETWEEN`). - */ - public function getOperator(): string - { - return $this->operator; + public function __construct( + public readonly string|ExpressionInterface $column, + public readonly string $operator, + public readonly mixed $intervalStart, + public readonly mixed $intervalEnd + ) { } /** diff --git a/src/QueryBuilder/Condition/BetweenConditionBuilder.php b/src/QueryBuilder/Condition/BetweenConditionBuilder.php index ef9b79ba5..964fabbbf 100644 --- a/src/QueryBuilder/Condition/BetweenConditionBuilder.php +++ b/src/QueryBuilder/Condition/BetweenConditionBuilder.php @@ -38,16 +38,18 @@ public function __construct(private readonly QueryBuilderInterface $queryBuilder */ public function build(ExpressionInterface $expression, array &$params = []): string { - $operator = $expression->getOperator(); - $column = $expression->getColumn(); - $column = $column instanceof ExpressionInterface ? $this->queryBuilder->buildExpression($column) : $column; + $operator = $expression->operator; + $column = $expression->column; + $column = $column instanceof ExpressionInterface + ? $this->queryBuilder->buildExpression($column) + : $column; if (!str_contains($column, '(')) { $column = $this->queryBuilder->getQuoter()->quoteColumnName($column); } - $phName1 = $this->createPlaceholder($expression->getIntervalStart(), $params); - $phName2 = $this->createPlaceholder($expression->getIntervalEnd(), $params); + $phName1 = $this->createPlaceholder($expression->intervalStart, $params); + $phName2 = $this->createPlaceholder($expression->intervalEnd, $params); return "$column $operator $phName1 AND $phName2"; } diff --git a/tests/Db/QueryBuilder/Condition/BetweenConditionTest.php b/tests/Db/QueryBuilder/Condition/BetweenConditionTest.php index 65b011590..8e62c01c7 100644 --- a/tests/Db/QueryBuilder/Condition/BetweenConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/BetweenConditionTest.php @@ -19,20 +19,20 @@ public function testConstructor(): void { $betweenCondition = new BetweenCondition('date', 'BETWEEN', 1, 2); - $this->assertSame('date', $betweenCondition->getColumn()); - $this->assertSame('BETWEEN', $betweenCondition->getOperator()); - $this->assertSame(1, $betweenCondition->getIntervalStart()); - $this->assertSame(2, $betweenCondition->getIntervalEnd()); + $this->assertSame('date', $betweenCondition->column); + $this->assertSame('BETWEEN', $betweenCondition->operator); + $this->assertSame(1, $betweenCondition->intervalStart); + $this->assertSame(2, $betweenCondition->intervalEnd); } public function testFromArrayDefinition(): void { $betweenCondition = BetweenCondition::fromArrayDefinition('BETWEEN', ['date', 1, 2]); - $this->assertSame('date', $betweenCondition->getColumn()); - $this->assertSame('BETWEEN', $betweenCondition->getOperator()); - $this->assertSame(1, $betweenCondition->getIntervalStart()); - $this->assertSame(2, $betweenCondition->getIntervalEnd()); + $this->assertSame('date', $betweenCondition->column); + $this->assertSame('BETWEEN', $betweenCondition->operator); + $this->assertSame(1, $betweenCondition->intervalStart); + $this->assertSame(2, $betweenCondition->intervalEnd); } public function testFromArrayDefinitionExceptionWithoutOperands(): void From 8298f1285d74c45f445433ea8cb7d5fca6f0c4a8 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sun, 20 Jul 2025 17:03:17 +0300 Subject: [PATCH 06/14] exists --- .../Condition/ExistsCondition.php | 22 +++++-------------- .../Condition/ExistsConditionBuilder.php | 7 +++--- .../Condition/ExistsConditionTest.php | 8 +++---- 3 files changed, 13 insertions(+), 24 deletions(-) diff --git a/src/QueryBuilder/Condition/ExistsCondition.php b/src/QueryBuilder/Condition/ExistsCondition.php index 3554d34fc..e415f3c73 100644 --- a/src/QueryBuilder/Condition/ExistsCondition.php +++ b/src/QueryBuilder/Condition/ExistsCondition.php @@ -12,24 +12,14 @@ */ final class ExistsCondition implements ConditionInterface { - public function __construct(private string $operator, private QueryInterface $query) - { - } - /** - * @return string The operator to use (for example, `EXISTS` or `NOT EXISTS`). + * @param string $operator The operator to use (for example, `EXISTS` or `NOT EXISTS`). + * @param QueryInterface $query The {@see QueryInterfacee} implementation representing the sub-query. */ - public function getOperator(): string - { - return $this->operator; - } - - /** - * @return QueryInterface The {@see Query} object representing the sub-query. - */ - public function getQuery(): QueryInterface - { - return $this->query; + public function __construct( + public readonly string $operator, + public readonly QueryInterface $query, + ) { } /** diff --git a/src/QueryBuilder/Condition/ExistsConditionBuilder.php b/src/QueryBuilder/Condition/ExistsConditionBuilder.php index 2fd3509a1..78dc951d5 100644 --- a/src/QueryBuilder/Condition/ExistsConditionBuilder.php +++ b/src/QueryBuilder/Condition/ExistsConditionBuilder.php @@ -36,9 +36,8 @@ public function __construct(private readonly QueryBuilderInterface $queryBuilder */ public function build(ExpressionInterface $expression, array &$params = []): string { - $operator = $expression->getOperator(); - $query = $expression->getQuery(); - $sql = $this->queryBuilder->buildExpression($query, $params); - return "$operator $sql"; + return $expression->operator + . ' ' + . $this->queryBuilder->buildExpression($expression->query, $params); } } diff --git a/tests/Db/QueryBuilder/Condition/ExistsConditionTest.php b/tests/Db/QueryBuilder/Condition/ExistsConditionTest.php index cafc3f91b..6087c0c92 100644 --- a/tests/Db/QueryBuilder/Condition/ExistsConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/ExistsConditionTest.php @@ -25,8 +25,8 @@ public function testConstructor(): void ->where(['active' => 1]); $existCondition = new ExistsCondition('EXISTS', $query); - $this->assertSame('EXISTS', $existCondition->getOperator()); - $this->assertSame($query, $existCondition->getQuery()); + $this->assertSame('EXISTS', $existCondition->operator); + $this->assertSame($query, $existCondition->query); } public function testFromArrayDefinition(): void @@ -37,8 +37,8 @@ public function testFromArrayDefinition(): void ->where(['active' => 1]); $existCondition = ExistsCondition::fromArrayDefinition('EXISTS', [$query]); - $this->assertSame('EXISTS', $existCondition->getOperator()); - $this->assertSame($query, $existCondition->getQuery()); + $this->assertSame('EXISTS', $existCondition->operator); + $this->assertSame($query, $existCondition->query); } public function testFromArrayDefinitionExceptionQuery(): void From 8e39f85450d44604329102dd71d3ffc5c8b01c5c Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sun, 20 Jul 2025 17:09:48 +0300 Subject: [PATCH 07/14] hash, in, like --- src/QueryBuilder/Condition/HashCondition.php | 12 ++--- .../Condition/HashConditionBuilder.php | 2 +- src/QueryBuilder/Condition/InCondition.php | 38 ++++----------- .../Condition/InConditionBuilder.php | 8 ++-- src/QueryBuilder/Condition/LikeCondition.php | 47 +++++-------------- .../Condition/LikeConditionBuilder.php | 6 +-- .../Condition/HashConditionTest.php | 4 +- .../Condition/InConditionTest.php | 12 ++--- .../Condition/LikeConditionTest.php | 29 ++++++------ 9 files changed, 55 insertions(+), 103 deletions(-) diff --git a/src/QueryBuilder/Condition/HashCondition.php b/src/QueryBuilder/Condition/HashCondition.php index a6c56999f..9b63a936e 100644 --- a/src/QueryBuilder/Condition/HashCondition.php +++ b/src/QueryBuilder/Condition/HashCondition.php @@ -9,16 +9,12 @@ */ final class HashCondition implements ConditionInterface { - public function __construct(private array|null $hash = []) - { - } - /** - * @return array|null The condition specification. + * @param array|null $hash The condition specification. */ - public function getHash(): array|null - { - return $this->hash; + public function __construct( + public readonly array|null $hash = [], + ) { } /** diff --git a/src/QueryBuilder/Condition/HashConditionBuilder.php b/src/QueryBuilder/Condition/HashConditionBuilder.php index 70647dd9d..0b36c59f8 100644 --- a/src/QueryBuilder/Condition/HashConditionBuilder.php +++ b/src/QueryBuilder/Condition/HashConditionBuilder.php @@ -42,7 +42,7 @@ public function __construct(private readonly QueryBuilderInterface $queryBuilder */ public function build(ExpressionInterface $expression, array &$params = []): string { - $hash = $expression->getHash() ?? []; + $hash = $expression->hash ?? []; $parts = []; /** diff --git a/src/QueryBuilder/Condition/InCondition.php b/src/QueryBuilder/Condition/InCondition.php index cc50f9759..54d180859 100644 --- a/src/QueryBuilder/Condition/InCondition.php +++ b/src/QueryBuilder/Condition/InCondition.php @@ -14,39 +14,19 @@ */ final class InCondition implements ConditionInterface { - public function __construct( - private array|string|Iterator|ExpressionInterface $column, - private string $operator, - private int|iterable|Iterator|QueryInterface $values - ) { - } - /** - * @return array|ExpressionInterface|Iterator|string The column name. If it's an array, a composite `IN` condition + * @param array|string|Iterator|ExpressionInterface $column The column name. If it's an array, a composite `IN` condition * will be generated. - */ - public function getColumn(): array|string|ExpressionInterface|Iterator - { - return $this->column; - } - - /** - * @return string The operator to use (for example, `IN` or `NOT IN`). - */ - public function getOperator(): string - { - return $this->operator; - } - - /** - * @return int|iterable|Iterator|QueryInterface An array of values that {@see columns} value should be among. - * - * If it's an empty array, the generated expression will be a `false` value if {@see operator} is `IN` and empty if + * @param string $operator The operator to use (for example, `IN` or `NOT IN`). + * @param int|iterable|Iterator|QueryInterface $values An array of values that {@see $columns} value should be among. + * If it's an empty array, the generated expression will be a `false` value if {@see $operator} is `IN` and empty if * operator is `NOT IN`. */ - public function getValues(): int|iterable|Iterator|QueryInterface - { - return $this->values; + public function __construct( + public readonly array|string|Iterator|ExpressionInterface $column, + public readonly string $operator, + public readonly int|iterable|Iterator|QueryInterface $values + ) { } /** diff --git a/src/QueryBuilder/Condition/InConditionBuilder.php b/src/QueryBuilder/Condition/InConditionBuilder.php index df32a7e65..162721701 100644 --- a/src/QueryBuilder/Condition/InConditionBuilder.php +++ b/src/QueryBuilder/Condition/InConditionBuilder.php @@ -53,9 +53,9 @@ public function __construct(protected QueryBuilderInterface $queryBuilder) */ public function build(ExpressionInterface $expression, array &$params = []): string { - $column = $expression->getColumn(); - $operator = strtoupper($expression->getOperator()); - $values = $expression->getValues(); + $column = $expression->column; + $operator = strtoupper($expression->operator); + $values = $expression->values; if ($column === []) { /** no columns to test against */ @@ -146,7 +146,7 @@ public function build(ExpressionInterface $expression, array &$params = []): str protected function buildValues(InCondition $condition, iterable $values, array &$params = []): array { $sqlValues = []; - $column = $condition->getColumn(); + $column = $condition->column; if (is_array($column)) { /** @psalm-var mixed $column */ diff --git a/src/QueryBuilder/Condition/LikeCondition.php b/src/QueryBuilder/Condition/LikeCondition.php index e9c5ea393..09ef832a9 100644 --- a/src/QueryBuilder/Condition/LikeCondition.php +++ b/src/QueryBuilder/Condition/LikeCondition.php @@ -20,20 +20,19 @@ final class LikeCondition implements ConditionInterface { protected array|null $escapingReplacements = []; - public function __construct( - private readonly string|ExpressionInterface $column, - private readonly string $operator, - private readonly array|int|string|Iterator|ExpressionInterface|null $value, - private readonly ?bool $caseSensitive = null, - ) { - } - /** - * @return ExpressionInterface|string The column name. + * @param string|ExpressionInterface $column The column name. + * @param string $operator The operator to use such as `>` or `<=`. + * @param array|int|string|Iterator|ExpressionInterface|null $value The value to the right of {@see operator}. + * @param bool|null $caseSensitive Whether the comparison is case-sensitive. `null` means using the default + * behavior. */ - public function getColumn(): string|ExpressionInterface - { - return $this->column; + public function __construct( + public readonly string|ExpressionInterface $column, + public readonly string $operator, + public readonly array|int|string|Iterator|ExpressionInterface|null $value, + public readonly ?bool $caseSensitive = null, + ) { } /** @@ -44,30 +43,6 @@ public function getEscapingReplacements(): ?array return $this->escapingReplacements; } - /** - * @return string The operator to use such as `>` or `<=`. - */ - public function getOperator(): string - { - return $this->operator; - } - - /** - * @return array|ExpressionInterface|int|Iterator|string|null The value to the right of {@see operator}. - */ - public function getValue(): array|int|string|Iterator|ExpressionInterface|null - { - return $this->value; - } - - /** - * @return bool|null Whether the comparison is case-sensitive. `null` means using the default behavior. - */ - public function getCaseSensitive(): ?bool - { - return $this->caseSensitive; - } - /** * This method allows specifying how to escape special characters in the value(s). * diff --git a/src/QueryBuilder/Condition/LikeConditionBuilder.php b/src/QueryBuilder/Condition/LikeConditionBuilder.php index 0ef427988..82d47122b 100644 --- a/src/QueryBuilder/Condition/LikeConditionBuilder.php +++ b/src/QueryBuilder/Condition/LikeConditionBuilder.php @@ -57,7 +57,7 @@ public function __construct( */ public function build(ExpressionInterface $expression, array &$params = []): string { - $values = $expression->getValue(); + $values = $expression->value; $escape = $expression->getEscapingReplacements(); if ($escape === []) { @@ -97,7 +97,7 @@ public function build(ExpressionInterface $expression, array &$params = []): str */ protected function prepareColumn(LikeCondition $expression, array &$params): string { - $column = $expression->getColumn(); + $column = $expression->column; if ($column instanceof ExpressionInterface) { return $this->queryBuilder->buildExpression($column, $params); @@ -143,7 +143,7 @@ protected function preparePlaceholderName( */ protected function parseOperator(LikeCondition $expression): array { - $operator = strtoupper($expression->getOperator()); + $operator = strtoupper($expression->operator); if (!preg_match('/^(AND |OR |)((NOT |)I?LIKE)/', $operator, $matches)) { throw new InvalidArgumentException("Invalid operator in like condition: \"$operator\""); } diff --git a/tests/Db/QueryBuilder/Condition/HashConditionTest.php b/tests/Db/QueryBuilder/Condition/HashConditionTest.php index 5a8936f66..0c2a6447a 100644 --- a/tests/Db/QueryBuilder/Condition/HashConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/HashConditionTest.php @@ -18,13 +18,13 @@ public function testConstructor(): void { $hashCondition = new HashCondition(['expired' => false, 'active' => true]); - $this->assertSame(['expired' => false, 'active' => true], $hashCondition->getHash()); + $this->assertSame(['expired' => false, 'active' => true], $hashCondition->hash); } public function testFromArrayDefinition(): void { $hashCondition = HashCondition::fromArrayDefinition('AND', ['expired' => false, 'active' => true]); - $this->assertSame(['expired' => false, 'active' => true], $hashCondition->getHash()); + $this->assertSame(['expired' => false, 'active' => true], $hashCondition->hash); } } diff --git a/tests/Db/QueryBuilder/Condition/InConditionTest.php b/tests/Db/QueryBuilder/Condition/InConditionTest.php index 9f6dcb423..8e2c9541a 100644 --- a/tests/Db/QueryBuilder/Condition/InConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/InConditionTest.php @@ -19,18 +19,18 @@ public function testConstructor(): void { $inCondition = new InCondition('id', 'IN', [1, 2, 3]); - $this->assertSame('id', $inCondition->getColumn()); - $this->assertSame('IN', $inCondition->getOperator()); - $this->assertSame([1, 2, 3], $inCondition->getValues()); + $this->assertSame('id', $inCondition->column); + $this->assertSame('IN', $inCondition->operator); + $this->assertSame([1, 2, 3], $inCondition->values); } public function testFromArrayDefinition(): void { $inCondition = InCondition::fromArrayDefinition('IN', ['id', [1, 2, 3]]); - $this->assertSame('id', $inCondition->getColumn()); - $this->assertSame('IN', $inCondition->getOperator()); - $this->assertSame([1, 2, 3], $inCondition->getValues()); + $this->assertSame('id', $inCondition->column); + $this->assertSame('IN', $inCondition->operator); + $this->assertSame([1, 2, 3], $inCondition->values); } public function testFromArrayDefinitionException(): void diff --git a/tests/Db/QueryBuilder/Condition/LikeConditionTest.php b/tests/Db/QueryBuilder/Condition/LikeConditionTest.php index 484bbf028..f3fc63974 100644 --- a/tests/Db/QueryBuilder/Condition/LikeConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/LikeConditionTest.php @@ -18,19 +18,20 @@ public function testConstructor(): void { $likeCondition = new LikeCondition('id', 'LIKE', 'test'); - $this->assertSame('id', $likeCondition->getColumn()); - $this->assertSame('LIKE', $likeCondition->getOperator()); - $this->assertSame('test', $likeCondition->getValue()); - $this->assertNull($likeCondition->getCaseSensitive()); + $this->assertSame('id', $likeCondition->column); + $this->assertSame('LIKE', $likeCondition->operator); + $this->assertSame('test', $likeCondition->value); + $this->assertNull($likeCondition->caseSensitive); } public function testFromArrayDefinition(): void { $likeCondition = LikeCondition::fromArrayDefinition('LIKE', ['id', 'test']); - $this->assertSame('id', $likeCondition->getColumn()); - $this->assertSame('LIKE', $likeCondition->getOperator()); - $this->assertSame('test', $likeCondition->getValue()); + $this->assertSame('id', $likeCondition->column); + $this->assertSame('LIKE', $likeCondition->operator); + $this->assertSame('test', $likeCondition->value); + $this->assertNull($likeCondition->caseSensitive); } public function testFromArrayDefinitionException(): void @@ -63,9 +64,9 @@ public function testFromArrayDefinitionSetEscapingReplacements(): void { $likeCondition = LikeCondition::fromArrayDefinition('LIKE', ['id', 'test', ['%' => '\%', '_' => '\_']]); - $this->assertSame('id', $likeCondition->getColumn()); - $this->assertSame('LIKE', $likeCondition->getOperator()); - $this->assertSame('test', $likeCondition->getValue()); + $this->assertSame('id', $likeCondition->column); + $this->assertSame('LIKE', $likeCondition->operator); + $this->assertSame('test', $likeCondition->value); $this->assertSame(['%' => '\%', '_' => '\_'], $likeCondition->getEscapingReplacements()); } @@ -84,9 +85,9 @@ public function testFromArrayDefinitionCaseSensitive(?bool $caseSensitive): void { $likeCondition = LikeCondition::fromArrayDefinition('LIKE', ['id', 'test', 'caseSensitive' => $caseSensitive]); - $this->assertSame('id', $likeCondition->getColumn()); - $this->assertSame('LIKE', $likeCondition->getOperator()); - $this->assertSame('test', $likeCondition->getValue()); - $this->assertSame($caseSensitive, $likeCondition->getCaseSensitive()); + $this->assertSame('id', $likeCondition->column); + $this->assertSame('LIKE', $likeCondition->operator); + $this->assertSame('test', $likeCondition->value); + $this->assertSame($caseSensitive, $likeCondition->caseSensitive); } } From 5d8a0cdd8604d22b72da9dfaa9f78a23ccfb5be8 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sun, 20 Jul 2025 17:10:52 +0300 Subject: [PATCH 08/14] condition --- src/QueryBuilder/Condition/NotCondition.php | 12 ++++-------- src/QueryBuilder/Condition/NotConditionBuilder.php | 2 +- tests/Db/QueryBuilder/Condition/NotConditionTest.php | 4 ++-- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/QueryBuilder/Condition/NotCondition.php b/src/QueryBuilder/Condition/NotCondition.php index e8114d48d..93fbf2b6c 100644 --- a/src/QueryBuilder/Condition/NotCondition.php +++ b/src/QueryBuilder/Condition/NotCondition.php @@ -17,16 +17,12 @@ */ final class NotCondition implements ConditionInterface { - public function __construct(private ExpressionInterface|array|null|string $condition) - { - } - /** - * @return array|ExpressionInterface|string|null the condition to negate. + * @param ExpressionInterface|array|string|null $condition The condition to negate. */ - public function getCondition(): ExpressionInterface|array|null|string - { - return $this->condition; + public function __construct( + public readonly ExpressionInterface|array|null|string $condition, + ) { } /** diff --git a/src/QueryBuilder/Condition/NotConditionBuilder.php b/src/QueryBuilder/Condition/NotConditionBuilder.php index cf7c0f636..6ee5d0ca0 100644 --- a/src/QueryBuilder/Condition/NotConditionBuilder.php +++ b/src/QueryBuilder/Condition/NotConditionBuilder.php @@ -36,7 +36,7 @@ public function __construct(private readonly QueryBuilderInterface $queryBuilder */ public function build(ExpressionInterface $expression, array &$params = []): string { - $operand = $expression->getCondition(); + $operand = $expression->condition; if ($operand === '') { return ''; diff --git a/tests/Db/QueryBuilder/Condition/NotConditionTest.php b/tests/Db/QueryBuilder/Condition/NotConditionTest.php index d2fcaf267..40da90175 100644 --- a/tests/Db/QueryBuilder/Condition/NotConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/NotConditionTest.php @@ -19,14 +19,14 @@ public function testConstructor(): void { $notCondition = new NotCondition('id = 1'); - $this->assertSame('id = 1', $notCondition->getCondition()); + $this->assertSame('id = 1', $notCondition->condition); } public function testFromArrayDefinition(): void { $notCondition = NotCondition::fromArrayDefinition('NOT', ['id = 1']); - $this->assertSame('id = 1', $notCondition->getCondition()); + $this->assertSame('id = 1', $notCondition->condition); } public function testFromArrayDefinitionException(): void From b914f648fd67ed949477434c0bce6960d21368eb Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sun, 20 Jul 2025 17:37:19 +0300 Subject: [PATCH 09/14] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea6fddeaa..2d7250451 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -111,6 +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) ## 1.3.0 March 21, 2024 From 839b32d33118404193230616676ce4e3f50a9ad1 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sun, 20 Jul 2025 17:40:33 +0300 Subject: [PATCH 10/14] upgrade --- UPGRADE.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/UPGRADE.md b/UPGRADE.md index 64ec1b85c..54fa1ed4c 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -253,3 +253,5 @@ Each table column has its own class in the `Yiisoft\Db\Schema\Column` namespace `ConjunctionConditionInterface`, `ExistConditionInterface`, `HashConditionInterface`, `InConditionInterface`, `LikeConditionInterface`, `NotConditionInterface`, `OverlapsConditionInterface`, `SimpleConditionInterface`; - `ConditionInterface` moved to `Yiisoft\Db\QueryBuilder\Condition` namespace; +- Remove `AbstractConjunctionCondition` and `AbstractOverlapsConditionBuilder`; +- Change namespace of condition and condition builder classes; From ecb680d72eafc390deabc092ca0630bc50683556 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Sun, 20 Jul 2025 14:40:49 +0000 Subject: [PATCH 11/14] Apply fixes from StyleCI --- src/QueryBuilder/Condition/BetweenColumnsCondition.php | 6 +++--- .../Condition/BetweenColumnsConditionBuilder.php | 1 - src/QueryBuilder/Condition/BetweenCondition.php | 2 +- src/QueryBuilder/Condition/BetweenConditionBuilder.php | 1 - .../Condition/Conjunction/AndConditionBuilder.php | 1 - src/QueryBuilder/Condition/Conjunction/OrCondition.php | 1 - .../Condition/Conjunction/OrConditionBuilder.php | 2 -- src/QueryBuilder/Condition/ExistsConditionBuilder.php | 1 - src/QueryBuilder/Condition/HashConditionBuilder.php | 2 -- src/QueryBuilder/Condition/InCondition.php | 2 +- src/QueryBuilder/Condition/InConditionBuilder.php | 1 - src/QueryBuilder/Condition/LikeCondition.php | 4 ++-- src/QueryBuilder/Condition/LikeConditionBuilder.php | 1 - src/QueryBuilder/Condition/NotCondition.php | 2 +- src/QueryBuilder/Condition/NotConditionBuilder.php | 1 - .../Condition/Overlaps/AbstractOverlapsCondition.php | 5 ++--- src/QueryBuilder/Condition/SimpleCondition.php | 2 +- src/QueryBuilder/Condition/SimpleConditionBuilder.php | 1 - tests/AbstractQueryBuilderTest.php | 1 - 19 files changed, 11 insertions(+), 26 deletions(-) diff --git a/src/QueryBuilder/Condition/BetweenColumnsCondition.php b/src/QueryBuilder/Condition/BetweenColumnsCondition.php index 3bd0b80df..df38fff5f 100644 --- a/src/QueryBuilder/Condition/BetweenColumnsCondition.php +++ b/src/QueryBuilder/Condition/BetweenColumnsCondition.php @@ -40,10 +40,10 @@ final class BetweenColumnsCondition implements ConditionInterface { /** - * @param array|int|string|Iterator|ExpressionInterface $value The value to compare against. + * @param array|ExpressionInterface|int|Iterator|string $value The value to compare against. * @param string $operator The operator to use (for example `BETWEEN` or `NOT BETWEEN`). - * @param string|ExpressionInterface $intervalStartColumn The column name or expression that's the beginning of the interval. - * @param string|ExpressionInterface $intervalEndColumn The column name or expression that's the end of the interval. + * @param ExpressionInterface|string $intervalStartColumn The column name or expression that's the beginning of the interval. + * @param ExpressionInterface|string $intervalEndColumn The column name or expression that's the end of the interval. */ public function __construct( public readonly array|int|string|Iterator|ExpressionInterface $value, diff --git a/src/QueryBuilder/Condition/BetweenColumnsConditionBuilder.php b/src/QueryBuilder/Condition/BetweenColumnsConditionBuilder.php index 31acee9ac..1e64574ce 100644 --- a/src/QueryBuilder/Condition/BetweenColumnsConditionBuilder.php +++ b/src/QueryBuilder/Condition/BetweenColumnsConditionBuilder.php @@ -10,7 +10,6 @@ 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\QueryBuilderInterface; use Yiisoft\Db\Query\QueryInterface; diff --git a/src/QueryBuilder/Condition/BetweenCondition.php b/src/QueryBuilder/Condition/BetweenCondition.php index 2f9aa7280..32dafe769 100644 --- a/src/QueryBuilder/Condition/BetweenCondition.php +++ b/src/QueryBuilder/Condition/BetweenCondition.php @@ -13,7 +13,7 @@ final class BetweenCondition implements ConditionInterface { /** - * @param string|ExpressionInterface $column The column name. + * @param ExpressionInterface|string $column The column name. * @param string $operator The operator to use (for example `BETWEEN` or `NOT BETWEEN`). * @param mixed $intervalStart Beginning of the interval. * @param mixed $intervalEnd End of the interval. diff --git a/src/QueryBuilder/Condition/BetweenConditionBuilder.php b/src/QueryBuilder/Condition/BetweenConditionBuilder.php index 964fabbbf..afa7af563 100644 --- a/src/QueryBuilder/Condition/BetweenConditionBuilder.php +++ b/src/QueryBuilder/Condition/BetweenConditionBuilder.php @@ -10,7 +10,6 @@ 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\QueryBuilderInterface; use function str_contains; diff --git a/src/QueryBuilder/Condition/Conjunction/AndConditionBuilder.php b/src/QueryBuilder/Condition/Conjunction/AndConditionBuilder.php index 2484c759d..9cd36d641 100644 --- a/src/QueryBuilder/Condition/Conjunction/AndConditionBuilder.php +++ b/src/QueryBuilder/Condition/Conjunction/AndConditionBuilder.php @@ -10,7 +10,6 @@ use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Expression\ExpressionBuilderInterface; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\QueryBuilder\Condition\Conjunction\AndCondition; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; /** diff --git a/src/QueryBuilder/Condition/Conjunction/OrCondition.php b/src/QueryBuilder/Condition/Conjunction/OrCondition.php index 559e027fc..473d9ee50 100644 --- a/src/QueryBuilder/Condition/Conjunction/OrCondition.php +++ b/src/QueryBuilder/Condition/Conjunction/OrCondition.php @@ -22,7 +22,6 @@ public function __construct( ) { } - public static function fromArrayDefinition(string $operator, array $operands): self { /** @psalm-var array $operands */ diff --git a/src/QueryBuilder/Condition/Conjunction/OrConditionBuilder.php b/src/QueryBuilder/Condition/Conjunction/OrConditionBuilder.php index 4e09752c0..e434bd684 100644 --- a/src/QueryBuilder/Condition/Conjunction/OrConditionBuilder.php +++ b/src/QueryBuilder/Condition/Conjunction/OrConditionBuilder.php @@ -10,7 +10,6 @@ use Yiisoft\Db\Exception\NotSupportedException; use Yiisoft\Db\Expression\ExpressionBuilderInterface; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\QueryBuilder\Condition\Conjunction\OrCondition; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; /** @@ -41,4 +40,3 @@ public function build(ExpressionInterface $expression, array &$params = []): str return $this->expressionsConjunctionBuilder->build($expression->expressions, $params); } } - diff --git a/src/QueryBuilder/Condition/ExistsConditionBuilder.php b/src/QueryBuilder/Condition/ExistsConditionBuilder.php index 78dc951d5..70b901854 100644 --- a/src/QueryBuilder/Condition/ExistsConditionBuilder.php +++ b/src/QueryBuilder/Condition/ExistsConditionBuilder.php @@ -10,7 +10,6 @@ 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\QueryBuilderInterface; /** diff --git a/src/QueryBuilder/Condition/HashConditionBuilder.php b/src/QueryBuilder/Condition/HashConditionBuilder.php index 0b36c59f8..29238615b 100644 --- a/src/QueryBuilder/Condition/HashConditionBuilder.php +++ b/src/QueryBuilder/Condition/HashConditionBuilder.php @@ -10,8 +10,6 @@ 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\QueryBuilderInterface; use Yiisoft\Db\Query\QueryInterface; diff --git a/src/QueryBuilder/Condition/InCondition.php b/src/QueryBuilder/Condition/InCondition.php index 54d180859..561d4df87 100644 --- a/src/QueryBuilder/Condition/InCondition.php +++ b/src/QueryBuilder/Condition/InCondition.php @@ -15,7 +15,7 @@ final class InCondition implements ConditionInterface { /** - * @param array|string|Iterator|ExpressionInterface $column The column name. If it's an array, a composite `IN` condition + * @param array|ExpressionInterface|Iterator|string $column The column name. If it's an array, a composite `IN` condition * will be generated. * @param string $operator The operator to use (for example, `IN` or `NOT IN`). * @param int|iterable|Iterator|QueryInterface $values An array of values that {@see $columns} value should be among. diff --git a/src/QueryBuilder/Condition/InConditionBuilder.php b/src/QueryBuilder/Condition/InConditionBuilder.php index 162721701..554833221 100644 --- a/src/QueryBuilder/Condition/InConditionBuilder.php +++ b/src/QueryBuilder/Condition/InConditionBuilder.php @@ -13,7 +13,6 @@ 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\QueryBuilderInterface; use Yiisoft\Db\Query\QueryInterface; diff --git a/src/QueryBuilder/Condition/LikeCondition.php b/src/QueryBuilder/Condition/LikeCondition.php index 09ef832a9..298a5d467 100644 --- a/src/QueryBuilder/Condition/LikeCondition.php +++ b/src/QueryBuilder/Condition/LikeCondition.php @@ -21,9 +21,9 @@ final class LikeCondition implements ConditionInterface protected array|null $escapingReplacements = []; /** - * @param string|ExpressionInterface $column The column name. + * @param ExpressionInterface|string $column The column name. * @param string $operator The operator to use such as `>` or `<=`. - * @param array|int|string|Iterator|ExpressionInterface|null $value The value to the right of {@see operator}. + * @param array|ExpressionInterface|int|Iterator|string|null $value The value to the right of {@see operator}. * @param bool|null $caseSensitive Whether the comparison is case-sensitive. `null` means using the default * behavior. */ diff --git a/src/QueryBuilder/Condition/LikeConditionBuilder.php b/src/QueryBuilder/Condition/LikeConditionBuilder.php index 82d47122b..fcf8862eb 100644 --- a/src/QueryBuilder/Condition/LikeConditionBuilder.php +++ b/src/QueryBuilder/Condition/LikeConditionBuilder.php @@ -12,7 +12,6 @@ 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\QueryBuilderInterface; use function implode; diff --git a/src/QueryBuilder/Condition/NotCondition.php b/src/QueryBuilder/Condition/NotCondition.php index 93fbf2b6c..f96ba198f 100644 --- a/src/QueryBuilder/Condition/NotCondition.php +++ b/src/QueryBuilder/Condition/NotCondition.php @@ -18,7 +18,7 @@ final class NotCondition implements ConditionInterface { /** - * @param ExpressionInterface|array|string|null $condition The condition to negate. + * @param array|ExpressionInterface|string|null $condition The condition to negate. */ public function __construct( public readonly ExpressionInterface|array|null|string $condition, diff --git a/src/QueryBuilder/Condition/NotConditionBuilder.php b/src/QueryBuilder/Condition/NotConditionBuilder.php index 6ee5d0ca0..0c7fb42b2 100644 --- a/src/QueryBuilder/Condition/NotConditionBuilder.php +++ b/src/QueryBuilder/Condition/NotConditionBuilder.php @@ -10,7 +10,6 @@ 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\QueryBuilderInterface; /** diff --git a/src/QueryBuilder/Condition/Overlaps/AbstractOverlapsCondition.php b/src/QueryBuilder/Condition/Overlaps/AbstractOverlapsCondition.php index 13f341bd8..2419d5dd5 100644 --- a/src/QueryBuilder/Condition/Overlaps/AbstractOverlapsCondition.php +++ b/src/QueryBuilder/Condition/Overlaps/AbstractOverlapsCondition.php @@ -6,7 +6,6 @@ use InvalidArgumentException; use Yiisoft\Db\Expression\ExpressionInterface; - use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; use function is_iterable; @@ -18,8 +17,8 @@ abstract class AbstractOverlapsCondition implements ConditionInterface { /** - * @param string|ExpressionInterface $column The column name or an expression. - * @param iterable|ExpressionInterface $values An array of values that {@see $columns} value should overlap. + * @param ExpressionInterface|string $column The column name or an expression. + * @param ExpressionInterface|iterable $values An array of values that {@see $columns} value should overlap. */ public function __construct( public readonly string|ExpressionInterface $column, diff --git a/src/QueryBuilder/Condition/SimpleCondition.php b/src/QueryBuilder/Condition/SimpleCondition.php index c07821ca6..4c54d0cc1 100644 --- a/src/QueryBuilder/Condition/SimpleCondition.php +++ b/src/QueryBuilder/Condition/SimpleCondition.php @@ -15,7 +15,7 @@ final class SimpleCondition implements ConditionInterface { /** - * @param string|ExpressionInterface $column The column name or an expression. + * @param ExpressionInterface|string $column The column name or an expression. * @param string $operator The operator to use such as `>` or `<=`. * @param mixed $value The value to the right of {@see $operator}. */ diff --git a/src/QueryBuilder/Condition/SimpleConditionBuilder.php b/src/QueryBuilder/Condition/SimpleConditionBuilder.php index 2cdb95f9c..c2cd37796 100644 --- a/src/QueryBuilder/Condition/SimpleConditionBuilder.php +++ b/src/QueryBuilder/Condition/SimpleConditionBuilder.php @@ -10,7 +10,6 @@ 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\QueryBuilderInterface; use function str_contains; diff --git a/tests/AbstractQueryBuilderTest.php b/tests/AbstractQueryBuilderTest.php index 4e588d89f..21f16a121 100644 --- a/tests/AbstractQueryBuilderTest.php +++ b/tests/AbstractQueryBuilderTest.php @@ -35,7 +35,6 @@ use Yiisoft\Db\Tests\Support\TestTrait; use function PHPUnit\Framework\assertEmpty; -use function PHPUnit\Framework\assertInstanceOf; use function PHPUnit\Framework\assertSame; /** From 333dea76e87e64dd0572dfb0f219c24830de0c42 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sun, 20 Jul 2025 21:48:12 +0300 Subject: [PATCH 12/14] improve hash --- src/QueryBuilder/Condition/HashCondition.php | 4 ++-- src/QueryBuilder/Condition/HashConditionBuilder.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/QueryBuilder/Condition/HashCondition.php b/src/QueryBuilder/Condition/HashCondition.php index 9b63a936e..a7cad2251 100644 --- a/src/QueryBuilder/Condition/HashCondition.php +++ b/src/QueryBuilder/Condition/HashCondition.php @@ -10,10 +10,10 @@ final class HashCondition implements ConditionInterface { /** - * @param array|null $hash The condition specification. + * @param array $hash The condition specification. */ public function __construct( - public readonly array|null $hash = [], + public readonly array $hash = [], ) { } diff --git a/src/QueryBuilder/Condition/HashConditionBuilder.php b/src/QueryBuilder/Condition/HashConditionBuilder.php index 0b36c59f8..ad1c59c15 100644 --- a/src/QueryBuilder/Condition/HashConditionBuilder.php +++ b/src/QueryBuilder/Condition/HashConditionBuilder.php @@ -42,7 +42,7 @@ public function __construct(private readonly QueryBuilderInterface $queryBuilder */ public function build(ExpressionInterface $expression, array &$params = []): string { - $hash = $expression->hash ?? []; + $hash = $expression->hash; $parts = []; /** From ca953587b3c5f38f3912964e2407ca7680449f04 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Mon, 21 Jul 2025 11:27:48 +0300 Subject: [PATCH 13/14] refactor --- docs/guide/en/query/where.md | 2 +- docs/guide/pt-BR/query/where.md | 2 +- src/QueryBuilder/AbstractDQLQueryBuilder.php | 28 ++++++------- .../AbstractOverlapsCondition.php | 2 +- .../{Conjunction => }/AndCondition.php | 2 +- .../{Overlaps => }/ArrayOverlapsCondition.php | 2 +- .../BetweenColumnsConditionBuilder.php | 3 +- .../{ => Builder}/BetweenConditionBuilder.php | 3 +- .../{ => Builder}/ExistsConditionBuilder.php | 3 +- .../{ => Builder}/HashConditionBuilder.php | 4 +- .../{ => Builder}/InConditionBuilder.php | 3 +- .../{ => Builder}/LikeConditionBuilder.php | 3 +- .../LogicalConditionBuilder.php} | 32 ++++++++------ .../{ => Builder}/NotConditionBuilder.php | 3 +- .../{ => Builder}/SimpleConditionBuilder.php | 3 +- .../Conjunction/AndConditionBuilder.php | 42 ------------------- .../Conjunction/OrConditionBuilder.php | 42 ------------------- .../{Overlaps => }/JsonOverlapsCondition.php | 2 +- .../{Conjunction => }/OrCondition.php | 2 +- tests/AbstractQueryBuilderTest.php | 8 ++-- .../{Conjunction => }/AndConditionTest.php | 4 +- .../BetweenColumnsConditionBuilderTest.php | 2 +- .../Builder/LikeConditionBuilderTest.php | 2 +- 23 files changed, 66 insertions(+), 133 deletions(-) rename src/QueryBuilder/Condition/{Overlaps => }/AbstractOverlapsCondition.php (97%) rename src/QueryBuilder/Condition/{Conjunction => }/AndCondition.php (93%) rename src/QueryBuilder/Condition/{Overlaps => }/ArrayOverlapsCondition.php (81%) rename src/QueryBuilder/Condition/{ => Builder}/BetweenColumnsConditionBuilder.php (96%) rename src/QueryBuilder/Condition/{ => Builder}/BetweenConditionBuilder.php (95%) rename src/QueryBuilder/Condition/{ => Builder}/ExistsConditionBuilder.php (91%) rename src/QueryBuilder/Condition/{ => Builder}/HashConditionBuilder.php (92%) rename src/QueryBuilder/Condition/{ => Builder}/InConditionBuilder.php (98%) rename src/QueryBuilder/Condition/{ => Builder}/LikeConditionBuilder.php (97%) rename src/QueryBuilder/Condition/{Conjunction/ExpressionsConjunctionBuilder.php => Builder/LogicalConditionBuilder.php} (64%) rename src/QueryBuilder/Condition/{ => Builder}/NotConditionBuilder.php (92%) rename src/QueryBuilder/Condition/{ => Builder}/SimpleConditionBuilder.php (94%) delete mode 100644 src/QueryBuilder/Condition/Conjunction/AndConditionBuilder.php delete mode 100644 src/QueryBuilder/Condition/Conjunction/OrConditionBuilder.php rename src/QueryBuilder/Condition/{Overlaps => }/JsonOverlapsCondition.php (81%) rename src/QueryBuilder/Condition/{Conjunction => }/OrCondition.php (93%) rename tests/Db/QueryBuilder/Condition/{Conjunction => }/AndConditionTest.php (74%) diff --git a/docs/guide/en/query/where.md b/docs/guide/en/query/where.md index c49413b4d..ddbc185ea 100644 --- a/docs/guide/en/query/where.md +++ b/docs/guide/en/query/where.md @@ -277,7 +277,7 @@ so it's possible to combine formats in a single condition: ```php use Yiisoft\Db\QueryBuilder\Condition\InCondition; -use Yiisoft\Db\QueryBuilder\Condition\Conjunction\OrCondition; +use Yiisoft\Db\QueryBuilder\Condition\OrCondition; use Yiisoft\Db\Query\Query; /** @var Query $query */ diff --git a/docs/guide/pt-BR/query/where.md b/docs/guide/pt-BR/query/where.md index 736837eb3..ca246d07f 100644 --- a/docs/guide/pt-BR/query/where.md +++ b/docs/guide/pt-BR/query/where.md @@ -252,7 +252,7 @@ então é possível combinar formatos em uma única condição: ```php use Yiisoft\Db\QueryBuilder\Condition\InCondition; -use Yiisoft\Db\QueryBuilder\Condition\Conjunction\OrCondition; +use Yiisoft\Db\QueryBuilder\Condition\OrCondition; use Yiisoft\Db\Query\Query; /** @var Query $query */ diff --git a/src/QueryBuilder/AbstractDQLQueryBuilder.php b/src/QueryBuilder/AbstractDQLQueryBuilder.php index 0634ebae5..ab22cf1bc 100644 --- a/src/QueryBuilder/AbstractDQLQueryBuilder.php +++ b/src/QueryBuilder/AbstractDQLQueryBuilder.php @@ -504,8 +504,8 @@ protected function defaultConditionClasses(): array { return [ 'NOT' => Condition\NotCondition::class, - 'AND' => Condition\Conjunction\AndCondition::class, - 'OR' => Condition\Conjunction\OrCondition::class, + 'AND' => Condition\AndCondition::class, + 'OR' => Condition\OrCondition::class, 'BETWEEN' => Condition\BetweenCondition::class, 'NOT BETWEEN' => Condition\BetweenCondition::class, 'IN' => Condition\InCondition::class, @@ -516,8 +516,8 @@ protected function defaultConditionClasses(): array 'OR NOT LIKE' => Condition\LikeCondition::class, 'EXISTS' => Condition\ExistsCondition::class, 'NOT EXISTS' => Condition\ExistsCondition::class, - 'ARRAY OVERLAPS' => Condition\Overlaps\ArrayOverlapsCondition::class, - 'JSON OVERLAPS' => Condition\Overlaps\JsonOverlapsCondition::class, + 'ARRAY OVERLAPS' => Condition\ArrayOverlapsCondition::class, + 'JSON OVERLAPS' => Condition\JsonOverlapsCondition::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\NotConditionBuilder::class, - Condition\Conjunction\AndCondition::class => Condition\Conjunction\AndConditionBuilder::class, - Condition\Conjunction\OrCondition::class => Condition\Conjunction\OrConditionBuilder::class, - Condition\BetweenCondition::class => Condition\BetweenConditionBuilder::class, - Condition\InCondition::class => Condition\InConditionBuilder::class, - Condition\LikeCondition::class => Condition\LikeConditionBuilder::class, - Condition\ExistsCondition::class => Condition\ExistsConditionBuilder::class, - SimpleCondition::class => Condition\SimpleConditionBuilder::class, - HashCondition::class => Condition\HashConditionBuilder::class, - Condition\BetweenColumnsCondition::class => Condition\BetweenColumnsConditionBuilder::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, JsonExpression::class => JsonExpressionBuilder::class, ArrayExpression::class => ArrayExpressionBuilder::class, StructuredExpression::class => StructuredExpressionBuilder::class, diff --git a/src/QueryBuilder/Condition/Overlaps/AbstractOverlapsCondition.php b/src/QueryBuilder/Condition/AbstractOverlapsCondition.php similarity index 97% rename from src/QueryBuilder/Condition/Overlaps/AbstractOverlapsCondition.php rename to src/QueryBuilder/Condition/AbstractOverlapsCondition.php index 2419d5dd5..4d62848b8 100644 --- a/src/QueryBuilder/Condition/Overlaps/AbstractOverlapsCondition.php +++ b/src/QueryBuilder/Condition/AbstractOverlapsCondition.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Overlaps; +namespace Yiisoft\Db\QueryBuilder\Condition; use InvalidArgumentException; use Yiisoft\Db\Expression\ExpressionInterface; diff --git a/src/QueryBuilder/Condition/Conjunction/AndCondition.php b/src/QueryBuilder/Condition/AndCondition.php similarity index 93% rename from src/QueryBuilder/Condition/Conjunction/AndCondition.php rename to src/QueryBuilder/Condition/AndCondition.php index a32101aeb..ff53de06f 100644 --- a/src/QueryBuilder/Condition/Conjunction/AndCondition.php +++ b/src/QueryBuilder/Condition/AndCondition.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Conjunction; +namespace Yiisoft\Db\QueryBuilder\Condition; use Yiisoft\Db\Expression\ExpressionInterface; use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; diff --git a/src/QueryBuilder/Condition/Overlaps/ArrayOverlapsCondition.php b/src/QueryBuilder/Condition/ArrayOverlapsCondition.php similarity index 81% rename from src/QueryBuilder/Condition/Overlaps/ArrayOverlapsCondition.php rename to src/QueryBuilder/Condition/ArrayOverlapsCondition.php index aed13d210..7c215b578 100644 --- a/src/QueryBuilder/Condition/Overlaps/ArrayOverlapsCondition.php +++ b/src/QueryBuilder/Condition/ArrayOverlapsCondition.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Overlaps; +namespace Yiisoft\Db\QueryBuilder\Condition; /** * Condition that represents `ARRAY OVERLAPS` operator is used to check if a column of array type overlaps another array. diff --git a/src/QueryBuilder/Condition/BetweenColumnsConditionBuilder.php b/src/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilder.php similarity index 96% rename from src/QueryBuilder/Condition/BetweenColumnsConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilder.php index 1e64574ce..7dafffc78 100644 --- a/src/QueryBuilder/Condition/BetweenColumnsConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition; +namespace Yiisoft\Db\QueryBuilder\Condition\Builder; use Yiisoft\Db\Exception\Exception; use InvalidArgumentException; @@ -10,6 +10,7 @@ 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\QueryBuilderInterface; use Yiisoft\Db\Query\QueryInterface; diff --git a/src/QueryBuilder/Condition/BetweenConditionBuilder.php b/src/QueryBuilder/Condition/Builder/BetweenConditionBuilder.php similarity index 95% rename from src/QueryBuilder/Condition/BetweenConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/BetweenConditionBuilder.php index afa7af563..255cf412a 100644 --- a/src/QueryBuilder/Condition/BetweenConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/BetweenConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition; +namespace Yiisoft\Db\QueryBuilder\Condition\Builder; use Yiisoft\Db\Exception\Exception; use InvalidArgumentException; @@ -10,6 +10,7 @@ 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\QueryBuilderInterface; use function str_contains; diff --git a/src/QueryBuilder/Condition/ExistsConditionBuilder.php b/src/QueryBuilder/Condition/Builder/ExistsConditionBuilder.php similarity index 91% rename from src/QueryBuilder/Condition/ExistsConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/ExistsConditionBuilder.php index 70b901854..1f52433ce 100644 --- a/src/QueryBuilder/Condition/ExistsConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/ExistsConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition; +namespace Yiisoft\Db\QueryBuilder\Condition\Builder; use Yiisoft\Db\Exception\Exception; use InvalidArgumentException; @@ -10,6 +10,7 @@ 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\QueryBuilderInterface; /** diff --git a/src/QueryBuilder/Condition/HashConditionBuilder.php b/src/QueryBuilder/Condition/Builder/HashConditionBuilder.php similarity index 92% rename from src/QueryBuilder/Condition/HashConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/HashConditionBuilder.php index 44059a4bb..090e5723b 100644 --- a/src/QueryBuilder/Condition/HashConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/HashConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition; +namespace Yiisoft\Db\QueryBuilder\Condition\Builder; use Yiisoft\Db\Exception\Exception; use InvalidArgumentException; @@ -10,6 +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\QueryBuilderInterface; use Yiisoft\Db\Query\QueryInterface; diff --git a/src/QueryBuilder/Condition/InConditionBuilder.php b/src/QueryBuilder/Condition/Builder/InConditionBuilder.php similarity index 98% rename from src/QueryBuilder/Condition/InConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/InConditionBuilder.php index 554833221..37917cf26 100644 --- a/src/QueryBuilder/Condition/InConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/InConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition; +namespace Yiisoft\Db\QueryBuilder\Condition\Builder; use ArrayAccess; use Iterator; @@ -13,6 +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\QueryBuilderInterface; use Yiisoft\Db\Query\QueryInterface; diff --git a/src/QueryBuilder/Condition/LikeConditionBuilder.php b/src/QueryBuilder/Condition/Builder/LikeConditionBuilder.php similarity index 97% rename from src/QueryBuilder/Condition/LikeConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/LikeConditionBuilder.php index fcf8862eb..ecf83f98f 100644 --- a/src/QueryBuilder/Condition/LikeConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/LikeConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition; +namespace Yiisoft\Db\QueryBuilder\Condition\Builder; use Yiisoft\Db\Command\Param; use Yiisoft\Db\Constant\DataType; @@ -12,6 +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\QueryBuilderInterface; use function implode; diff --git a/src/QueryBuilder/Condition/Conjunction/ExpressionsConjunctionBuilder.php b/src/QueryBuilder/Condition/Builder/LogicalConditionBuilder.php similarity index 64% rename from src/QueryBuilder/Condition/Conjunction/ExpressionsConjunctionBuilder.php rename to src/QueryBuilder/Condition/Builder/LogicalConditionBuilder.php index d2247712d..e1d921700 100644 --- a/src/QueryBuilder/Condition/Conjunction/ExpressionsConjunctionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/LogicalConditionBuilder.php @@ -2,13 +2,17 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Conjunction; +namespace Yiisoft\Db\QueryBuilder\Condition\Builder; use Yiisoft\Db\Exception\Exception; use InvalidArgumentException; use Yiisoft\Db\Exception\InvalidConfigException; 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\ConditionInterface; +use Yiisoft\Db\QueryBuilder\Condition\OrCondition; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; use function count; @@ -17,32 +21,31 @@ use function reset; /** - * @internal * - * Build an array of expressions' objects into SQL expressions. + * Build an object of {@see AndCondition} or {@see OrCondition} into SQL expressions. + * + * @implements ExpressionBuilderInterface */ -final class ExpressionsConjunctionBuilder +final class LogicalConditionBuilder implements ExpressionBuilderInterface { public function __construct( - private readonly string $operator, private readonly QueryBuilderInterface $queryBuilder ) { } /** - * @param array $expressions The expressions to be built. - * @param array $params The binding parameters. + * Build SQL for {@see AndCondition} or {@see OrCondition}. + * + * @param AndCondition|OrCondition $expression * * @throws Exception * @throws InvalidArgumentException * @throws InvalidConfigException * @throws NotSupportedException - * - * @psalm-param array $expressions */ - public function build(array $expressions, array &$params = []): string + public function build(ExpressionInterface $expression, array &$params = []): string { - $parts = $this->buildExpressions($expressions, $params); + $parts = $this->buildExpressions($expression->expressions, $params); if (empty($parts)) { return ''; @@ -52,7 +55,12 @@ public function build(array $expressions, array &$params = []): string return (string) reset($parts); } - return '(' . implode(") $this->operator (", $parts) . ')'; + $operator = match($expression::class) { + AndCondition::class => 'AND', + OrCondition::class => 'OR', + }; + + return '(' . implode(") $operator (", $parts) . ')'; } /** diff --git a/src/QueryBuilder/Condition/NotConditionBuilder.php b/src/QueryBuilder/Condition/Builder/NotConditionBuilder.php similarity index 92% rename from src/QueryBuilder/Condition/NotConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/NotConditionBuilder.php index 0c7fb42b2..3922fdac4 100644 --- a/src/QueryBuilder/Condition/NotConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/NotConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition; +namespace Yiisoft\Db\QueryBuilder\Condition\Builder; use Yiisoft\Db\Exception\Exception; use InvalidArgumentException; @@ -10,6 +10,7 @@ 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\QueryBuilderInterface; /** diff --git a/src/QueryBuilder/Condition/SimpleConditionBuilder.php b/src/QueryBuilder/Condition/Builder/SimpleConditionBuilder.php similarity index 94% rename from src/QueryBuilder/Condition/SimpleConditionBuilder.php rename to src/QueryBuilder/Condition/Builder/SimpleConditionBuilder.php index c2cd37796..5ba3ab0e5 100644 --- a/src/QueryBuilder/Condition/SimpleConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/SimpleConditionBuilder.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition; +namespace Yiisoft\Db\QueryBuilder\Condition\Builder; use Yiisoft\Db\Exception\Exception; use InvalidArgumentException; @@ -10,6 +10,7 @@ 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\QueryBuilderInterface; use function str_contains; diff --git a/src/QueryBuilder/Condition/Conjunction/AndConditionBuilder.php b/src/QueryBuilder/Condition/Conjunction/AndConditionBuilder.php deleted file mode 100644 index 9cd36d641..000000000 --- a/src/QueryBuilder/Condition/Conjunction/AndConditionBuilder.php +++ /dev/null @@ -1,42 +0,0 @@ - - */ -final class AndConditionBuilder implements ExpressionBuilderInterface -{ - private ExpressionsConjunctionBuilder $expressionsConjunctionBuilder; - - public function __construct( - QueryBuilderInterface $queryBuilder, - ) { - $this->expressionsConjunctionBuilder = new ExpressionsConjunctionBuilder('AND', $queryBuilder); - } - - /** - * Build SQL for {@see AndCondition}. - * - * @param AndCondition $expression - * - * @throws Exception - * @throws InvalidArgumentException - * @throws InvalidConfigException - * @throws NotSupportedException - */ - public function build(ExpressionInterface $expression, array &$params = []): string - { - return $this->expressionsConjunctionBuilder->build($expression->expressions, $params); - } -} diff --git a/src/QueryBuilder/Condition/Conjunction/OrConditionBuilder.php b/src/QueryBuilder/Condition/Conjunction/OrConditionBuilder.php deleted file mode 100644 index e434bd684..000000000 --- a/src/QueryBuilder/Condition/Conjunction/OrConditionBuilder.php +++ /dev/null @@ -1,42 +0,0 @@ - - */ -final class OrConditionBuilder implements ExpressionBuilderInterface -{ - private ExpressionsConjunctionBuilder $expressionsConjunctionBuilder; - - public function __construct( - QueryBuilderInterface $queryBuilder, - ) { - $this->expressionsConjunctionBuilder = new ExpressionsConjunctionBuilder('OR', $queryBuilder); - } - - /** - * Build SQL for {@see OrCondition}. - * - * @param OrCondition $expression - * - * @throws Exception - * @throws InvalidArgumentException - * @throws InvalidConfigException - * @throws NotSupportedException - */ - public function build(ExpressionInterface $expression, array &$params = []): string - { - return $this->expressionsConjunctionBuilder->build($expression->expressions, $params); - } -} diff --git a/src/QueryBuilder/Condition/Overlaps/JsonOverlapsCondition.php b/src/QueryBuilder/Condition/JsonOverlapsCondition.php similarity index 81% rename from src/QueryBuilder/Condition/Overlaps/JsonOverlapsCondition.php rename to src/QueryBuilder/Condition/JsonOverlapsCondition.php index 2d3586e9c..de6a47403 100644 --- a/src/QueryBuilder/Condition/Overlaps/JsonOverlapsCondition.php +++ b/src/QueryBuilder/Condition/JsonOverlapsCondition.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Overlaps; +namespace Yiisoft\Db\QueryBuilder\Condition; /** * Condition that represents `JSON OVERLAPS` operator and is used to check if a column of JSON type overlaps an array. diff --git a/src/QueryBuilder/Condition/Conjunction/OrCondition.php b/src/QueryBuilder/Condition/OrCondition.php similarity index 93% rename from src/QueryBuilder/Condition/Conjunction/OrCondition.php rename to src/QueryBuilder/Condition/OrCondition.php index 473d9ee50..61298fdd1 100644 --- a/src/QueryBuilder/Condition/Conjunction/OrCondition.php +++ b/src/QueryBuilder/Condition/OrCondition.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Yiisoft\Db\QueryBuilder\Condition\Conjunction; +namespace Yiisoft\Db\QueryBuilder\Condition; use Yiisoft\Db\Expression\ExpressionInterface; use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; diff --git a/tests/AbstractQueryBuilderTest.php b/tests/AbstractQueryBuilderTest.php index 21f16a121..101b93551 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\Conjunction\AndCondition; -use Yiisoft\Db\QueryBuilder\Condition\Overlaps\ArrayOverlapsCondition; -use Yiisoft\Db\QueryBuilder\Condition\Overlaps\JsonOverlapsCondition; -use Yiisoft\Db\QueryBuilder\Condition\Conjunction\OrCondition; +use Yiisoft\Db\QueryBuilder\Condition\AndCondition; +use Yiisoft\Db\QueryBuilder\Condition\ArrayOverlapsCondition; +use Yiisoft\Db\QueryBuilder\Condition\JsonOverlapsCondition; +use Yiisoft\Db\QueryBuilder\Condition\OrCondition; use Yiisoft\Db\QueryBuilder\Condition\SimpleCondition; use Yiisoft\Db\Schema\Column\ColumnInterface; use Yiisoft\Db\Schema\QuoterInterface; diff --git a/tests/Db/QueryBuilder/Condition/Conjunction/AndConditionTest.php b/tests/Db/QueryBuilder/Condition/AndConditionTest.php similarity index 74% rename from tests/Db/QueryBuilder/Condition/Conjunction/AndConditionTest.php rename to tests/Db/QueryBuilder/Condition/AndConditionTest.php index 1d46e7da7..b4f825264 100644 --- a/tests/Db/QueryBuilder/Condition/Conjunction/AndConditionTest.php +++ b/tests/Db/QueryBuilder/Condition/AndConditionTest.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Yiisoft\Db\Tests\Db\QueryBuilder\Condition\Conjunction; +namespace Yiisoft\Db\Tests\Db\QueryBuilder\Condition; use PHPUnit\Framework\TestCase; -use Yiisoft\Db\QueryBuilder\Condition\Conjunction\AndCondition; +use Yiisoft\Db\QueryBuilder\Condition\AndCondition; /** * @group db diff --git a/tests/Db/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilderTest.php b/tests/Db/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilderTest.php index a96896512..43e687975 100644 --- a/tests/Db/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilderTest.php +++ b/tests/Db/QueryBuilder/Condition/Builder/BetweenColumnsConditionBuilderTest.php @@ -6,7 +6,7 @@ use PHPUnit\Framework\TestCase; use Yiisoft\Db\QueryBuilder\Condition\BetweenColumnsCondition; -use Yiisoft\Db\QueryBuilder\Condition\BetweenColumnsConditionBuilder; +use Yiisoft\Db\QueryBuilder\Condition\Builder\BetweenColumnsConditionBuilder; use Yiisoft\Db\Tests\Support\TestTrait; /** diff --git a/tests/Db/QueryBuilder/Condition/Builder/LikeConditionBuilderTest.php b/tests/Db/QueryBuilder/Condition/Builder/LikeConditionBuilderTest.php index d3345628b..0105c3349 100644 --- a/tests/Db/QueryBuilder/Condition/Builder/LikeConditionBuilderTest.php +++ b/tests/Db/QueryBuilder/Condition/Builder/LikeConditionBuilderTest.php @@ -6,7 +6,7 @@ use PHPUnit\Framework\TestCase; use InvalidArgumentException; -use Yiisoft\Db\QueryBuilder\Condition\LikeConditionBuilder; +use Yiisoft\Db\QueryBuilder\Condition\Builder\LikeConditionBuilder; use Yiisoft\Db\QueryBuilder\Condition\LikeCondition; use Yiisoft\Db\Tests\Support\TestTrait; From 5ed1aef395e2fdd5188a341e5c9a14550c459420 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Mon, 21 Jul 2025 08:28:08 +0000 Subject: [PATCH 14/14] Apply fixes from StyleCI --- src/QueryBuilder/Condition/AbstractOverlapsCondition.php | 1 - src/QueryBuilder/Condition/AndCondition.php | 1 - .../Condition/Builder/LogicalConditionBuilder.php | 4 +--- src/QueryBuilder/Condition/OrCondition.php | 1 - 4 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/QueryBuilder/Condition/AbstractOverlapsCondition.php b/src/QueryBuilder/Condition/AbstractOverlapsCondition.php index 4d62848b8..27810a68c 100644 --- a/src/QueryBuilder/Condition/AbstractOverlapsCondition.php +++ b/src/QueryBuilder/Condition/AbstractOverlapsCondition.php @@ -6,7 +6,6 @@ use InvalidArgumentException; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; use function is_iterable; use function is_string; diff --git a/src/QueryBuilder/Condition/AndCondition.php b/src/QueryBuilder/Condition/AndCondition.php index ff53de06f..4a6ab6c02 100644 --- a/src/QueryBuilder/Condition/AndCondition.php +++ b/src/QueryBuilder/Condition/AndCondition.php @@ -5,7 +5,6 @@ namespace Yiisoft\Db\QueryBuilder\Condition; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; /** * Condition that connects two or more SQL expressions with the `AND` operator. diff --git a/src/QueryBuilder/Condition/Builder/LogicalConditionBuilder.php b/src/QueryBuilder/Condition/Builder/LogicalConditionBuilder.php index e1d921700..98dfd52c2 100644 --- a/src/QueryBuilder/Condition/Builder/LogicalConditionBuilder.php +++ b/src/QueryBuilder/Condition/Builder/LogicalConditionBuilder.php @@ -11,7 +11,6 @@ use Yiisoft\Db\Expression\ExpressionBuilderInterface; use Yiisoft\Db\Expression\ExpressionInterface; use Yiisoft\Db\QueryBuilder\Condition\AndCondition; -use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; use Yiisoft\Db\QueryBuilder\Condition\OrCondition; use Yiisoft\Db\QueryBuilder\QueryBuilderInterface; @@ -21,7 +20,6 @@ use function reset; /** - * * Build an object of {@see AndCondition} or {@see OrCondition} into SQL expressions. * * @implements ExpressionBuilderInterface @@ -55,7 +53,7 @@ public function build(ExpressionInterface $expression, array &$params = []): str return (string) reset($parts); } - $operator = match($expression::class) { + $operator = match ($expression::class) { AndCondition::class => 'AND', OrCondition::class => 'OR', }; diff --git a/src/QueryBuilder/Condition/OrCondition.php b/src/QueryBuilder/Condition/OrCondition.php index 61298fdd1..0bf8bb606 100644 --- a/src/QueryBuilder/Condition/OrCondition.php +++ b/src/QueryBuilder/Condition/OrCondition.php @@ -5,7 +5,6 @@ namespace Yiisoft\Db\QueryBuilder\Condition; use Yiisoft\Db\Expression\ExpressionInterface; -use Yiisoft\Db\QueryBuilder\Condition\ConditionInterface; /** * Condition that connects two or more SQL expressions with the `AND` operator.