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
4 changes: 2 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@
`PaginatorInterface::getCurrentPageSize()` and `OffsetPaginator::getTotalItems()` (@vjik)
- Chg #165: Simplify `FilterInterface` and `FilterHandlerInterface` (@vjik)
- Chg #166: Remove `EqualsEmpty` filter (@vjik)
- Bug #173: Make `Like` filter case-sensitive (@arogachev)
- New #173: Add `ILike` filter (case-insensitive variation of `Like` filter) (@arogachev)
- New #176: Add `OrderHelper` (@vjik)
- New #173, #184: Add `$caseSensitive` parameter to `Like` filter to control whether the search must be case-sensitive
or not (@arogachev)

## 1.0.1 January 25, 2023

Expand Down
33 changes: 0 additions & 33 deletions src/Reader/Filter/ILike.php

This file was deleted.

13 changes: 12 additions & 1 deletion src/Reader/Filter/Like.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,23 @@
use Yiisoft\Data\Reader\FilterInterface;

/**
* `Like` filter defines a criteria for ensuring field value is like-match to a given value (case-sensitive).
* `Like` filter defines a criteria for ensuring field value is like-match to a given value.
*/
final class Like implements FilterInterface
{
/**
* @param string $field Name of the field to compare.
* @param string $value Value to like-compare with.
* @param bool|null $caseSensitive Whether search must be case-sensitive:
*
* - `null` - depends on implementation;
* - `true` - case-sensitive;
* - `false` - case-insensitive.
*/
public function __construct(
private readonly string $field,
private readonly string $value,
private readonly ?bool $caseSensitive = null,
) {
}

Expand All @@ -30,4 +36,9 @@ public function getValue(): string
{
return $this->value;
}

public function isCaseSensitive(): ?bool
{
return $this->caseSensitive;
}
}
33 changes: 0 additions & 33 deletions src/Reader/Iterable/FilterHandler/ILikeHandler.php

This file was deleted.

7 changes: 6 additions & 1 deletion src/Reader/Iterable/FilterHandler/LikeHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,13 @@ public function match(object|array $item, FilterInterface $filter, array $iterab
/** @var Like $filter */

$itemValue = ArrayHelper::getValue($item, $filter->getField());
if (!is_string($itemValue)) {
return false;
}

/** @infection-ignore-all MBString No suitable test case was found yet. */
return is_string($itemValue) && mb_strpos($itemValue, $filter->getValue()) !== false;
return $filter->isCaseSensitive() === true
? mb_strpos($itemValue, $filter->getValue()) !== false
: mb_stripos($itemValue, $filter->getValue()) !== false;
}
}
2 changes: 0 additions & 2 deletions src/Reader/Iterable/IterableDataReader.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
use Yiisoft\Data\Reader\Iterable\FilterHandler\EqualsNullHandler;
use Yiisoft\Data\Reader\Iterable\FilterHandler\GreaterThanHandler;
use Yiisoft\Data\Reader\Iterable\FilterHandler\GreaterThanOrEqualHandler;
use Yiisoft\Data\Reader\Iterable\FilterHandler\ILikeHandler;
use Yiisoft\Data\Reader\Iterable\FilterHandler\InHandler;
use Yiisoft\Data\Reader\Iterable\FilterHandler\LessThanHandler;
use Yiisoft\Data\Reader\Iterable\FilterHandler\LessThanOrEqualHandler;
Expand Down Expand Up @@ -74,7 +73,6 @@ public function __construct(private iterable $data)
new EqualsNullHandler(),
new GreaterThanHandler(),
new GreaterThanOrEqualHandler(),
new ILikeHandler(),
new InHandler(),
new LessThanHandler(),
new LessThanOrEqualHandler(),
Expand Down
13 changes: 0 additions & 13 deletions tests/Reader/IterableDataReaderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
use Yiisoft\Data\Reader\Filter\Equals;
use Yiisoft\Data\Reader\Filter\GreaterThan;
use Yiisoft\Data\Reader\Filter\GreaterThanOrEqual;
use Yiisoft\Data\Reader\Filter\ILike;
use Yiisoft\Data\Reader\Filter\In;
use Yiisoft\Data\Reader\Filter\LessThan;
use Yiisoft\Data\Reader\Filter\LessThanOrEqual;
Expand Down Expand Up @@ -275,18 +274,6 @@ public function testLikeFiltering(): void
], $reader->read());
}

