Skip to content

Commit f75bb0b

Browse files
vinceAmstoutzsoyuka
authored andcommitted
fix(test): apply review requested changes
1 parent 036fdc4 commit f75bb0b

File tree

5 files changed

+47
-16
lines changed

5 files changed

+47
-16
lines changed

src/Doctrine/Odm/Filter/PartialSearchFilter.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ public function apply(Builder $aggregationBuilder, string $resourceClass, ?Opera
3232
{
3333
$parameter = $context['parameter'];
3434
$property = $parameter->getProperty();
35-
$values = (array) $parameter->getValue();
35+
$values = $parameter->getValue();
3636

37-
if (1 === \count($values)) {
38-
$escapedValue = preg_quote((string) $values[0], '/');
37+
if (!is_iterable($values)) {
38+
$escapedValue = preg_quote($values, '/');
3939
$aggregationBuilder
4040
->match()
4141
->field($property)
@@ -46,7 +46,7 @@ public function apply(Builder $aggregationBuilder, string $resourceClass, ?Opera
4646

4747
$match = $aggregationBuilder->match();
4848
foreach ($values as $value) {
49-
$escapedValue = preg_quote((string) $value, '/');
49+
$escapedValue = preg_quote($value, '/');
5050

5151
$match->addOr(
5252
$match->expr()

src/Doctrine/Orm/Filter/PartialSearchFilter.php

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,22 @@ final class PartialSearchFilter implements FilterInterface, OpenApiParameterFilt
3131
public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void
3232
{
3333
$parameter = $context['parameter'];
34-
$values = (array) $parameter->getValue();
35-
3634
$property = $parameter->getProperty();
3735
$alias = $queryBuilder->getRootAliases()[0];
3836
$field = $alias.'.'.$property;
37+
$parameterName = $queryNameGenerator->generateParameterName($property);
38+
$values = $parameter->getValue();
39+
40+
if (!is_iterable($values)) {
41+
$queryBuilder->setParameter($parameterName, '%'.strtolower($values).'%');
42+
43+
$queryBuilder->{$context['whereClause'] ?? 'andWhere'}($queryBuilder->expr()->like(
44+
'LOWER('.$field.')',
45+
':'.$parameterName
46+
));
47+
48+
return;
49+
}
3950

4051
$likeExpressions = [];
4152
foreach ($values as $val) {
@@ -44,16 +55,11 @@ public function apply(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $q
4455
'LOWER('.$field.')',
4556
':'.$parameterName
4657
);
47-
4858
$queryBuilder->setParameter($parameterName, '%'.strtolower($val).'%');
4959
}
5060

51-
if (1 === \count($likeExpressions)) {
52-
$queryBuilder->{$context['whereClause'] ?? 'andWhere'}($likeExpressions[0]);
53-
} else {
54-
$queryBuilder->{$context['whereClause'] ?? 'andWhere'}(
55-
$queryBuilder->expr()->orX(...$likeExpressions)
56-
);
57-
}
61+
$queryBuilder->{$context['whereClause'] ?? 'andWhere'}(
62+
$queryBuilder->expr()->orX(...$likeExpressions)
63+
);
5864
}
5965
}

tests/Fixtures/TestBundle/Document/ChickenCoop.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use ApiPlatform\Doctrine\Odm\Filter\ExactFilter;
1717
use ApiPlatform\Doctrine\Odm\Filter\IriFilter;
1818
use ApiPlatform\Doctrine\Odm\Filter\OrFilter;
19+
use ApiPlatform\Doctrine\Odm\Filter\PartialSearchFilter;
1920
use ApiPlatform\Metadata\GetCollection;
2021
use ApiPlatform\Metadata\QueryParameter;
2122
use Doctrine\Common\Collections\ArrayCollection;
@@ -29,7 +30,11 @@
2930
'chickens' => new QueryParameter(filter: new IriFilter()),
3031
'relation' => new QueryParameter(
3132
filter: new OrFilter([new IriFilter(), new ExactFilter()]),
32-
property: 'chickens'
33+
property: 'chickens',
34+
),
35+
'relationBis' => new QueryParameter(
36+
filter: new OrFilter([new ExactFilter(), new PartialSearchFilter()]),
37+
property: 'chickens',
3338
),
3439
])
3540
]

tests/Fixtures/TestBundle/Entity/ChickenCoop.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use ApiPlatform\Doctrine\Orm\Filter\ExactFilter;
1717
use ApiPlatform\Doctrine\Orm\Filter\IriFilter;
1818
use ApiPlatform\Doctrine\Orm\Filter\OrFilter;
19+
use ApiPlatform\Doctrine\Orm\Filter\PartialSearchFilter;
1920
use ApiPlatform\Metadata\GetCollection;
2021
use ApiPlatform\Metadata\QueryParameter;
2122
use Doctrine\Common\Collections\ArrayCollection;
@@ -29,7 +30,11 @@
2930
'chickens' => new QueryParameter(filter: new IriFilter()),
3031
'relation' => new QueryParameter(
3132
filter: new OrFilter([new IriFilter(), new ExactFilter()]),
32-
property: 'chickens'
33+
property: 'chickens',
34+
),
35+
'relationBis' => new QueryParameter(
36+
filter: new OrFilter([new ExactFilter(), new PartialSearchFilter()]),
37+
property: 'chickens',
3338
),
3439
]
3540
)]

tests/Functional/Parameters/OrFilterTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,21 @@ public static function orFilterDataProvider(): \Generator
8080
'url' => '/chickens?relation[]=/chickens/1&relation[]=/chickens/2',
8181
'expectedCount' => 2,
8282
];
83+
84+
yield 'relationBis: filter by coop 1 (IRI) OR coop 2 (partial name)' => [
85+
'url' => '/chickens?relationBis[]=/chicken_coops/1&relationBis[]=Henri',
86+
'expectedCount' => 2,
87+
];
88+
89+
yield 'relationBis: filter by coop 1 (partial name) OR coop 2 (partial name)' => [
90+
'url' => '/chickens?relationBis[]=Gertrude&relationBis[]=Henri',
91+
'expectedCount' => 2,
92+
];
93+
94+
yield 'relationBis: filter by partial name matching both coops' => [
95+
'url' => '/chickens?relationBis[]=Coop',
96+
'expectedCount' => 2,
97+
];
8398
}
8499

85100
/**

0 commit comments

Comments
 (0)