Skip to content

Commit af39a5d

Browse files
committed
Objects: Correctly optimize negated tag filters
This is essentially the same fix applied in Icinga DB Web Icinga/icingadb-web#978
1 parent 35e8ad4 commit af39a5d

2 files changed

Lines changed: 30 additions & 8 deletions

File tree

library/Notifications/Model/Behavior/ObjectTags.php

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,21 +29,24 @@ public function setQuery(Query $query): static
2929

3030
public function rewriteCondition(Filter\Condition $condition, $relation = null): ?Rule
3131
{
32-
$filterAll = null;
3332
/** @var string $relation */
3433
/** @var ?string $column */
3534
$column = $condition->metaData()->get('columnName');
3635
if ($column !== null) {
36+
// TODO: ipl/orm is still unable to correctly optimize such relations, hence this
37+
// is the same fix as for https://github.com/Icinga/icingadb-web/issues/865
3738
$relation = substr($relation, 0, -4) . 'object_id_tag.';
38-
39-
$nameFilter = Filter::like($relation . 'tag', $column);
40-
$class = get_class($condition);
41-
$valueFilter = new $class($relation . 'value', $condition->getValue());
42-
43-
$filterAll = Filter::all($nameFilter, $valueFilter);
39+
$condition->metaData()
40+
->set('forceResolved', true)
41+
->set('requiresTransformation', true)
42+
->set('columnPath', $relation . $column)
43+
->set('relationPath', substr($relation, 0, -1));
44+
$condition->setColumn('always_the_same_but_totally_irrelevant');
45+
46+
return $condition;
4447
}
4548

46-
return $filterAll;
49+
return null;
4750
}
4851

4952
public function rewriteColumn($column, ?string $relation = null): AliasedExpression

library/Notifications/Model/ObjectIdTag.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@
77

88
use ipl\Orm\Behavior\Binary;
99
use ipl\Orm\Behaviors;
10+
use ipl\Orm\Contract\RewriteFilterBehavior;
1011
use ipl\Orm\Model;
1112
use ipl\Orm\Relations;
13+
use ipl\Stdlib\Filter;
14+
use ipl\Stdlib\Filter\Condition;
1215

1316
/**
1417
* ObjectIdTag database model
@@ -41,6 +44,22 @@ public function getColumns(): array
4144
public function createBehaviors(Behaviors $behaviors): void
4245
{
4346
$behaviors->add(new Binary(['object_id']));
47+
$behaviors->add(new class implements RewriteFilterBehavior {
48+
public function rewriteCondition(Condition $condition, $relation = null): ?Filter\Chain
49+
{
50+
if ($condition->metaData()->has('requiresTransformation')) {
51+
/** @var string $columnName */
52+
$columnName = $condition->metaData()->get('columnName');
53+
$nameFilter = Filter::like($relation . 'tag', $columnName);
54+
$class = get_class($condition);
55+
$valueFilter = new $class($relation . 'value', $condition->getValue());
56+
57+
return Filter::all($nameFilter, $valueFilter);
58+
}
59+
60+
return null;
61+
}
62+
});
4463
}
4564

4665
public function createRelations(Relations $relations): void

0 commit comments

Comments
 (0)