From d1b905d568eaad0dfca4096d128a7a49f8c21726 Mon Sep 17 00:00:00 2001 From: Mahmud Date: Thu, 25 Sep 2025 04:39:46 +0300 Subject: [PATCH 1/9] Rename handlers All to AndX, Any to OrX, use filter properties and introduce like matching mode. --- src/Reader/EntityReader.php | 4 +-- .../{AllHandler.php => AndXHandler.php} | 10 +++---- src/Reader/FilterHandler/BetweenHandler.php | 2 +- src/Reader/FilterHandler/EqualsHandler.php | 2 +- .../FilterHandler/EqualsNullHandler.php | 2 +- .../FilterHandler/GreaterThanHandler.php | 2 +- .../GreaterThanOrEqualHandler.php | 2 +- src/Reader/FilterHandler/InHandler.php | 2 +- src/Reader/FilterHandler/LessThanHandler.php | 2 +- .../FilterHandler/LessThanOrEqualHandler.php | 2 +- .../LikeHandler/BaseLikeHandler.php | 11 +++++-- .../LikeHandler/MysqlLikeHandler.php | 6 ++-- .../LikeHandler/PostgresLikeHandler.php | 6 ++-- .../LikeHandler/SqlServerLikeHandler.php | 4 +-- .../LikeHandler/SqliteLikeHandler.php | 4 +-- src/Reader/FilterHandler/NotHandler.php | 30 +++++++++---------- .../{AnyHandler.php => OrXHandler.php} | 11 ++++--- .../Base/Reader/BaseEntityReaderTestCase.php | 6 ++-- ...ase.php => BaseReaderWithAndXTestCase.php} | 6 ++-- ...Case.php => BaseReaderWithOrXTestCase.php} | 6 ++-- tests/Feature/DataTrait.php | 7 +++-- ...WithAnyTest.php => ReaderWithAndXTest.php} | 4 +-- ...rWithAllTest.php => ReaderWithOrXTest.php} | 4 +-- ...WithAnyTest.php => ReaderWithAndXTest.php} | 4 +-- ...rWithAllTest.php => ReaderWithOrXTest.php} | 4 +-- ...WithAnyTest.php => ReaderWithAndXTest.php} | 4 +-- ...rWithAllTest.php => ReaderWithOrXTest.php} | 4 +-- ...WithAnyTest.php => ReaderWithAndXTest.php} | 4 +-- ...rWithAllTest.php => ReaderWithOrXTest.php} | 4 +-- tests/Unit/Reader/EntityReaderTest.php | 1 - 30 files changed, 83 insertions(+), 77 deletions(-) rename src/Reader/FilterHandler/{AllHandler.php => AndXHandler.php} (80%) rename src/Reader/FilterHandler/{AnyHandler.php => OrXHandler.php} (81%) rename tests/Feature/Base/Reader/ReaderWithFilter/{BaseReaderWithAllTestCase.php => BaseReaderWithAndXTestCase.php} (72%) rename tests/Feature/Base/Reader/ReaderWithFilter/{BaseReaderWithAnyTestCase.php => BaseReaderWithOrXTestCase.php} (76%) rename tests/Feature/Mssql/Reader/ReaderWithFilter/{ReaderWithAnyTest.php => ReaderWithAndXTest.php} (69%) rename tests/Feature/Mssql/Reader/ReaderWithFilter/{ReaderWithAllTest.php => ReaderWithOrXTest.php} (69%) rename tests/Feature/Mysql/Reader/ReaderWithFilter/{ReaderWithAnyTest.php => ReaderWithAndXTest.php} (69%) rename tests/Feature/Mysql/Reader/ReaderWithFilter/{ReaderWithAllTest.php => ReaderWithOrXTest.php} (69%) rename tests/Feature/Pgsql/Reader/ReaderWithFilter/{ReaderWithAnyTest.php => ReaderWithAndXTest.php} (69%) rename tests/Feature/Pgsql/Reader/ReaderWithFilter/{ReaderWithAllTest.php => ReaderWithOrXTest.php} (69%) rename tests/Feature/Sqlite/Reader/ReaderWithFilter/{ReaderWithAnyTest.php => ReaderWithAndXTest.php} (69%) rename tests/Feature/Sqlite/Reader/ReaderWithFilter/{ReaderWithAllTest.php => ReaderWithOrXTest.php} (69%) diff --git a/src/Reader/EntityReader.php b/src/Reader/EntityReader.php index c80f0c6..04ba8d0 100644 --- a/src/Reader/EntityReader.php +++ b/src/Reader/EntityReader.php @@ -55,8 +55,8 @@ public function __construct(Select|SelectQuery $query) */ $likeHandler = LikeHandlerFactory::getLikeHandler($this->query->getDriver()?->getType() ?? 'SQLite'); $this->setFilterHandlers( - new FilterHandler\AllHandler(), - new FilterHandler\AnyHandler(), + new FilterHandler\AndXHandler(), + new FilterHandler\OrXHandler(), new FilterHandler\BetweenHandler(), new FilterHandler\EqualsHandler(), new FilterHandler\EqualsNullHandler(), diff --git a/src/Reader/FilterHandler/AllHandler.php b/src/Reader/FilterHandler/AndXHandler.php similarity index 80% rename from src/Reader/FilterHandler/AllHandler.php rename to src/Reader/FilterHandler/AndXHandler.php index 9a3a16a..270c90d 100644 --- a/src/Reader/FilterHandler/AllHandler.php +++ b/src/Reader/FilterHandler/AndXHandler.php @@ -8,23 +8,23 @@ use Yiisoft\Data\Cycle\Exception\NotSupportedFilterException; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\All; +use Yiisoft\Data\Reader\Filter\AndX; use Yiisoft\Data\Reader\FilterHandlerInterface; use Yiisoft\Data\Reader\FilterInterface; -final class AllHandler implements QueryBuilderFilterHandler, FilterHandlerInterface +final class AndXHandler implements QueryBuilderFilterHandler, FilterHandlerInterface { public function getFilterClass(): string { - return All::class; + return AndX::class; } public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { - /** @var All $filter */ - + /** @var AndX $filter */ return [ static function (QueryBuilder $select) use ($filter, $handlers) { - foreach ($filter->getFilters() as $subFilter) { + foreach ($filter->filters as $subFilter) { $handler = $handlers[$subFilter::class] ?? null; if ($handler === null) { throw new NotSupportedFilterException($subFilter::class); diff --git a/src/Reader/FilterHandler/BetweenHandler.php b/src/Reader/FilterHandler/BetweenHandler.php index 4afea6a..b2fbf4b 100644 --- a/src/Reader/FilterHandler/BetweenHandler.php +++ b/src/Reader/FilterHandler/BetweenHandler.php @@ -20,6 +20,6 @@ public function getAsWhereArguments(FilterInterface $filter, array $handlers): a { /** @var Between $filter */ - return [$filter->getField(), 'between', $filter->getMinValue(), $filter->getMaxValue()]; + return [$filter->field, 'between', $filter->minValue, $filter->maxValue]; } } diff --git a/src/Reader/FilterHandler/EqualsHandler.php b/src/Reader/FilterHandler/EqualsHandler.php index d034a10..89eef2f 100644 --- a/src/Reader/FilterHandler/EqualsHandler.php +++ b/src/Reader/FilterHandler/EqualsHandler.php @@ -20,6 +20,6 @@ public function getAsWhereArguments(FilterInterface $filter, array $handlers): a { /** @var Equals $filter */ - return [$filter->getField(), '=', $filter->getValue()]; + return [$filter->field, '=', $filter->value]; } } diff --git a/src/Reader/FilterHandler/EqualsNullHandler.php b/src/Reader/FilterHandler/EqualsNullHandler.php index 8f97665..f377e5a 100644 --- a/src/Reader/FilterHandler/EqualsNullHandler.php +++ b/src/Reader/FilterHandler/EqualsNullHandler.php @@ -20,6 +20,6 @@ public function getAsWhereArguments(FilterInterface $filter, array $handlers): a { /** @var EqualsNull $filter */ - return [$filter->getField(), '=', null]; + return [$filter->field, '=', null]; } } diff --git a/src/Reader/FilterHandler/GreaterThanHandler.php b/src/Reader/FilterHandler/GreaterThanHandler.php index d7283a3..edc0a6c 100644 --- a/src/Reader/FilterHandler/GreaterThanHandler.php +++ b/src/Reader/FilterHandler/GreaterThanHandler.php @@ -20,6 +20,6 @@ public function getAsWhereArguments(FilterInterface $filter, array $handlers): a { /** @var GreaterThan $filter */ - return [$filter->getField(), '>', $filter->getValue()]; + return [$filter->field, '>', $filter->value]; } } diff --git a/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php b/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php index 53b1776..fb4c040 100644 --- a/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php +++ b/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php @@ -20,6 +20,6 @@ public function getAsWhereArguments(FilterInterface $filter, array $handlers): a { /** @var GreaterThanOrEqual $filter */ - return [$filter->getField(), '>=', $filter->getValue()]; + return [$filter->field, '>=', $filter->value]; } } diff --git a/src/Reader/FilterHandler/InHandler.php b/src/Reader/FilterHandler/InHandler.php index 6f44c2d..5d9063f 100644 --- a/src/Reader/FilterHandler/InHandler.php +++ b/src/Reader/FilterHandler/InHandler.php @@ -21,6 +21,6 @@ public function getAsWhereArguments(FilterInterface $filter, array $handlers): a { /** @var In $filter */ - return [$filter->getField(), 'in', new Parameter($filter->getValues())]; + return [$filter->field, 'in', new Parameter($filter->values)]; } } diff --git a/src/Reader/FilterHandler/LessThanHandler.php b/src/Reader/FilterHandler/LessThanHandler.php index a35fa86..fe5c245 100644 --- a/src/Reader/FilterHandler/LessThanHandler.php +++ b/src/Reader/FilterHandler/LessThanHandler.php @@ -20,6 +20,6 @@ public function getAsWhereArguments(FilterInterface $filter, array $handlers): a { /** @var LessThan $filter */ - return [$filter->getField(), '<', $filter->getValue()]; + return [$filter->field, '<', $filter->value]; } } diff --git a/src/Reader/FilterHandler/LessThanOrEqualHandler.php b/src/Reader/FilterHandler/LessThanOrEqualHandler.php index 22bddf9..5624537 100644 --- a/src/Reader/FilterHandler/LessThanOrEqualHandler.php +++ b/src/Reader/FilterHandler/LessThanOrEqualHandler.php @@ -20,6 +20,6 @@ public function getAsWhereArguments(FilterInterface $filter, array $handlers): a { /** @var LessThanOrEqual $filter */ - return [$filter->getField(), '<=', $filter->getValue()]; + return [$filter->field, '<=', $filter->value]; } } diff --git a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php index 1b286b2..33cea91 100644 --- a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php @@ -5,6 +5,7 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler\LikeHandler; use Yiisoft\Data\Reader\Filter\Like; +use Yiisoft\Data\Reader\Filter\LikeMode; use Yiisoft\Data\Reader\FilterHandlerInterface; abstract class BaseLikeHandler implements FilterHandlerInterface @@ -20,8 +21,14 @@ public function getFilterClass(): string return Like::class; } - protected function prepareValue(string $value): string + protected function prepareValue(string|\Stringable $value, LikeMode $mode): string { - return '%' . strtr($value, $this->escapingReplacements) . '%'; + + $value = strtr($value, $this->escapingReplacements); + return match ($mode) { + LikeMode::Contains => '%' . $value . '%', + LikeMode::StartsWith => $value . '%', + LikeMode::EndsWith => '%' . $value, + }; } } diff --git a/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php index 2150256..9a89e42 100644 --- a/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php @@ -14,10 +14,10 @@ public function getAsWhereArguments(FilterInterface $filter, array $handlers): a { /** @var Like $filter */ - if ($filter->getCaseSensitive() !== true) { - return [$filter->getField(), 'like', '%' . $this->prepareValue($filter->getValue()) . '%']; + if ($filter->caseSensitive !== true) { + return [$filter->field, 'like', $this->prepareValue($filter->value, $filter->mode)]; } - return [$filter->getField(), 'like binary', $this->prepareValue($filter->getValue())]; + return [$filter->field, 'like binary', $this->prepareValue($filter->value, $filter->mode)]; } } diff --git a/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php index 91dd8f1..88137c0 100644 --- a/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php @@ -14,10 +14,10 @@ public function getAsWhereArguments(FilterInterface $filter, array $handlers): a { /** @var Like $filter */ - if ($filter->getCaseSensitive() !== true) { - return [$filter->getField(), 'ilike', $this->prepareValue($filter->getValue())]; + if ($filter->caseSensitive !== true) { + return [$filter->field, 'ilike', $this->prepareValue($filter->value, $filter->mode)]; } - return [$filter->getField(), 'like', $this->prepareValue($filter->getValue())]; + return [$filter->field, 'like', $this->prepareValue($filter->value, $filter->mode)]; } } diff --git a/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php index 43f8b19..225c3dd 100644 --- a/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php @@ -20,10 +20,10 @@ public function getAsWhereArguments(FilterInterface $filter, array $handlers): a { /** @var Like $filter */ - if ($filter->getCaseSensitive() === true) { + if ($filter->caseSensitive === true) { throw new NotSupportedFilterOptionException(optionName: 'caseSensitive', driverType: 'SQLServer'); } - return [$filter->getField(), 'like', $this->prepareValue($filter->getValue())]; + return [$filter->field, 'like', $this->prepareValue($filter->value, $filter->mode)]; } } diff --git a/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php index 7d51508..6cc7419 100644 --- a/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php @@ -20,10 +20,10 @@ public function getAsWhereArguments(FilterInterface $filter, array $handlers): a { /** @var Like $filter */ - if ($filter->getCaseSensitive() === true) { + if ($filter->caseSensitive === true) { throw new NotSupportedFilterOptionException(optionName: 'caseSensitive', driverType: 'SQLite'); } - return [$filter->getField(), 'like', $this->prepareValue($filter->getValue())]; + return [$filter->field, 'like', $this->prepareValue($filter->value, $filter->mode)]; } } diff --git a/src/Reader/FilterHandler/NotHandler.php b/src/Reader/FilterHandler/NotHandler.php index bfdac36..4f72b37 100644 --- a/src/Reader/FilterHandler/NotHandler.php +++ b/src/Reader/FilterHandler/NotHandler.php @@ -6,8 +6,7 @@ use Yiisoft\Data\Cycle\Exception\NotSupportedFilterException; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; -use Yiisoft\Data\Reader\Filter\All; -use Yiisoft\Data\Reader\Filter\Any; +use Yiisoft\Data\Reader\Filter\AndX; use Yiisoft\Data\Reader\Filter\Between; use Yiisoft\Data\Reader\Filter\Equals; use Yiisoft\Data\Reader\Filter\EqualsNull; @@ -18,6 +17,7 @@ use Yiisoft\Data\Reader\Filter\LessThanOrEqual; use Yiisoft\Data\Reader\Filter\Like; use Yiisoft\Data\Reader\Filter\Not; +use Yiisoft\Data\Reader\Filter\OrX; use Yiisoft\Data\Reader\FilterHandlerInterface; use Yiisoft\Data\Reader\FilterInterface; @@ -32,8 +32,8 @@ public function getAsWhereArguments(FilterInterface $filter, array $handlers): a { /** @var Not $filter */ - $convertedFilter = $this->convertFilter($filter->getFilter()); - $handledFilter = $convertedFilter instanceof Not ? $convertedFilter->getFilter() : $convertedFilter; + $convertedFilter = $this->convertFilter($filter->filter); + $handledFilter = $convertedFilter instanceof Not ? $convertedFilter->filter : $convertedFilter; $handler = $handlers[$handledFilter::class] ?? null; if ($handler === null) { throw new NotSupportedFilterException($handledFilter::class); @@ -59,22 +59,22 @@ private function convertFilter(FilterInterface $filter, int $notCount = 1): Filt $handler = $this; return match ($filter::class) { - All::class => new Any( + AndX::class => new OrX( ...array_map( static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), - $filter->getFilters(), + $filter->filters, ), ), - Any::class => new All( + OrX::class => new AndX( ...array_map( static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), - $filter->getFilters(), + $filter->filters, ), ), - GreaterThan::class => new LessThanOrEqual($filter->getField(), $filter->getValue()), - GreaterThanOrEqual::class => new LessThan($filter->getField(), $filter->getValue()), - LessThan::class => new GreaterThanOrEqual($filter->getField(), $filter->getValue()), - LessThanOrEqual::class => new GreaterThan($filter->getField(), $filter->getValue()), + GreaterThan::class => new LessThanOrEqual($filter->field, $filter->value), + GreaterThanOrEqual::class => new LessThan($filter->field, $filter->value), + LessThan::class => new GreaterThanOrEqual($filter->field, $filter->value), + LessThanOrEqual::class => new GreaterThan($filter->field, $filter->value), Between::class, Equals::class, EqualsNull::class, In::class, Like::class => new Not($filter), Not::class => $this->convertNot($filter, $notCount), default => $filter, @@ -85,10 +85,10 @@ private function convertNot(Not $filter, int $notCount): FilterInterface { $notCount++; - if ($filter->getFilter() instanceof Not) { - return $this->convertFilter($filter->getFilter(), $notCount); + if ($filter->filter instanceof Not) { + return $this->convertFilter($filter->filter, $notCount); } - return $notCount % 2 === 1 ? new Not($filter->getFilter()) : $filter->getFilter(); + return $notCount % 2 === 1 ? new Not($filter->filter) : $filter->filter; } } diff --git a/src/Reader/FilterHandler/AnyHandler.php b/src/Reader/FilterHandler/OrXHandler.php similarity index 81% rename from src/Reader/FilterHandler/AnyHandler.php rename to src/Reader/FilterHandler/OrXHandler.php index 5668951..d8bef15 100644 --- a/src/Reader/FilterHandler/AnyHandler.php +++ b/src/Reader/FilterHandler/OrXHandler.php @@ -7,24 +7,23 @@ use Cycle\ORM\Select\QueryBuilder; use Yiisoft\Data\Cycle\Exception\NotSupportedFilterException; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; -use Yiisoft\Data\Reader\Filter\Any; +use Yiisoft\Data\Reader\Filter\OrX; use Yiisoft\Data\Reader\FilterHandlerInterface; use Yiisoft\Data\Reader\FilterInterface; -final class AnyHandler implements QueryBuilderFilterHandler, FilterHandlerInterface +final class OrXHandler implements QueryBuilderFilterHandler, FilterHandlerInterface { public function getFilterClass(): string { - return Any::class; + return OrX::class; } public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { - /** @var Any $filter */ - + /** @var OrX $filter */ return [ static function (QueryBuilder $select) use ($filter, $handlers) { - foreach ($filter->getFilters() as $subFilter) { + foreach ($filter->filters as $subFilter) { $handler = $handlers[$subFilter::class] ?? null; if ($handler === null) { throw new NotSupportedFilterException($subFilter::class); diff --git a/tests/Feature/Base/Reader/BaseEntityReaderTestCase.php b/tests/Feature/Base/Reader/BaseEntityReaderTestCase.php index 45b01a2..b1578d0 100644 --- a/tests/Feature/Base/Reader/BaseEntityReaderTestCase.php +++ b/tests/Feature/Base/Reader/BaseEntityReaderTestCase.php @@ -36,7 +36,6 @@ public function testReadOneFromItemsCache(): void $reader = (new EntityReader($this->select('user')))->withLimit(3); $ref = (new \ReflectionProperty($reader, 'itemsCache')); - $ref->setAccessible(true); self::assertFalse($ref->getValue($reader)->isCollected()); $reader->read(); @@ -53,7 +52,6 @@ public function testGetIterator(): void $this->assertFixtures([0], [\iterator_to_array($reader->getIterator())[0]]); $ref = (new \ReflectionProperty($reader, 'itemsCache')); - $ref->setAccessible(true); $cache = new CachedCollection(); $cache->setCollection([['foo' => 'bar']]); @@ -96,7 +94,7 @@ public function testCount(): void { $reader = new EntityReader($this->select('user')); - self::assertSame(count(self::$fixtures), $reader->count()); + self::assertSame(count($this->getFixtures()), $reader->count()); } /** @@ -108,7 +106,7 @@ public function testCountWithLimit(): void $this->select('user'), ))->withLimit(1); - self::assertSame(count(self::$fixtures), $reader->count()); + self::assertSame(count($this->getFixtures()), $reader->count()); } public function testCountWithFilter(): void diff --git a/tests/Feature/Base/Reader/ReaderWithFilter/BaseReaderWithAllTestCase.php b/tests/Feature/Base/Reader/ReaderWithFilter/BaseReaderWithAndXTestCase.php similarity index 72% rename from tests/Feature/Base/Reader/ReaderWithFilter/BaseReaderWithAllTestCase.php rename to tests/Feature/Base/Reader/ReaderWithFilter/BaseReaderWithAndXTestCase.php index f9a32bf..2041ce4 100644 --- a/tests/Feature/Base/Reader/ReaderWithFilter/BaseReaderWithAllTestCase.php +++ b/tests/Feature/Base/Reader/ReaderWithFilter/BaseReaderWithAndXTestCase.php @@ -8,10 +8,10 @@ use Yiisoft\Data\Cycle\Reader\EntityReader; use Yiisoft\Data\Cycle\Tests\Feature\DataTrait; use Yiisoft\Data\Cycle\Tests\Support\NotSupportedFilter; -use Yiisoft\Data\Reader\Filter\All; +use Yiisoft\Data\Reader\Filter\AndX; use Yiisoft\Data\Reader\Filter\Equals; -abstract class BaseReaderWithAllTestCase extends \Yiisoft\Data\Tests\Common\Reader\ReaderWithFilter\BaseReaderWithAllTestCase +abstract class BaseReaderWithAndXTestCase extends \Yiisoft\Data\Tests\Common\Reader\ReaderWithFilter\BaseReaderWithAndXTestCase { use DataTrait; @@ -22,7 +22,7 @@ public function testNotSupportedFilterException(): void $this->expectException(NotSupportedFilterException::class); $this->expectExceptionMessage(sprintf('Filter "%s" is not supported.', NotSupportedFilter::class)); $reader->withFilter( - new All(new Equals('balance', '100.0'), new NotSupportedFilter(), new Equals('email', 'seed@beat')), + new AndX(new Equals('balance', '100.0'), new NotSupportedFilter(), new Equals('email', 'seed@beat')), ); } } diff --git a/tests/Feature/Base/Reader/ReaderWithFilter/BaseReaderWithAnyTestCase.php b/tests/Feature/Base/Reader/ReaderWithFilter/BaseReaderWithOrXTestCase.php similarity index 76% rename from tests/Feature/Base/Reader/ReaderWithFilter/BaseReaderWithAnyTestCase.php rename to tests/Feature/Base/Reader/ReaderWithFilter/BaseReaderWithOrXTestCase.php index eca91db..d618c83 100644 --- a/tests/Feature/Base/Reader/ReaderWithFilter/BaseReaderWithAnyTestCase.php +++ b/tests/Feature/Base/Reader/ReaderWithFilter/BaseReaderWithOrXTestCase.php @@ -8,10 +8,10 @@ use Yiisoft\Data\Cycle\Reader\EntityReader; use Yiisoft\Data\Cycle\Tests\Feature\DataTrait; use Yiisoft\Data\Cycle\Tests\Support\NotSupportedFilter; -use Yiisoft\Data\Reader\Filter\Any; use Yiisoft\Data\Reader\Filter\Equals; +use Yiisoft\Data\Reader\Filter\OrX; -abstract class BaseReaderWithAnyTestCase extends \Yiisoft\Data\Tests\Common\Reader\ReaderWithFilter\BaseReaderWithAnyTestCase +abstract class BaseReaderWithOrXTestCase extends \Yiisoft\Data\Tests\Common\Reader\ReaderWithFilter\BaseReaderWithOrXTestCase { use DataTrait; @@ -21,6 +21,6 @@ public function testNotsupportedFilterException(): void $this->expectException(NotSupportedFilterException::class); $this->expectExceptionMessage(sprintf('Filter "%s" is not supported.', NotSupportedFilter::class)); - $reader->withFilter(new Any(new Equals('number', 2), new NotSupportedFilter(), new Equals('number', 3))); + $reader->withFilter(new OrX(new Equals('number', 2), new NotSupportedFilter(), new Equals('number', 3))); } } diff --git a/tests/Feature/DataTrait.php b/tests/Feature/DataTrait.php index 2d86eeb..092921b 100644 --- a/tests/Feature/DataTrait.php +++ b/tests/Feature/DataTrait.php @@ -150,7 +150,7 @@ protected function fillFixtures(): void $user->column('born_at')->date()->nullable(); $user->save(); - $fixtures = static::$fixtures; + $fixtures = $this->getFixtures(); foreach ($fixtures as $index => $fixture) { $fixtures[$index]['balance'] = (string) $fixtures[$index]['balance']; } @@ -205,6 +205,7 @@ private function createSchema(): SchemaInterface 'id' => 'int', 'number' => 'int', 'balance' => 'float', + 'born_at' => 'datetime' ], SchemaInterface::RELATIONS => [], ], @@ -238,7 +239,9 @@ protected function assertFixtures(array $expectedFixtureIndexes, array $actualFi $expectedFixtures = []; foreach ($expectedFixtureIndexes as $index) { - $expectedFixtures[$index] = $this->getFixture($index); + $expectedFixture = $this->getFixture($index); + $expectedFixture['born_at'] = json_decode(json_encode($expectedFixture['born_at']), associative: true); + $expectedFixtures[$index] = $expectedFixture; } $this->assertSame($expectedFixtures, $processedActualFixtures); diff --git a/tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithAnyTest.php b/tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithAndXTest.php similarity index 69% rename from tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithAnyTest.php rename to tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithAndXTest.php index e8e5699..95a0214 100644 --- a/tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithAnyTest.php +++ b/tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithAndXTest.php @@ -4,9 +4,9 @@ namespace Yiisoft\Data\Cycle\Tests\Feature\Mssql\Reader\ReaderWithFilter; -use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithAnyTestCase; +use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithAndXTestCase; -final class ReaderWithAnyTest extends BaseReaderWithAnyTestCase +final class ReaderWithAndXTest extends BaseReaderWithAndXTestCase { public static $DRIVER = 'mssql'; } diff --git a/tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithAllTest.php b/tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithOrXTest.php similarity index 69% rename from tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithAllTest.php rename to tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithOrXTest.php index 59a912d..3e93d50 100644 --- a/tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithAllTest.php +++ b/tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithOrXTest.php @@ -4,9 +4,9 @@ namespace Yiisoft\Data\Cycle\Tests\Feature\Mssql\Reader\ReaderWithFilter; -use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithAllTestCase; +use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithOrXTestCase; -final class ReaderWithAllTest extends BaseReaderWithAllTestCase +final class ReaderWithOrXTest extends BaseReaderWithOrXTestCase { public static $DRIVER = 'mssql'; } diff --git a/tests/Feature/Mysql/Reader/ReaderWithFilter/ReaderWithAnyTest.php b/tests/Feature/Mysql/Reader/ReaderWithFilter/ReaderWithAndXTest.php similarity index 69% rename from tests/Feature/Mysql/Reader/ReaderWithFilter/ReaderWithAnyTest.php rename to tests/Feature/Mysql/Reader/ReaderWithFilter/ReaderWithAndXTest.php index 606777a..85b323e 100644 --- a/tests/Feature/Mysql/Reader/ReaderWithFilter/ReaderWithAnyTest.php +++ b/tests/Feature/Mysql/Reader/ReaderWithFilter/ReaderWithAndXTest.php @@ -4,9 +4,9 @@ namespace Yiisoft\Data\Cycle\Tests\Feature\Mysql\Reader\ReaderWithFilter; -use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithAnyTestCase; +use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithAndXTestCase; -final class ReaderWithAnyTest extends BaseReaderWithAnyTestCase +final class ReaderWithAndXTest extends BaseReaderWithAndXTestCase { public static $DRIVER = 'mysql'; } diff --git a/tests/Feature/Mysql/Reader/ReaderWithFilter/ReaderWithAllTest.php b/tests/Feature/Mysql/Reader/ReaderWithFilter/ReaderWithOrXTest.php similarity index 69% rename from tests/Feature/Mysql/Reader/ReaderWithFilter/ReaderWithAllTest.php rename to tests/Feature/Mysql/Reader/ReaderWithFilter/ReaderWithOrXTest.php index 8a5cbf7..a340ed9 100644 --- a/tests/Feature/Mysql/Reader/ReaderWithFilter/ReaderWithAllTest.php +++ b/tests/Feature/Mysql/Reader/ReaderWithFilter/ReaderWithOrXTest.php @@ -4,9 +4,9 @@ namespace Yiisoft\Data\Cycle\Tests\Feature\Mysql\Reader\ReaderWithFilter; -use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithAllTestCase; +use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithOrXTestCase; -final class ReaderWithAllTest extends BaseReaderWithAllTestCase +final class ReaderWithOrXTest extends BaseReaderWithOrXTestCase { public static $DRIVER = 'mysql'; } diff --git a/tests/Feature/Pgsql/Reader/ReaderWithFilter/ReaderWithAnyTest.php b/tests/Feature/Pgsql/Reader/ReaderWithFilter/ReaderWithAndXTest.php similarity index 69% rename from tests/Feature/Pgsql/Reader/ReaderWithFilter/ReaderWithAnyTest.php rename to tests/Feature/Pgsql/Reader/ReaderWithFilter/ReaderWithAndXTest.php index 31f6a4e..5732c9a 100644 --- a/tests/Feature/Pgsql/Reader/ReaderWithFilter/ReaderWithAnyTest.php +++ b/tests/Feature/Pgsql/Reader/ReaderWithFilter/ReaderWithAndXTest.php @@ -4,9 +4,9 @@ namespace Yiisoft\Data\Cycle\Tests\Feature\Pgsql\Reader\ReaderWithFilter; -use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithAnyTestCase; +use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithAndXTestCase; -final class ReaderWithAnyTest extends BaseReaderWithAnyTestCase +final class ReaderWithAndXTest extends BaseReaderWithAndXTestCase { public static $DRIVER = 'pgsql'; } diff --git a/tests/Feature/Pgsql/Reader/ReaderWithFilter/ReaderWithAllTest.php b/tests/Feature/Pgsql/Reader/ReaderWithFilter/ReaderWithOrXTest.php similarity index 69% rename from tests/Feature/Pgsql/Reader/ReaderWithFilter/ReaderWithAllTest.php rename to tests/Feature/Pgsql/Reader/ReaderWithFilter/ReaderWithOrXTest.php index 1c166a6..51f9540 100644 --- a/tests/Feature/Pgsql/Reader/ReaderWithFilter/ReaderWithAllTest.php +++ b/tests/Feature/Pgsql/Reader/ReaderWithFilter/ReaderWithOrXTest.php @@ -4,9 +4,9 @@ namespace Yiisoft\Data\Cycle\Tests\Feature\Pgsql\Reader\ReaderWithFilter; -use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithAllTestCase; +use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithOrXTestCase; -final class ReaderWithAllTest extends BaseReaderWithAllTestCase +final class ReaderWithOrXTest extends BaseReaderWithOrXTestCase { public static $DRIVER = 'pgsql'; } diff --git a/tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithAnyTest.php b/tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithAndXTest.php similarity index 69% rename from tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithAnyTest.php rename to tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithAndXTest.php index f7ca9c9..f227abf 100644 --- a/tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithAnyTest.php +++ b/tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithAndXTest.php @@ -4,9 +4,9 @@ namespace Yiisoft\Data\Cycle\Tests\Feature\Sqlite\Reader\ReaderWithFilter; -use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithAnyTestCase; +use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithAndXTestCase; -final class ReaderWithAnyTest extends BaseReaderWithAnyTestCase +final class ReaderWithAndXTest extends BaseReaderWithAndXTestCase { public static $DRIVER = 'sqlite'; } diff --git a/tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithAllTest.php b/tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithOrXTest.php similarity index 69% rename from tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithAllTest.php rename to tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithOrXTest.php index 382b299..7a7e2b7 100644 --- a/tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithAllTest.php +++ b/tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithOrXTest.php @@ -4,9 +4,9 @@ namespace Yiisoft\Data\Cycle\Tests\Feature\Sqlite\Reader\ReaderWithFilter; -use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithAllTestCase; +use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithOrXTestCase; -final class ReaderWithAllTest extends BaseReaderWithAllTestCase +final class ReaderWithOrXTest extends BaseReaderWithOrXTestCase { public static $DRIVER = 'sqlite'; } diff --git a/tests/Unit/Reader/EntityReaderTest.php b/tests/Unit/Reader/EntityReaderTest.php index 10d0238..ae0c831 100644 --- a/tests/Unit/Reader/EntityReaderTest.php +++ b/tests/Unit/Reader/EntityReaderTest.php @@ -16,7 +16,6 @@ public function testNormalizeSortingCriteria(): void $reader = new EntityReader($this->createMock(SelectQuery::class)); $ref = new \ReflectionMethod($reader, 'normalizeSortingCriteria'); - $ref->setAccessible(true); $this->assertSame( ['number' => 'ASC', 'name' => 'DESC', 'email' => 'ASC'], From 05507c3821d0f4675d7f03e058e453d2f2af5147 Mon Sep 17 00:00:00 2001 From: Mahmud Date: Thu, 25 Sep 2025 07:34:42 +0300 Subject: [PATCH 2/9] Add All and None handlers and remove nullable types --- composer.json | 2 +- src/Reader/EntityReader.php | 37 +++++++++++++++---- src/Reader/FilterHandler/AllHandler.php | 32 ++++++++++++++++ src/Reader/FilterHandler/AndXHandler.php | 2 + src/Reader/FilterHandler/BetweenHandler.php | 2 + src/Reader/FilterHandler/EqualsHandler.php | 2 + .../FilterHandler/EqualsNullHandler.php | 2 + .../FilterHandler/GreaterThanHandler.php | 2 + .../GreaterThanOrEqualHandler.php | 2 + src/Reader/FilterHandler/InHandler.php | 2 + src/Reader/FilterHandler/LessThanHandler.php | 2 + .../FilterHandler/LessThanOrEqualHandler.php | 2 + .../LikeHandler/BaseLikeHandler.php | 1 + .../LikeHandler/MysqlLikeHandler.php | 1 + .../LikeHandler/PostgresLikeHandler.php | 1 + .../LikeHandler/SqlServerLikeHandler.php | 1 + .../LikeHandler/SqliteLikeHandler.php | 1 + src/Reader/FilterHandler/NoneHandler.php | 32 ++++++++++++++++ src/Reader/FilterHandler/NotHandler.php | 2 + src/Reader/FilterHandler/OrXHandler.php | 2 + src/Writer/EntityWriter.php | 2 + .../BaseReaderWithAllTestCase.php | 12 ++++++ .../BaseReaderWithNoneTestCase.php | 12 ++++++ .../ReaderWithFilter/ReaderWithAllTest.php | 12 ++++++ .../ReaderWithFilter/ReaderWithNoneTest.php | 12 ++++++ .../ReaderWithFilter/ReaderWithAllTest.php | 12 ++++++ .../ReaderWithFilter/ReaderWithNoneTest.php | 12 ++++++ .../ReaderWithFilter/ReaderWithAllTest.php | 12 ++++++ .../ReaderWithFilter/ReaderWithNoneTest.php | 12 ++++++ .../ReaderWithFilter/ReaderWithAllTest.php | 12 ++++++ .../ReaderWithFilter/ReaderWithNoneTest.php | 12 ++++++ 31 files changed, 243 insertions(+), 9 deletions(-) create mode 100644 src/Reader/FilterHandler/AllHandler.php create mode 100644 src/Reader/FilterHandler/NoneHandler.php create mode 100644 tests/Feature/Base/Reader/ReaderWithFilter/BaseReaderWithAllTestCase.php create mode 100644 tests/Feature/Base/Reader/ReaderWithFilter/BaseReaderWithNoneTestCase.php create mode 100644 tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithAllTest.php create mode 100644 tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithNoneTest.php create mode 100644 tests/Feature/Mysql/Reader/ReaderWithFilter/ReaderWithAllTest.php create mode 100644 tests/Feature/Mysql/Reader/ReaderWithFilter/ReaderWithNoneTest.php create mode 100644 tests/Feature/Pgsql/Reader/ReaderWithFilter/ReaderWithAllTest.php create mode 100644 tests/Feature/Pgsql/Reader/ReaderWithFilter/ReaderWithNoneTest.php create mode 100644 tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithAllTest.php create mode 100644 tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithNoneTest.php diff --git a/composer.json b/composer.json index e7cc165..505b612 100644 --- a/composer.json +++ b/composer.json @@ -44,7 +44,7 @@ "rector/rector": "^2.1.5", "roave/infection-static-analysis-plugin": "^1.35", "spatie/phpunit-watcher": "^1.24", - "vimeo/psalm": "^5.26", + "vimeo/psalm": "^5.26.1 || ^6.10.3", "vlucas/phpdotenv": "^5.6" }, "autoload": { diff --git a/src/Reader/EntityReader.php b/src/Reader/EntityReader.php index 04ba8d0..16c31a9 100644 --- a/src/Reader/EntityReader.php +++ b/src/Reader/EntityReader.php @@ -13,6 +13,7 @@ use Yiisoft\Data\Cycle\Exception\NotSupportedFilterException; use Yiisoft\Data\Cycle\Reader\FilterHandler\LikeHandler\LikeHandlerFactory; use Yiisoft\Data\Reader\DataReaderInterface; +use Yiisoft\Data\Reader\Filter\All; use Yiisoft\Data\Reader\FilterHandlerInterface; use Yiisoft\Data\Reader\FilterInterface; use Yiisoft\Data\Reader\Sort; @@ -34,7 +35,7 @@ final class EntityReader implements DataReaderInterface private ?int $limit = null; private int $offset = 0; private ?Sort $sorting = null; - private ?FilterInterface $filter = null; + private FilterInterface $filter; private CachedCount $countCache; private CachedCollection $itemsCache; private CachedCollection $oneItemCache; @@ -55,6 +56,8 @@ public function __construct(Select|SelectQuery $query) */ $likeHandler = LikeHandlerFactory::getLikeHandler($this->query->getDriver()?->getType() ?? 'SQLite'); $this->setFilterHandlers( + new FilterHandler\AllHandler(), + new FilterHandler\NoneHandler(), new FilterHandler\AndXHandler(), new FilterHandler\OrXHandler(), new FilterHandler\BetweenHandler(), @@ -68,8 +71,11 @@ public function __construct(Select|SelectQuery $query) $likeHandler, new FilterHandler\NotHandler(), ); + + $this->filter = new All(); } + #[\Override] public function getSort(): ?Sort { return $this->sorting; @@ -78,6 +84,7 @@ public function getSort(): ?Sort /** * @psalm-mutation-free */ + #[\Override] public function withLimit(?int $limit): static { /** @psalm-suppress DocblockTypeContradiction */ @@ -95,6 +102,7 @@ public function withLimit(?int $limit): static /** * @psalm-mutation-free */ + #[\Override] public function withOffset(int $offset): static { $new = clone $this; @@ -108,6 +116,7 @@ public function withOffset(int $offset): static /** * @psalm-mutation-free */ + #[\Override] public function withSort(?Sort $sort): static { $new = clone $this; @@ -122,7 +131,8 @@ public function withSort(?Sort $sort): static /** * @psalm-mutation-free */ - public function withFilter(?FilterInterface $filter): static + #[\Override] + public function withFilter(FilterInterface $filter): static { $new = clone $this; if ($new->filter !== $filter) { @@ -138,6 +148,7 @@ public function withFilter(?FilterInterface $filter): static /** * @psalm-mutation-free */ + #[\Override] public function withAddedFilterHandlers(FilterHandlerInterface ...$filterHandlers): static { $new = clone $this; @@ -150,11 +161,13 @@ public function withAddedFilterHandlers(FilterHandlerInterface ...$filterHandler return $new; } + #[\Override] public function count(): int { return $this->countCache->getCount(); } + #[\Override] public function read(): iterable { if ($this->itemsCache->getCollection() === null) { @@ -164,6 +177,7 @@ public function read(): iterable return $this->itemsCache->getCollection(); } + #[\Override] public function readOne(): null|array|object { if (!$this->oneItemCache->isCollected()) { @@ -181,6 +195,7 @@ public function readOne(): null|array|object /** * Get Iterator without caching */ + #[\Override] public function getIterator(): Generator { yield from $this->itemsCache->getCollection() ?? $this->buildSelectQuery()->getIterator(); @@ -215,9 +230,13 @@ private function buildSelectQuery(): SelectQuery|Select if ($this->limit !== null) { $newQuery->limit($this->limit); } - if ($this->filter !== null) { - $newQuery->andWhere($this->makeFilterClosure($this->filter)); + + if ($this->filter instanceof All) { + return $newQuery; } + + $newQuery->andWhere($this->makeFilterClosure($this->filter)); + return $newQuery; } @@ -235,9 +254,8 @@ private function makeFilterClosure(FilterInterface $filter): Closure private function resetCountCache(): void { $newQuery = clone $this->query; - if ($this->filter !== null) { - $newQuery->andWhere($this->makeFilterClosure($this->filter)); - } + $newQuery->andWhere($this->makeFilterClosure($this->filter)); + $this->countCache = new CachedCount($newQuery); } @@ -256,16 +274,19 @@ private function normalizeSortingCriteria(array $criteria): array return $criteria; } - public function getFilter(): ?FilterInterface + #[\Override] + public function getFilter(): FilterInterface { return $this->filter; } + #[\Override] public function getLimit(): ?int { return $this->limit; } + #[\Override] public function getOffset(): int { return $this->offset; diff --git a/src/Reader/FilterHandler/AllHandler.php b/src/Reader/FilterHandler/AllHandler.php new file mode 100644 index 0000000..dc2496a --- /dev/null +++ b/src/Reader/FilterHandler/AllHandler.php @@ -0,0 +1,32 @@ +where(new Expression('1'), new Expression('1')); + }, + ]; + } +} diff --git a/src/Reader/FilterHandler/AndXHandler.php b/src/Reader/FilterHandler/AndXHandler.php index 270c90d..a6e50b3 100644 --- a/src/Reader/FilterHandler/AndXHandler.php +++ b/src/Reader/FilterHandler/AndXHandler.php @@ -14,11 +14,13 @@ final class AndXHandler implements QueryBuilderFilterHandler, FilterHandlerInterface { + #[\Override] public function getFilterClass(): string { return AndX::class; } + #[\Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var AndX $filter */ diff --git a/src/Reader/FilterHandler/BetweenHandler.php b/src/Reader/FilterHandler/BetweenHandler.php index b2fbf4b..3b739e5 100644 --- a/src/Reader/FilterHandler/BetweenHandler.php +++ b/src/Reader/FilterHandler/BetweenHandler.php @@ -11,11 +11,13 @@ final class BetweenHandler implements QueryBuilderFilterHandler, FilterHandlerInterface { + #[\Override] public function getFilterClass(): string { return Between::class; } + #[\Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Between $filter */ diff --git a/src/Reader/FilterHandler/EqualsHandler.php b/src/Reader/FilterHandler/EqualsHandler.php index 89eef2f..933be1a 100644 --- a/src/Reader/FilterHandler/EqualsHandler.php +++ b/src/Reader/FilterHandler/EqualsHandler.php @@ -11,11 +11,13 @@ final class EqualsHandler implements QueryBuilderFilterHandler, FilterHandlerInterface { + #[\Override] public function getFilterClass(): string { return Equals::class; } + #[\Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Equals $filter */ diff --git a/src/Reader/FilterHandler/EqualsNullHandler.php b/src/Reader/FilterHandler/EqualsNullHandler.php index f377e5a..7c8f469 100644 --- a/src/Reader/FilterHandler/EqualsNullHandler.php +++ b/src/Reader/FilterHandler/EqualsNullHandler.php @@ -11,11 +11,13 @@ final class EqualsNullHandler implements QueryBuilderFilterHandler, FilterHandlerInterface { + #[\Override] public function getFilterClass(): string { return EqualsNull::class; } + #[\Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var EqualsNull $filter */ diff --git a/src/Reader/FilterHandler/GreaterThanHandler.php b/src/Reader/FilterHandler/GreaterThanHandler.php index edc0a6c..f152e3f 100644 --- a/src/Reader/FilterHandler/GreaterThanHandler.php +++ b/src/Reader/FilterHandler/GreaterThanHandler.php @@ -11,11 +11,13 @@ final class GreaterThanHandler implements QueryBuilderFilterHandler, FilterHandlerInterface { + #[\Override] public function getFilterClass(): string { return GreaterThan::class; } + #[\Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var GreaterThan $filter */ diff --git a/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php b/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php index fb4c040..ee3c6ce 100644 --- a/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php +++ b/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php @@ -11,11 +11,13 @@ final class GreaterThanOrEqualHandler implements QueryBuilderFilterHandler, FilterHandlerInterface { + #[\Override] public function getFilterClass(): string { return GreaterThanOrEqual::class; } + #[\Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var GreaterThanOrEqual $filter */ diff --git a/src/Reader/FilterHandler/InHandler.php b/src/Reader/FilterHandler/InHandler.php index 5d9063f..3ed693d 100644 --- a/src/Reader/FilterHandler/InHandler.php +++ b/src/Reader/FilterHandler/InHandler.php @@ -12,11 +12,13 @@ final class InHandler implements QueryBuilderFilterHandler, FilterHandlerInterface { + #[\Override] public function getFilterClass(): string { return In::class; } + #[\Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var In $filter */ diff --git a/src/Reader/FilterHandler/LessThanHandler.php b/src/Reader/FilterHandler/LessThanHandler.php index fe5c245..3ee5997 100644 --- a/src/Reader/FilterHandler/LessThanHandler.php +++ b/src/Reader/FilterHandler/LessThanHandler.php @@ -11,11 +11,13 @@ final class LessThanHandler implements QueryBuilderFilterHandler, FilterHandlerInterface { + #[\Override] public function getFilterClass(): string { return LessThan::class; } + #[\Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var LessThan $filter */ diff --git a/src/Reader/FilterHandler/LessThanOrEqualHandler.php b/src/Reader/FilterHandler/LessThanOrEqualHandler.php index 5624537..a5948ad 100644 --- a/src/Reader/FilterHandler/LessThanOrEqualHandler.php +++ b/src/Reader/FilterHandler/LessThanOrEqualHandler.php @@ -11,11 +11,13 @@ final class LessThanOrEqualHandler implements QueryBuilderFilterHandler, FilterHandlerInterface { + #[\Override] public function getFilterClass(): string { return LessThanOrEqual::class; } + #[\Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var LessThanOrEqual $filter */ diff --git a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php index 33cea91..fee202a 100644 --- a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php @@ -16,6 +16,7 @@ abstract class BaseLikeHandler implements FilterHandlerInterface '\\' => '\\\\', ]; + #[\Override] public function getFilterClass(): string { return Like::class; diff --git a/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php index 9a89e42..5199c78 100644 --- a/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php @@ -10,6 +10,7 @@ final class MysqlLikeHandler extends BaseLikeHandler implements QueryBuilderFilterHandler { + #[\Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Like $filter */ diff --git a/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php index 88137c0..8c27fef 100644 --- a/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php @@ -10,6 +10,7 @@ final class PostgresLikeHandler extends BaseLikeHandler implements QueryBuilderFilterHandler { + #[\Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Like $filter */ diff --git a/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php index 225c3dd..3cb5ef3 100644 --- a/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php @@ -16,6 +16,7 @@ public function __construct() unset($this->escapingReplacements['\\']); } + #[\Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Like $filter */ diff --git a/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php index 6cc7419..5cc9ccb 100644 --- a/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php @@ -16,6 +16,7 @@ public function __construct() unset($this->escapingReplacements['\\']); } + #[\Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Like $filter */ diff --git a/src/Reader/FilterHandler/NoneHandler.php b/src/Reader/FilterHandler/NoneHandler.php new file mode 100644 index 0000000..d29b568 --- /dev/null +++ b/src/Reader/FilterHandler/NoneHandler.php @@ -0,0 +1,32 @@ +where(new Expression('1'), new Expression('0')); + }, + ]; + } +} diff --git a/src/Reader/FilterHandler/NotHandler.php b/src/Reader/FilterHandler/NotHandler.php index 4f72b37..75942ec 100644 --- a/src/Reader/FilterHandler/NotHandler.php +++ b/src/Reader/FilterHandler/NotHandler.php @@ -23,11 +23,13 @@ final class NotHandler implements QueryBuilderFilterHandler, FilterHandlerInterface { + #[\Override] public function getFilterClass(): string { return Not::class; } + #[\Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Not $filter */ diff --git a/src/Reader/FilterHandler/OrXHandler.php b/src/Reader/FilterHandler/OrXHandler.php index d8bef15..f6f8925 100644 --- a/src/Reader/FilterHandler/OrXHandler.php +++ b/src/Reader/FilterHandler/OrXHandler.php @@ -13,11 +13,13 @@ final class OrXHandler implements QueryBuilderFilterHandler, FilterHandlerInterface { + #[\Override] public function getFilterClass(): string { return OrX::class; } + #[\Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var OrX $filter */ diff --git a/src/Writer/EntityWriter.php b/src/Writer/EntityWriter.php index 0891c09..5c0575c 100644 --- a/src/Writer/EntityWriter.php +++ b/src/Writer/EntityWriter.php @@ -17,6 +17,7 @@ public function __construct(private EntityManagerInterface $entityManager) /** * @throws Throwable */ + #[\Override] public function write(iterable $items): void { foreach ($items as $entity) { @@ -25,6 +26,7 @@ public function write(iterable $items): void $this->entityManager->run(); } + #[\Override] public function delete(iterable $items): void { foreach ($items as $entity) { diff --git a/tests/Feature/Base/Reader/ReaderWithFilter/BaseReaderWithAllTestCase.php b/tests/Feature/Base/Reader/ReaderWithFilter/BaseReaderWithAllTestCase.php new file mode 100644 index 0000000..fdc5227 --- /dev/null +++ b/tests/Feature/Base/Reader/ReaderWithFilter/BaseReaderWithAllTestCase.php @@ -0,0 +1,12 @@ + Date: Thu, 25 Sep 2025 07:43:26 +0300 Subject: [PATCH 3/9] Support Stringable type --- src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php index fee202a..ac99db4 100644 --- a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php @@ -4,6 +4,7 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler\LikeHandler; +use Stringable; use Yiisoft\Data\Reader\Filter\Like; use Yiisoft\Data\Reader\Filter\LikeMode; use Yiisoft\Data\Reader\FilterHandlerInterface; @@ -22,10 +23,9 @@ public function getFilterClass(): string return Like::class; } - protected function prepareValue(string|\Stringable $value, LikeMode $mode): string + protected function prepareValue(string|Stringable $value, LikeMode $mode): string { - - $value = strtr($value, $this->escapingReplacements); + $value = strtr((string)$value, $this->escapingReplacements); return match ($mode) { LikeMode::Contains => '%' . $value . '%', LikeMode::StartsWith => $value . '%', From fa0184a54e1174315be7d7caf45e2fe5e6147bc9 Mon Sep 17 00:00:00 2001 From: Mahmud Date: Thu, 25 Sep 2025 08:07:50 +0300 Subject: [PATCH 4/9] Fix style --- src/Reader/FilterHandler/AndXHandler.php | 1 - tests/Feature/DataTrait.php | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Reader/FilterHandler/AndXHandler.php b/src/Reader/FilterHandler/AndXHandler.php index a6e50b3..85566b9 100644 --- a/src/Reader/FilterHandler/AndXHandler.php +++ b/src/Reader/FilterHandler/AndXHandler.php @@ -7,7 +7,6 @@ use Cycle\ORM\Select\QueryBuilder; use Yiisoft\Data\Cycle\Exception\NotSupportedFilterException; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; -use Yiisoft\Data\Reader\Filter\All; use Yiisoft\Data\Reader\Filter\AndX; use Yiisoft\Data\Reader\FilterHandlerInterface; use Yiisoft\Data\Reader\FilterInterface; diff --git a/tests/Feature/DataTrait.php b/tests/Feature/DataTrait.php index 092921b..a318630 100644 --- a/tests/Feature/DataTrait.php +++ b/tests/Feature/DataTrait.php @@ -205,7 +205,7 @@ private function createSchema(): SchemaInterface 'id' => 'int', 'number' => 'int', 'balance' => 'float', - 'born_at' => 'datetime' + 'born_at' => 'datetime', ], SchemaInterface::RELATIONS => [], ], From 5b260bb3a61dfb8e9a156b4fdf3265399b3ad597 Mon Sep 17 00:00:00 2001 From: Mahmud Date: Sun, 28 Sep 2025 04:24:14 +0300 Subject: [PATCH 5/9] Overriding test method to assert exception an unsupported case sensitivity --- .../ReaderWithFilter/ReaderWithLikeTest.php | 17 +++++++++++++++++ .../ReaderWithFilter/ReaderWithLikeTest.php | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithLikeTest.php b/tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithLikeTest.php index 3977fbd..949dc69 100644 --- a/tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithLikeTest.php +++ b/tests/Feature/Mssql/Reader/ReaderWithFilter/ReaderWithLikeTest.php @@ -4,9 +4,26 @@ namespace Yiisoft\Data\Cycle\Tests\Feature\Mssql\Reader\ReaderWithFilter; +use PHPUnit\Framework\Attributes\DataProvider; +use Yiisoft\Data\Cycle\Exception\NotSupportedFilterOptionException; use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithLikeTestCase; final class ReaderWithLikeTest extends BaseReaderWithLikeTestCase { public static $DRIVER = 'mssql'; + + #[DataProvider('dataWithReader')] + public function testWithReader( + string $field, + mixed $value, + bool|null $caseSensitive, + array $expectedFixtureIndexes, + ): void { + if ($caseSensitive === true) { + $this->expectException(NotSupportedFilterOptionException::class); + $this->expectExceptionMessage('$caseSensitive option is not supported when using SQLServer driver.'); + } + + parent::testWithReader($field, $value, $caseSensitive, $expectedFixtureIndexes); + } } diff --git a/tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithLikeTest.php b/tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithLikeTest.php index 24d6373..4be3de4 100644 --- a/tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithLikeTest.php +++ b/tests/Feature/Sqlite/Reader/ReaderWithFilter/ReaderWithLikeTest.php @@ -4,9 +4,26 @@ namespace Yiisoft\Data\Cycle\Tests\Feature\Sqlite\Reader\ReaderWithFilter; +use PHPUnit\Framework\Attributes\DataProvider; +use Yiisoft\Data\Cycle\Exception\NotSupportedFilterOptionException; use Yiisoft\Data\Cycle\Tests\Feature\Base\Reader\ReaderWithFilter\BaseReaderWithLikeTestCase; final class ReaderWithLikeTest extends BaseReaderWithLikeTestCase { public static $DRIVER = 'sqlite'; + + #[DataProvider('dataWithReader')] + public function testWithReader( + string $field, + mixed $value, + bool|null $caseSensitive, + array $expectedFixtureIndexes, + ): void { + if ($caseSensitive === true) { + $this->expectException(NotSupportedFilterOptionException::class); + $this->expectExceptionMessage('$caseSensitive option is not supported when using SQLite driver.'); + } + + parent::testWithReader($field, $value, $caseSensitive, $expectedFixtureIndexes); + } } From 9714911a055290eafda0521798a8259fa684ed70 Mon Sep 17 00:00:00 2001 From: Mahmud Date: Sun, 28 Sep 2025 05:42:44 +0300 Subject: [PATCH 6/9] Fix handlers --- src/Reader/EntityReader.php | 4 ---- src/Reader/FilterHandler/AllHandler.php | 2 +- src/Reader/FilterHandler/NoneHandler.php | 2 +- tests/Feature/Base/Reader/BaseEntityReaderTestCase.php | 1 + 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/Reader/EntityReader.php b/src/Reader/EntityReader.php index 16c31a9..8324a53 100644 --- a/src/Reader/EntityReader.php +++ b/src/Reader/EntityReader.php @@ -231,10 +231,6 @@ private function buildSelectQuery(): SelectQuery|Select $newQuery->limit($this->limit); } - if ($this->filter instanceof All) { - return $newQuery; - } - $newQuery->andWhere($this->makeFilterClosure($this->filter)); return $newQuery; diff --git a/src/Reader/FilterHandler/AllHandler.php b/src/Reader/FilterHandler/AllHandler.php index dc2496a..c6375fe 100644 --- a/src/Reader/FilterHandler/AllHandler.php +++ b/src/Reader/FilterHandler/AllHandler.php @@ -25,7 +25,7 @@ public function getAsWhereArguments(FilterInterface $filter, array $handlers): a /** @var All $filter */ return [ static function (QueryBuilder $select) { - $select->where(new Expression('1'), new Expression('1')); + $select->where(new Expression('1 = 1')); }, ]; } diff --git a/src/Reader/FilterHandler/NoneHandler.php b/src/Reader/FilterHandler/NoneHandler.php index d29b568..d48c64d 100644 --- a/src/Reader/FilterHandler/NoneHandler.php +++ b/src/Reader/FilterHandler/NoneHandler.php @@ -25,7 +25,7 @@ public function getAsWhereArguments(FilterInterface $filter, array $handlers): a /** @var None $filter */ return [ static function (QueryBuilder $select) { - $select->where(new Expression('1'), new Expression('0')); + $select->where(new Expression('1 = 0')); }, ]; } diff --git a/tests/Feature/Base/Reader/BaseEntityReaderTestCase.php b/tests/Feature/Base/Reader/BaseEntityReaderTestCase.php index b1578d0..7825801 100644 --- a/tests/Feature/Base/Reader/BaseEntityReaderTestCase.php +++ b/tests/Feature/Base/Reader/BaseEntityReaderTestCase.php @@ -171,6 +171,7 @@ public static function dataGetSql(): array "user"."balance" AS "c3", "user"."born_at" AS "c4" FROM "user" AS "user" + WHERE ((1 = 1)) LIMIT 2 OFFSET 1 SQL, From affaa3cca7cbebf6b8bdc33c6673dc2ad9b4f48f Mon Sep 17 00:00:00 2001 From: Mahmud Date: Sun, 28 Sep 2025 05:54:31 +0300 Subject: [PATCH 7/9] Fix tests --- tests/Feature/Mssql/Reader/EntityReaderTest.php | 1 + tests/Feature/Mysql/Reader/EntityReaderTest.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Feature/Mssql/Reader/EntityReaderTest.php b/tests/Feature/Mssql/Reader/EntityReaderTest.php index ad466aa..4453f0d 100644 --- a/tests/Feature/Mssql/Reader/EntityReaderTest.php +++ b/tests/Feature/Mssql/Reader/EntityReaderTest.php @@ -24,6 +24,7 @@ public static function dataGetSql(): array [user].[born_at] AS [c4], ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS [_ROW_NUMBER_] FROM [user] AS [user] + WHERE ((1=1)) ) AS [ORD_FALLBACK] WHERE [_ROW_NUMBER_] BETWEEN 2 AND 3 SQL, diff --git a/tests/Feature/Mysql/Reader/EntityReaderTest.php b/tests/Feature/Mysql/Reader/EntityReaderTest.php index 7d96a3f..f2e9bb4 100644 --- a/tests/Feature/Mysql/Reader/EntityReaderTest.php +++ b/tests/Feature/Mysql/Reader/EntityReaderTest.php @@ -21,7 +21,7 @@ public static function dataGetSql(): array `user`.`email` AS `c2`, `user`.`balance` AS `c3`, `user`.`born_at` AS `c4` - FROM `user` AS `user` LIMIT 2 OFFSET 1 + FROM `user` AS `user` WHERE ((1 = 1)) LIMIT 2 OFFSET 1 SQL, ], ]; From 76559a8bad6789f555b0910be3094c55d65bf8f6 Mon Sep 17 00:00:00 2001 From: Mahmud Date: Sun, 28 Sep 2025 22:17:39 +0300 Subject: [PATCH 8/9] Add more tests and change constraints php --- composer.json | 2 +- .../Base/Reader/BaseEntityReaderTestCase.php | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 505b612..f8ac4cc 100644 --- a/composer.json +++ b/composer.json @@ -32,7 +32,7 @@ "prefer-stable": true, "minimum-stability": "dev", "require": { - "php": "^8.1", + "php": "8.1 - 8.4", "ext-mbstring": "*", "cycle/database": "^2.11", "cycle/orm": "^2.9", diff --git a/tests/Feature/Base/Reader/BaseEntityReaderTestCase.php b/tests/Feature/Base/Reader/BaseEntityReaderTestCase.php index 7825801..0b95fb6 100644 --- a/tests/Feature/Base/Reader/BaseEntityReaderTestCase.php +++ b/tests/Feature/Base/Reader/BaseEntityReaderTestCase.php @@ -131,6 +131,12 @@ public function testLimitException(): void (new EntityReader($this->select('user')))->withLimit(-1); } + public function testGetLimit(): void + { + $reader = (new EntityReader($this->select('user')))->withLimit(2); + $this->assertSame(2, $reader->getLimit()); + } + public function testLimitOffset(): void { $reader = (new EntityReader( @@ -140,6 +146,12 @@ public function testLimitOffset(): void $this->assertFixtures([1, 2], $reader->read()); } + public function testGetOffset(): void + { + $reader = (new EntityReader($this->select('user')))->withOffset(1); + $this->assertSame(1, $reader->getOffset()); + } + public function testFilter(): void { $reader = (new EntityReader($this->select('user')))->withFilter(new Equals('number', 2)); @@ -159,6 +171,13 @@ public function testFilterHandlers(): void $reader->read(); } + public function testGetFilter(): void + { + $filter = new Equals('number', 2); + $reader = (new EntityReader($this->select('user')))->withFilter($filter); + $this->assertSame($filter, $reader->getFilter()); + } + public static function dataGetSql(): array { return [ From ce73f779f4b87d84fc0f94bbe1773430d356882e Mon Sep 17 00:00:00 2001 From: Mahmud Date: Sun, 28 Sep 2025 22:18:20 +0300 Subject: [PATCH 9/9] Update github actions --- .github/workflows/composer-require-checker.yml | 2 +- .github/workflows/mssql.yml | 1 + .github/workflows/mutation.yml | 2 +- .github/workflows/mysql.yml | 1 + .github/workflows/pgsql.yml | 1 + .github/workflows/rector.yml | 2 +- .github/workflows/sqlite.yml | 1 + .github/workflows/static.yml | 2 +- 8 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/composer-require-checker.yml b/.github/workflows/composer-require-checker.yml index a857bce..a93390b 100644 --- a/.github/workflows/composer-require-checker.yml +++ b/.github/workflows/composer-require-checker.yml @@ -31,4 +31,4 @@ jobs: os: >- ['ubuntu-latest'] php: >- - ['8.1', '8.2', '8.3'] + ['8.1', '8.2', '8.3', '8.4'] diff --git a/.github/workflows/mssql.yml b/.github/workflows/mssql.yml index 689e4a9..a4e0aff 100644 --- a/.github/workflows/mssql.yml +++ b/.github/workflows/mssql.yml @@ -33,6 +33,7 @@ jobs: - 8.1 - 8.2 - 8.3 + - 8.4 mssql: - server: 2022-latest diff --git a/.github/workflows/mutation.yml b/.github/workflows/mutation.yml index df1db8d..ced4b61 100644 --- a/.github/workflows/mutation.yml +++ b/.github/workflows/mutation.yml @@ -27,7 +27,7 @@ jobs: os: >- ['ubuntu-latest'] php: >- - ['8.3'] + ['8.4'] min-covered-msi: 100 secrets: STRYKER_DASHBOARD_API_KEY: ${{ secrets.STRYKER_DASHBOARD_API_KEY }} diff --git a/.github/workflows/mysql.yml b/.github/workflows/mysql.yml index 73ed2fd..01ef6ba 100644 --- a/.github/workflows/mysql.yml +++ b/.github/workflows/mysql.yml @@ -40,6 +40,7 @@ jobs: - 8.1 - 8.2 - 8.3 + - 8.4 mysql: - 5.7 diff --git a/.github/workflows/pgsql.yml b/.github/workflows/pgsql.yml index 076db87..a76ec22 100644 --- a/.github/workflows/pgsql.yml +++ b/.github/workflows/pgsql.yml @@ -40,6 +40,7 @@ jobs: - 8.1 - 8.2 - 8.3 + - 8.4 pgsql: - 9 diff --git a/.github/workflows/rector.yml b/.github/workflows/rector.yml index 457772a..5d6931d 100644 --- a/.github/workflows/rector.yml +++ b/.github/workflows/rector.yml @@ -21,4 +21,4 @@ jobs: os: >- ['ubuntu-latest'] php: >- - ['8.3'] + ['8.4'] diff --git a/.github/workflows/sqlite.yml b/.github/workflows/sqlite.yml index b42130e..6195dad 100644 --- a/.github/workflows/sqlite.yml +++ b/.github/workflows/sqlite.yml @@ -36,6 +36,7 @@ jobs: - 8.1 - 8.2 - 8.3 + - 8.4 steps: - name: Checkout. diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index e33eca8..d03874d 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -29,4 +29,4 @@ jobs: os: >- ['ubuntu-latest'] php: >- - ['8.1', '8.2', '8.3'] + ['8.1', '8.2', '8.3', '8.4']