public function testILikeFiltering(): void
{
$filter = new ILike('name', 'agent');
$reader = (new IterableDataReader(self::DEFAULT_DATASET))
->withFilter($filter);

$this->assertSame([
2 => self::ITEM_3,
3 => self::ITEM_4,
], $reader->read());
}

public function testNotFiltering(): void
{
$filter = new Not(new Equals('id', 1));
Expand Down
32 changes: 0 additions & 32 deletions tests/Reader/IterableHandler/ILikeTest.php

This file was deleted.

30 changes: 22 additions & 8 deletions tests/Reader/IterableHandler/LikeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,33 @@ final class LikeTest extends TestCase
public static function matchDataProvider(): array
{
return [
[true, ['id' => 1, 'value' => 'Great Cat Fighter'], 'value', 'Great Cat Fighter'],
[true, ['id' => 1, 'value' => 'Great Cat Fighter'], 'value', 'Cat'],
[false, ['id' => 1, 'value' => 'Great Cat Fighter'], 'value', 'cat'],
[false, ['id' => 1, 'value' => 'Great Cat Fighter'], 'id', '1'],
[true, ['id' => 1, 'value' => '🙁🙂🙁'], 'value', '🙂'],
[true, ['id' => 1, 'value' => 'Привет мир'], 'value', ' '],
[true, ['id' => 1, 'value' => 'Great Cat Fighter'], 'value', 'Great Cat Fighter', null],
[true, ['id' => 1, 'value' => 'Great Cat Fighter'], 'value', 'Cat', null],
[true, ['id' => 1, 'value' => 'Great Cat Fighter'], 'value', 'cat', null],
[false, ['id' => 1, 'value' => 'Great Cat Fighter'], 'id', '1', null],
[true, ['id' => 1, 'value' => '🙁🙂🙁'], 'value', '🙂', null],
[true, ['id' => 1, 'value' => 'Привет мир'], 'value', ' ', null],

[true, ['id' => 1, 'value' => 'Great Cat Fighter'], 'value', 'Great Cat Fighter', false],
[true, ['id' => 1, 'value' => 'Great Cat Fighter'], 'value', 'Cat', false],
[true, ['id' => 1, 'value' => 'Great Cat Fighter'], 'value', 'cat', false],
[false, ['id' => 1, 'value' => 'Great Cat Fighter'], 'id', '1', false],
[true, ['id' => 1, 'value' => '🙁🙂🙁'], 'value', '🙂', false],
[true, ['id' => 1, 'value' => 'Привет мир'], 'value', ' ', false],

[true, ['id' => 1, 'value' => 'Great Cat Fighter'], 'value', 'Great Cat Fighter', true],
[true, ['id' => 1, 'value' => 'Great Cat Fighter'], 'value', 'Cat', true],
[false, ['id' => 1, 'value' => 'Great Cat Fighter'], 'value', 'cat', true],
[false, ['id' => 1, 'value' => 'Great Cat Fighter'], 'id', '1', true],
[true, ['id' => 1, 'value' => '🙁🙂🙁'], 'value', '🙂', true],
[true, ['id' => 1, 'value' => 'Привет мир'], 'value', ' ', true],
];
}

#[DataProvider('matchDataProvider')]
public function testMatch(bool $expected, array $item, string $field, string $value): void
public function testMatch(bool $expected, array $item, string $field, string $value, ?bool $caseSensitive): void
{
$processor = new LikeHandler();
$this->assertSame($expected, $processor->match($item, new Like($field, $value), []));
$this->assertSame($expected, $processor->match($item, new Like($field, $value, $caseSensitive), []));
}
}