Skip to content

Commit 2f971b7

Browse files
Add case sensitive option to PartialSearchFilter
1 parent c70cd44 commit 2f971b7

File tree

5 files changed

+53
-4
lines changed

5 files changed

+53
-4
lines changed

src/Doctrine/Odm/Filter/PartialSearchFilter.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ final class PartialSearchFilter implements FilterInterface, OpenApiParameterFilt
2929
use BackwardCompatibleFilterDescriptionTrait;
3030
use OpenApiFilterTrait;
3131

32+
public function __construct(private readonly bool $caseSensitive = true)
33+
{
34+
}
35+
3236
public function apply(Builder $aggregationBuilder, string $resourceClass, ?Operation $operation = null, array &$context = []): void
3337
{
3438
$parameter = $context['parameter'];
@@ -47,7 +51,7 @@ public function apply(Builder $aggregationBuilder, string $resourceClass, ?Opera
4751
if (!is_iterable($values)) {
4852
$escapedValue = preg_quote($values, '/');
4953
$match->{$operator}(
50-
$aggregationBuilder->matchExpr()->field($property)->equals(new Regex($escapedValue, 'i'))
54+
$aggregationBuilder->matchExpr()->field($property)->equals(new Regex($escapedValue, $this->caseSensitive ? '' : 'i'))
5155
);
5256

5357
return;
@@ -60,7 +64,7 @@ public function apply(Builder $aggregationBuilder, string $resourceClass, ?Opera
6064
$or->addOr(
6165
$aggregationBuilder->matchExpr()
6266
->field($property)
63-
->equals(new Regex($escapedValue, 'i'))
67+
->equals(new Regex($escapedValue, $this->caseSensitive ? '' : 'i'))
6468
);
6569
}
6670

src/Doctrine/Orm/Filter/PartialSearchFilter.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ final class PartialSearchFilter implements FilterInterface, OpenApiParameterFilt
2929
use BackwardCompatibleFilterDescriptionTrait;
3030
use OpenApiFilterTrait;
3131

32+
public function __construct(private readonly bool $caseSensitive = false)
33+
{
34+
}
35+
3236
public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void
3337
{
3438
$parameter = $context['parameter'];
@@ -46,7 +50,9 @@ public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $q
4650
$parameterName = $queryNameGenerator->generateParameterName($property);
4751
$queryBuilder->setParameter($parameterName, $this->formatLikeValue($values));
4852

49-
$likeExpression = 'LOWER('.$field.') LIKE LOWER(:'.$parameterName.') ESCAPE \'\\\'';
53+
$likeExpression = $this->caseSensitive
54+
? $field.' LIKE :'.$parameterName.' ESCAPE \'\\\''
55+
: 'LOWER('.$field.') LIKE LOWER(:'.$parameterName.') ESCAPE \'\\\'';
5056
$queryBuilder->{$context['whereClause'] ?? 'andWhere'}($likeExpression);
5157

5258
return;
@@ -55,7 +61,10 @@ public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $q
5561
$likeExpressions = [];
5662
foreach ($values as $val) {
5763
$parameterName = $queryNameGenerator->generateParameterName($property);
58-
$likeExpressions[] = 'LOWER('.$field.') LIKE LOWER(:'.$parameterName.') ESCAPE \'\\\'';
64+
$likeExpressions[] = $this->caseSensitive
65+
? $field.' LIKE :'.$parameterName.' ESCAPE \'\\\''
66+
: 'LOWER('.$field.') LIKE LOWER(:'.$parameterName.') ESCAPE \'\\\'';
67+
5968
$queryBuilder->setParameter($parameterName, $this->formatLikeValue($val));
6069
}
6170

tests/Fixtures/TestBundle/Document/Chicken.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636
property: 'name',
3737
),
3838
'namePartialNoProperty' => new QueryParameter(filter: new PartialSearchFilter()),
39+
'namePartialSensitive' => new QueryParameter(
40+
filter: new PartialSearchFilter(true),
41+
property: 'name',
42+
),
3943
'autocomplete' => new QueryParameter(filter: new FreeTextQueryFilter(new OrFilter(new ExactFilter())), properties: ['name', 'ean']),
4044
'q' => new QueryParameter(filter: new FreeTextQueryFilter(new PartialSearchFilter()), properties: ['name', 'ean']),
4145
],

tests/Fixtures/TestBundle/Entity/Chicken.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636
property: 'name',
3737
),
3838
'namePartialNoProperty' => new QueryParameter(filter: new PartialSearchFilter()),
39+
'namePartialSensitive' => new QueryParameter(
40+
filter: new PartialSearchFilter(true),
41+
property: 'name',
42+
),
3943
'autocomplete' => new QueryParameter(filter: new FreeTextQueryFilter(new OrFilter(new ExactFilter())), properties: ['name', 'ean']),
4044
'q' => new QueryParameter(filter: new FreeTextQueryFilter(new PartialSearchFilter()), properties: ['name', 'ean']),
4145
],

tests/Functional/Parameters/PartialSearchFilterTest.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ protected function setUp(): void
5555
}
5656

5757
#[DataProvider('partialSearchFilterProvider')]
58+
#[DataProvider('partialSearchFilterCaseSensitiveProvider')]
5859
public function testPartialSearchFilter(string $url, int $expectedCount, array $expectedNames): void
5960
{
6061
$response = self::createClient()->request('GET', $url);
@@ -193,6 +194,33 @@ public function testPartialSearchFilterThrowsExceptionWhenPropertyIsMissing(): v
193194
);
194195
}
195196

197+
public static function partialSearchFilterCaseSensitiveProvider(): \Generator
198+
{
199+
yield 'filter by partial name "tru"' => [
200+
'/chickens?namePartial=tru',
201+
1,
202+
['Gertrude'],
203+
];
204+
205+
yield 'filter by partial name "TRU"' => [
206+
'/chickens?namePartial=TRU',
207+
1,
208+
['Gertrude'],
209+
];
210+
211+
yield 'filter by case sensitive partial name "tru"' => [
212+
'/chickens?namePartialSensitive=tru',
213+
1,
214+
['Gertrude'],
215+
];
216+
217+
yield 'filter by case sensitive partial name "TRU"' => [
218+
'/chickens?namePartialSensitive=TRU',
219+
0,
220+
[],
221+
];
222+
}
223+
196224
/**
197225
* @throws \Throwable
198226
* @throws MongoDBException

0 commit comments

Comments
 (0)