diff --git a/library/Icinga/Data/Db/DbQuery.php b/library/Icinga/Data/Db/DbQuery.php index 25de96742..fffd7b08a 100644 --- a/library/Icinga/Data/Db/DbQuery.php +++ b/library/Icinga/Data/Db/DbQuery.php @@ -312,17 +312,19 @@ class DbQuery extends SimpleQuery if (! empty($comp)) { $sql[] = $col . ' IN (' . $this->escapeForSql($comp) . ')'; } + $operator = 'OR'; } elseif ($sign === '!=') { if (! empty($comp)) { $sql[] = sprintf('(%1$s NOT IN (%2$s) OR %1$s IS NULL)', $col, $this->escapeForSql($comp)); } + $operator = 'AND'; } else { throw new QueryException( '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) { if ($expression === '*') { return new Zend_Db_Expr('TRUE'); diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/HostgroupQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/HostgroupQuery.php index 8b6b74435..15372ded2 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/HostgroupQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/HostgroupQuery.php @@ -3,8 +3,6 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; -use Icinga\Exception\NotImplementedError; - /** * Query for host groups */ @@ -276,13 +274,8 @@ class HostgroupQuery extends IdoQuery protected function joinSubQuery(IdoQuery $query, $name, $filter, $and, $negate, &$additionalFilter) { 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 - $additionalFilter = clone $filter; - } + // Propagate that the "parent" query has to be filtered as well + $additionalFilter = clone $filter; $this->requireVirtualTable('members'); diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/IdoQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/IdoQuery.php index 7a39f48d1..51df5e7b7 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/IdoQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/IdoQuery.php @@ -633,6 +633,12 @@ abstract class IdoQuery extends DbQuery new Zend_Db_Expr($ours) )); + if (! $negate) { + $subQueryFilter = $subQueryFilter->orFilter( + new FilterExpression($ours, '', new Zend_Db_Expr('IS NULL')) + ); + } + $subQuery ->setFilter($subQueryFilter) ->clearGroupingRules() diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/ServicegroupQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/ServicegroupQuery.php index d43c7d7a3..8ad3de7c7 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/ServicegroupQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/ServicegroupQuery.php @@ -3,8 +3,6 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; -use Icinga\Exception\NotImplementedError; - class ServicegroupQuery extends IdoQuery { protected $groupBase = array( @@ -290,13 +288,8 @@ class ServicegroupQuery extends IdoQuery return ['so.object_id', 'so.object_id']; } 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 - $additionalFilter = clone $filter; - } + // Propagate that the "parent" query has to be filtered as well + $additionalFilter = clone $filter; $this->requireVirtualTable('members');