Merge pull request #3917 from Icinga/fix/flawed-group-filter-chains-3916

Fix flawed group filter chains
This commit is contained in:
Johannes Meyer 2019-08-14 13:02:05 +02:00 committed by GitHub
commit cc19e68dfb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 13 additions and 19 deletions

View File

@ -312,17 +312,19 @@ class DbQuery extends SimpleQuery
if (! empty($comp)) { if (! empty($comp)) {
$sql[] = $col . ' IN (' . $this->escapeForSql($comp) . ')'; $sql[] = $col . ' IN (' . $this->escapeForSql($comp) . ')';
} }
$operator = 'OR';
} elseif ($sign === '!=') { } elseif ($sign === '!=') {
if (! empty($comp)) { if (! empty($comp)) {
$sql[] = sprintf('(%1$s NOT IN (%2$s) OR %1$s IS NULL)', $col, $this->escapeForSql($comp)); $sql[] = sprintf('(%1$s NOT IN (%2$s) OR %1$s IS NULL)', $col, $this->escapeForSql($comp));
} }
$operator = 'AND';
} else { } else {
throw new QueryException( throw new QueryException(
'Unable to render array expressions with operators other than equal or not equal' 'Unable to render array expressions with operators other than equal or not equal'
); );
} }
return '(' . implode(' OR ', $sql) . ')'; return '(' . implode(" $operator ", $sql) . ')';
} elseif ($sign === '=' && strpos($expression, '*') !== false) { } elseif ($sign === '=' && strpos($expression, '*') !== false) {
if ($expression === '*') { if ($expression === '*') {
return new Zend_Db_Expr('TRUE'); return new Zend_Db_Expr('TRUE');

View File

@ -3,8 +3,6 @@
namespace Icinga\Module\Monitoring\Backend\Ido\Query; namespace Icinga\Module\Monitoring\Backend\Ido\Query;
use Icinga\Exception\NotImplementedError;
/** /**
* Query for host groups * Query for host groups
*/ */
@ -276,13 +274,8 @@ class HostgroupQuery extends IdoQuery
protected function joinSubQuery(IdoQuery $query, $name, $filter, $and, $negate, &$additionalFilter) protected function joinSubQuery(IdoQuery $query, $name, $filter, $and, $negate, &$additionalFilter)
{ {
if ($name === 'hostgroup') { if ($name === 'hostgroup') {
if (! $and) {
// IN AND NOT IN works for OR filters w/o subquery joins
throw new NotImplementedError('');
} else {
// Propagate that the "parent" query has to be filtered as well // Propagate that the "parent" query has to be filtered as well
$additionalFilter = clone $filter; $additionalFilter = clone $filter;
}
$this->requireVirtualTable('members'); $this->requireVirtualTable('members');

View File

@ -633,6 +633,12 @@ abstract class IdoQuery extends DbQuery
new Zend_Db_Expr($ours) new Zend_Db_Expr($ours)
)); ));
if (! $negate) {
$subQueryFilter = $subQueryFilter->orFilter(
new FilterExpression($ours, '', new Zend_Db_Expr('IS NULL'))
);
}
$subQuery $subQuery
->setFilter($subQueryFilter) ->setFilter($subQueryFilter)
->clearGroupingRules() ->clearGroupingRules()

View File

@ -3,8 +3,6 @@
namespace Icinga\Module\Monitoring\Backend\Ido\Query; namespace Icinga\Module\Monitoring\Backend\Ido\Query;
use Icinga\Exception\NotImplementedError;
class ServicegroupQuery extends IdoQuery class ServicegroupQuery extends IdoQuery
{ {
protected $groupBase = array( protected $groupBase = array(
@ -290,13 +288,8 @@ class ServicegroupQuery extends IdoQuery
return ['so.object_id', 'so.object_id']; return ['so.object_id', 'so.object_id'];
} elseif ($name === 'servicegroup') { } elseif ($name === 'servicegroup') {
if (! $and) {
// IN AND NOT IN for OR filters works w/o subquery joins
throw new NotImplementedError('');
} else {
// Propagate that the "parent" query has to be filtered as well // Propagate that the "parent" query has to be filtered as well
$additionalFilter = clone $filter; $additionalFilter = clone $filter;
}
$this->requireVirtualTable('members'); $this->requireVirtualTable('members');