Skip to content

Commit 905c981

Browse files
author
abluchet
committed
Fix #1008 multiple filters on eager loading
1 parent 8e9ae21 commit 905c981

File tree

3 files changed

+86
-7
lines changed

3 files changed

+86
-7
lines changed

features/bootstrap/FeatureContext.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,42 @@ public function thereIsDummyObjectsWithDummyDate($nb)
188188
$this->manager->flush();
189189
}
190190

191+
/**
192+
* @Given there is :nb dummy objects with dummyDate and dummyBoolean :bool
193+
*/
194+
public function thereIsDummyObjectsWithDummyDateAndDummyBoolean($nb, $bool)
195+
{
196+
$descriptions = ['Smart dummy.', 'Not so smart dummy.'];
197+
198+
if (in_array($bool, ['true', '1', 1], true)) {
199+
$bool = true;
200+
} elseif (in_array($bool, ['false', '0', 0], true)) {
201+
$bool = false;
202+
} else {
203+
$expected = ['true', 'false', '1', '0'];
204+
throw new InvalidArgumentException(sprintf('Invalid boolean value for "%s" property, expected one of ( "%s" )', $bool, implode('" | "', $expected)));
205+
}
206+
207+
for ($i = 1; $i <= $nb; ++$i) {
208+
$date = new \DateTime(sprintf('2015-04-%d', $i), new \DateTimeZone('UTC'));
209+
210+
$dummy = new Dummy();
211+
$dummy->setName('Dummy #'.$i);
212+
$dummy->setAlias('Alias #'.($nb - $i));
213+
$dummy->setDescription($descriptions[($i - 1) % 2]);
214+
$dummy->setDummyBoolean($bool);
215+
216+
// Last Dummy has a null date
217+
if ($nb !== $i) {
218+
$dummy->setDummyDate($date);
219+
}
220+
221+
$this->manager->persist($dummy);
222+
}
223+
224+
$this->manager->flush();
225+
}
226+
191227
/**
192228
* @Given there is :nb dummy objects with dummyDate and relatedDummy
193229
*/
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
Feature: Multiple filters on collections
2+
In order to retrieve large collections of filtered resources
3+
As a client software developer
4+
I need to retrieve collections filtered by multiple parameters
5+
6+
@createSchema
7+
@dropSchema
8+
Scenario: Get collection filtered by multiple parameters
9+
Given there is "30" dummy objects with dummyDate and dummyBoolean true
10+
And there is "20" dummy objects with dummyDate and dummyBoolean false
11+
When I send a "GET" request to "/dummies?dummyDate[after]=2015-04-28&dummyBoolean=1"
12+
Then the response status code should be 200
13+
And the response should be in JSON
14+
And the header "Content-Type" should be equal to "application/ld+json; charset=utf-8"
15+
And the JSON should be valid according to this schema:
16+
"""
17+
{
18+
"type": "object",
19+
"properties": {
20+
"@context": {"pattern": "^/contexts/Dummy$"},
21+
"@id": {"pattern": "^/dummies$"},
22+
"@type": {"pattern": "^hydra:Collection$"},
23+
"hydra:member": {
24+
"type": "array",
25+
"items": {
26+
"type": "object",
27+
"properties": {
28+
"@id": {
29+
"oneOf": [
30+
{"pattern": "^/dummies/28$"},
31+
{"pattern": "^/dummies/29$"}
32+
]
33+
}
34+
}
35+
},
36+
"maxItems": 2
37+
},
38+
"hydra:view": {
39+
"type": "object",
40+
"properties": {
41+
"@id": {"pattern": "^/dummies\\?dummyDate%5Bafter%5D=2015-04-28&dummyBoolean=1$"},
42+
"@type": {"pattern": "^hydra:PartialCollectionView$"}
43+
}
44+
}
45+
}
46+
}
47+
"""
48+

src/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,7 @@ public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGenerator
5858
$queryBuilderClone->andWhere($queryBuilderClone->expr()->in('o', $this->getQueryBuilderWithNewAliases($queryBuilder, $queryNameGenerator)->getDQL()));
5959

6060
$queryBuilder->resetDQLPart('where');
61-
foreach ($queryBuilderClone->getDQLPart('where')->getParts() as $wherePart) {
62-
$queryBuilder->add('where', $wherePart);
63-
}
61+
$queryBuilder->add('where', $queryBuilderClone->getDQLPart('where'));
6462
}
6563

6664
/**
@@ -101,10 +99,7 @@ private function getQueryBuilderWithNewAliases(QueryBuilder $queryBuilder, Query
10199
$queryBuilderClone->add('join', [$join], true);
102100
}
103101

104-
//Change where aliases
105-
foreach ($wherePart->getParts() as $where) {
106-
$queryBuilderClone->add('where', str_replace($aliases, $replacements, $where));
107-
}
102+
$queryBuilderClone->add('where', str_replace($aliases, $replacements, (string) $wherePart));
108103

109104
return $queryBuilderClone;
110105
}

0 commit comments

Comments
 (0)