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)) {
$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');

View File

@ -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');

View File

@ -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()

View File

@ -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');