Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
28 changes: 6 additions & 22 deletions src/Reader/Iterable/IterableDataReader.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -59,22 +58,19 @@ final class IterableDataReader implements DataReaderInterface
private ?int $limit = null;
private int $offset = 0;

/**
* @psalm-var array<string, IterableFilterHandlerInterface>
*/
private array $coreFilterHandlers;

private Context $context;

/**
* @param iterable $data Data to iterate.
* @param IterableFilterHandlerInterface[] $addFilterHandlers
* @psalm-param iterable<TKey, TValue> $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(),
Expand All @@ -89,24 +85,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;
Expand Down
41 changes: 19 additions & 22 deletions tests/Reader/Iterable/IterableDataReaderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down Expand Up @@ -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();
Expand All @@ -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];
Expand Down
Loading