From d959b555bc34972d46451bc14540c5d210d38ec2 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Wed, 10 Dec 2025 10:13:09 +0300 Subject: [PATCH 1/2] Change `IterableDataReader::withAddedFilterHandlers()` to `$addFilterHandlers` constructor parameter --- CHANGELOG.md | 1 + src/Reader/Iterable/IterableDataReader.php | 27 +++--------- .../Iterable/IterableDataReaderTest.php | 41 +++++++++---------- 3 files changed, 26 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb870a0..9c08243 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,6 +65,7 @@ - Bug #234: Fix handling of `null` values in `IterableDataReader` (@vjik) - New #236: Add `PaginatorInterface::getFilter()` method (@vjik) - Chg #241: Remove `FilterHandlerInterface` interface (@vjik) +- Chg #242: Change `IterableDataReader::withAddedFilterHandlers()` to `$addFilterHandlers` constructor parameter (@vjik) ## 1.0.1 January 25, 2023 diff --git a/src/Reader/Iterable/IterableDataReader.php b/src/Reader/Iterable/IterableDataReader.php index fe876fc..16a3fe4 100644 --- a/src/Reader/Iterable/IterableDataReader.php +++ b/src/Reader/Iterable/IterableDataReader.php @@ -59,22 +59,19 @@ final class IterableDataReader implements DataReaderInterface private ?int $limit = null; private int $offset = 0; - /** - * @psalm-var array - */ - private array $coreFilterHandlers; - private Context $context; /** * @param iterable $data Data to iterate. + * @param IterableFilterHandlerInterface[] $addFilterHandlers * @psalm-param iterable $data */ public function __construct( private readonly iterable $data, - private readonly ValueReaderInterface $valueReader = new FlatValueReader(), + ValueReaderInterface $valueReader = new FlatValueReader(), + array $addFilterHandlers = [], ) { - $this->coreFilterHandlers = $this->prepareFilterHandlers([ + $filterHandlers = $this->prepareFilterHandlers([ new AllHandler(), new NoneHandler(), new AndXHandler(), @@ -89,24 +86,12 @@ public function __construct( new LessThanOrEqualHandler(), new LikeHandler(), new NotHandler(), + ...$addFilterHandlers, ]); - $this->context = new Context($this->coreFilterHandlers, $this->valueReader); + $this->context = new Context($filterHandlers, $valueReader); $this->filter = new All(); } - public function withAddedFilterHandlers(IterableFilterHandlerInterface ...$filterHandlers): self - { - $new = clone $this; - $new->context = new Context( - array_merge( - $this->coreFilterHandlers, - $this->prepareFilterHandlers($filterHandlers), - ), - $this->valueReader, - ); - return $new; - } - public function withFilter(FilterInterface $filter): static { $new = clone $this; diff --git a/tests/Reader/Iterable/IterableDataReaderTest.php b/tests/Reader/Iterable/IterableDataReaderTest.php index 515593a..8499ad7 100644 --- a/tests/Reader/Iterable/IterableDataReaderTest.php +++ b/tests/Reader/Iterable/IterableDataReaderTest.php @@ -67,7 +67,6 @@ public function testImmutability(): void { $reader = new IterableDataReader([]); - $this->assertNotSame($reader, $reader->withAddedFilterHandlers()); $this->assertNotSame($reader, $reader->withFilter(new All())); $this->assertNotSame($reader, $reader->withSort(null)); $this->assertNotSame($reader, $reader->withOffset(1)); @@ -381,8 +380,7 @@ public function testGeneratorAsDataSet(): void public function testCustomFilter(): void { $filter = new AndX(new GreaterThan('id', 0), new Digital('name')); - $reader = (new IterableDataReader(self::DEFAULT_DATASET)) - ->withAddedFilterHandlers(new DigitalHandler()) + $reader = (new IterableDataReader(self::DEFAULT_DATASET, addFilterHandlers: [new DigitalHandler()])) ->withFilter($filter); $filtered = $reader->read(); @@ -395,25 +393,24 @@ public function testCustomEqualsProcessor(): void { $sort = Sort::only(['id', 'name'])->withOrderString('id'); - $dataReader = (new IterableDataReader(self::DEFAULT_DATASET)) - ->withSort($sort) - ->withAddedFilterHandlers( - new class implements IterableFilterHandlerInterface { - public function getFilterClass(): string - { - return Equals::class; - } - - public function match( - array|object $item, - FilterInterface $filter, - Context $context, - ): bool { - /** @var Equals $filter */ - return $item[$filter->field] === 2; - } - }, - ); + $customEquals = new class implements IterableFilterHandlerInterface { + public function getFilterClass(): string + { + return Equals::class; + } + + public function match( + array|object $item, + FilterInterface $filter, + Context $context, + ): bool { + /** @var Equals $filter */ + return $item[$filter->field] === 2; + } + }; + + $dataReader = (new IterableDataReader(self::DEFAULT_DATASET, addFilterHandlers: [$customEquals])) + ->withSort($sort); $dataReader = $dataReader->withFilter(new Equals('id', 100)); $expected = [self::ITEM_2]; From 67a213f8ad05f63f565d5df437a896e3575f018f Mon Sep 17 00:00:00 2001 From: vjik <525501+vjik@users.noreply.github.com> Date: Wed, 10 Dec 2025 07:14:10 +0000 Subject: [PATCH 2/2] Apply PHP CS Fixer and Rector changes (CI) --- src/Reader/Iterable/IterableDataReader.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Reader/Iterable/IterableDataReader.php b/src/Reader/Iterable/IterableDataReader.php index 16a3fe4..f0e0342 100644 --- a/src/Reader/Iterable/IterableDataReader.php +++ b/src/Reader/Iterable/IterableDataReader.php @@ -29,7 +29,6 @@ use Yiisoft\Data\Reader\Iterable\ValueReader\ValueReaderInterface; use Yiisoft\Data\Reader\Sort; -use function array_merge; use function count; use function iterator_to_array; use function uasort;