diff --git a/src/Compat/FilterProcessor.php b/src/Compat/FilterProcessor.php index d72171a..f3f324a 100644 --- a/src/Compat/FilterProcessor.php +++ b/src/Compat/FilterProcessor.php @@ -181,7 +181,10 @@ protected function requireAndResolveFilterColumns(Filter\Rule $filter, Query $qu foreach ($subQueryGroups as $relationPath => $columns) { $generalRules = []; foreach ($columns as $column => & $comparisons) { - if (isset($comparisons[Filter\Unequal::class])) { + if ( + isset($comparisons[Filter\Unequal::class]) + || isset($comparisons[Filter\HasNotValue::class]) + ) { // If there's a unequal (!=) comparison for any column, all other comparisons (for the same // column) also need to be outsourced to their own sub query. Regardless of their amount of // occurrence. This is because `$generalRules` apply to all comparisons of such a column and @@ -207,7 +210,10 @@ protected function requireAndResolveFilterColumns(Filter\Rule $filter, Query $qu $subQueryFilters = []; foreach ($columns as $column => $comparisons) { foreach ($comparisons as $conditionClass => $rules) { - if ($conditionClass === Filter\Unequal::class) { + if ( + $conditionClass === Filter\Unequal::class + || $conditionClass === Filter\HasNotValue::class + ) { // Unequal comparisons are always put into their own sub query $subQueryFilters[] = [$rules, count($rules), true]; } elseif (count($rules) > $count) { @@ -234,8 +240,19 @@ protected function requireAndResolveFilterColumns(Filter\Rule $filter, Query $qu if ($count !== null) { $aggregateFilter = Filter::any(); foreach ($filters as $condition) { - if ($negate && $condition instanceof Filter\Unequal) { - $negation = Filter::equal($condition->getColumn(), $condition->getValue()); + if ( + $negate + && ( + $condition instanceof Filter\Unequal + || $condition instanceof Filter\HasNotValue + ) + ) { + if ($condition instanceof Filter\Unequal) { + $negation = Filter::equal($condition->getColumn(), $condition->getValue()); + } else { + $negation = Filter::hasValue($condition->getColumn()); + } + $negation->metaData()->merge($condition->metaData()); $condition = $negation; $count = 1;