Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 21 additions & 4 deletions src/Compat/FilterProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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) {
Expand All @@ -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;
Expand Down