Skip to content

Commit 43e4352

Browse files
alex-dnachrispenny
andauthored
Update filter value requirements for falsy values (#24)
Co-authored-by: Chris Penny <chris.penny@gmail.com>
1 parent 7d664fd commit 43e4352

File tree

3 files changed

+33
-7
lines changed

3 files changed

+33
-7
lines changed

src/Query/Filter/Criteria.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,9 @@ public function filter(Clause|string $targetOrClause, mixed $value = null, ?stri
100100
return $this;
101101
}
102102

103-
if (!$value) {
104-
throw new Exception('mixed $value and string $comparison expected for filter()');
103+
// Only NULL_COMPARISONS support a $value of null. All other falsy values are allowed
104+
if ($value === null && !in_array($comparison, Criterion::NULL_COMPARISONS, true)) {
105+
throw new Exception('mixed $value of null is not supported outside of NULL_COMPARISON filters');
105106
}
106107

107108
if (!$comparison) {

src/Query/Filter/Criterion.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ class Criterion implements Clause
4242
self::RANGE,
4343
];
4444

45+
public const NULL_COMPARISONS = [
46+
self::IS_NULL,
47+
self::IS_NOT_NULL,
48+
];
49+
4550
private ?CriterionAdaptor $adaptor = null;
4651

4752
private static array $dependencies = [

tests/Query/QueryTest.php

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -204,25 +204,39 @@ public function testFilterWithClause(): void
204204
$query = Query::create();
205205
$criterionOne = Criterion::create('field1', 'value1', Criterion::EQUAL);
206206
$criterionTwo = Criterion::create('field2', 'value2', Criterion::EQUAL);
207+
$criterionThree = Criterion::create('field3', '', Criterion::NOT_EQUAL);
208+
$criterionFour = Criterion::create('field4', 0, Criterion::NOT_EQUAL);
207209

208210
$query->filter($criterionOne);
209211
$query->filter($criterionTwo);
212+
$query->filter($criterionThree);
213+
$query->filter($criterionFour);
210214

211215
$clauses = $query->getFilter()->getClauses();
212216

213-
$this->assertCount(2, $clauses);
217+
$this->assertCount(4, $clauses);
214218

215219
/** @var Criterion $criterionOne */
216220
$criterionOne = array_shift($clauses);
217221
/** @var Criterion $criterionTwo */
218222
$criterionTwo = array_shift($clauses);
223+
/** @var Criterion $criterionThree */
224+
$criterionThree = array_shift($clauses);
225+
/** @var Criterion $criterionFour */
226+
$criterionFour = array_shift($clauses);
219227

220228
$this->assertEquals('field1', $criterionOne->getTarget());
221229
$this->assertEquals('value1', $criterionOne->getValue());
222230
$this->assertEquals(Criterion::EQUAL, $criterionOne->getComparison());
223231
$this->assertEquals('field2', $criterionTwo->getTarget());
224232
$this->assertEquals('value2', $criterionTwo->getValue());
225233
$this->assertEquals(Criterion::EQUAL, $criterionTwo->getComparison());
234+
$this->assertEquals('field3', $criterionThree->getTarget());
235+
$this->assertEquals('', $criterionThree->getValue());
236+
$this->assertEquals(Criterion::NOT_EQUAL, $criterionThree->getComparison());
237+
$this->assertEquals('field4', $criterionFour->getTarget());
238+
$this->assertEquals(0, $criterionFour->getValue());
239+
$this->assertEquals(Criterion::NOT_EQUAL, $criterionFour->getComparison());
226240
}
227241

228242
public function testFilterWithTarget(): void
@@ -256,7 +270,8 @@ public function testFilterAny(): void
256270
$query->filterAny([
257271
$criterion,
258272
['field2', 'value2', Criterion::EQUAL],
259-
['field3', 'value3', Criterion::EQUAL],
273+
['field3', '', Criterion::NOT_EQUAL],
274+
['field4', 0, Criterion::NOT_EQUAL],
260275
]);
261276

262277
$clauses = $query->getFilter()->getClauses();
@@ -278,6 +293,8 @@ public function testFilterAny(): void
278293
$criterionTwo = array_shift($clauses);
279294
/** @var Criterion $criterionThree */
280295
$criterionThree = array_shift($clauses);
296+
/** @var Criterion $criterionFour */
297+
$criterionFour = array_shift($clauses);
281298

282299
$this->assertEquals('field1', $criterionOne->getTarget());
283300
$this->assertEquals('value1', $criterionOne->getValue());
@@ -286,13 +303,16 @@ public function testFilterAny(): void
286303
$this->assertEquals('value2', $criterionTwo->getValue());
287304
$this->assertEquals(Criterion::EQUAL, $criterionTwo->getComparison());
288305
$this->assertEquals('field3', $criterionThree->getTarget());
289-
$this->assertEquals('value3', $criterionThree->getValue());
290-
$this->assertEquals(Criterion::EQUAL, $criterionThree->getComparison());
306+
$this->assertEquals('', $criterionThree->getValue());
307+
$this->assertEquals(Criterion::NOT_EQUAL, $criterionThree->getComparison());
308+
$this->assertEquals('field4', $criterionFour->getTarget());
309+
$this->assertEquals(0, $criterionFour->getValue());
310+
$this->assertEquals(Criterion::NOT_EQUAL, $criterionFour->getComparison());
291311
}
292312

293313
public function testFilterNoValue(): void
294314
{
295-
$this->expectExceptionMessage('mixed $value and string $comparison expected for filter()');
315+
$this->expectExceptionMessage('mixed $value of null is not supported outside of NULL_COMPARISON filters');
296316

297317
$query = Query::create();
298318
// Should throw our exception

0 commit comments

Comments
 (0)