Skip to content

Commit c4384ec

Browse files
committed
Support filter operator with null value
In most cases an operator receiving no arguments will not be applied and be entirely ignored. This is now supported.
1 parent 42170cd commit c4384ec

15 files changed

+120
-16
lines changed

src/Definition/Operator/AbstractOperator.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ abstract protected function getConfiguration(Types $types, LeafType $leafType):
6565
* @param QueryBuilder $queryBuilder
6666
* @param string $alias the alias for the entity on which to apply the filter
6767
* @param string $field the field for the entity on which to apply the filter
68-
* @param array $args all arguments specific to this operator as declared in its configuration
68+
* @param null|array $args all arguments specific to this operator as declared in its configuration
6969
*
7070
* @return null|string
7171
*/
72-
abstract public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): ?string;
72+
abstract public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string;
7373
}

src/Definition/Operator/AbstractSimpleOperator.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,12 @@ final protected function getConfiguration(Types $types, LeafType $leafType): arr
3535
];
3636
}
3737

38-
final public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): ?string
38+
final public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string
3939
{
40+
if ($args === null) {
41+
return null;
42+
}
43+
4044
$param = $uniqueNameFactory->createParameterName();
4145
$queryBuilder->setParameter($param, $args['value']);
4246

src/Definition/Operator/BetweenOperatorType.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,12 @@ protected function getConfiguration(Types $types, LeafType $leafType): array
3434
];
3535
}
3636

37-
public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): ?string
37+
public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string
3838
{
39+
if ($args === null) {
40+
return null;
41+
}
42+
3943
$from = $uniqueNameFactory->createParameterName();
4044
$to = $uniqueNameFactory->createParameterName();
4145
$queryBuilder->setParameter($from, $args['from']);

src/Definition/Operator/ContainOperatorType.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,12 @@ protected function getConfiguration(Types $types, LeafType $leafType): array
3030
];
3131
}
3232

33-
public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): ?string
33+
public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string
3434
{
35+
if ($args === null) {
36+
return null;
37+
}
38+
3539
$values = $uniqueNameFactory->createParameterName();
3640
$queryBuilder->setParameter($values, $args['values']);
3741
$not = $args['not'] ? 'NOT ' : '';

src/Definition/Operator/EmptyOperatorType.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@ protected function getConfiguration(Types $types, LeafType $leafType): array
2626
];
2727
}
2828

29-
public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): ?string
29+
public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string
3030
{
31+
if ($args === null) {
32+
return null;
33+
}
34+
3135
$not = $args['not'] ? 'NOT ' : '';
3236

3337
return $alias . '.' . $field . ' IS ' . $not . 'EMPTY';

src/Definition/Operator/InOperatorType.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,12 @@ protected function getConfiguration(Types $types, LeafType $leafType): array
3030
];
3131
}
3232

33-
public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): ?string
33+
public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string
3434
{
35+
if ($args === null) {
36+
return null;
37+
}
38+
3539
$values = $uniqueNameFactory->createParameterName();
3640
$queryBuilder->setParameter($values, $args['values']);
3741
$not = $args['not'] ? 'NOT ' : '';

src/Definition/Operator/NullOperatorType.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,12 @@ protected function getConfiguration(Types $types, LeafType $leafType): array
2626
];
2727
}
2828

29-
public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): ?string
29+
public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string
3030
{
31+
if ($args === null) {
32+
return null;
33+
}
34+
3135
$not = $args['not'] ? 'NOT ' : '';
3236

3337
return $alias . '.' . $field . ' IS ' . $not . 'NULL';

src/Factory/FilteredQueryBuilderFactory.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ private function applyFilters(ClassMetadata $metadata, InputObjectType $type, ar
8181
foreach ($filter['conditions'] ?? [] as $conditions) {
8282
$dqlConditions = [];
8383
foreach ($conditions['fields'] as $field => $fieldConditions) {
84+
if ($fieldConditions === null) {
85+
return;
86+
}
8487

8588
/** @var InputObjectType $typeField */
8689
$typeField = $typeFields->getField($field)->type;

tests/Blog/Filtering/ModuloOperatorType.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ protected function getConfiguration(Types $types, LeafType $leafType): array
2626
];
2727
}
2828

29-
public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): ?string
29+
public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string
3030
{
3131
$param = $uniqueNameFactory->createParameterName();
3232
$queryBuilder->setParameter($param, $args['value']);

tests/Blog/Filtering/SearchOperatorType.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ protected function getConfiguration(Types $types, LeafType $leafType): array
2626
];
2727
}
2828

29-
public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, array $args): ?string
29+
public function getDqlCondition(UniqueNameFactory $uniqueNameFactory, ClassMetadata $metadata, QueryBuilder $queryBuilder, string $alias, string $field, ?array $args): ?string
3030
{
3131
$words = preg_split('/[[:space:]]+/', $args['term'], -1, PREG_SPLIT_NO_EMPTY);
3232
if (!$words) {

0 commit comments

Comments
 (0)