Merge branch 'bugfix/monitoring-list-duplicates-7057'

refs #7057
This commit is contained in:
Alexander Fuhr 2014-10-06 13:07:54 +02:00
commit d27d993395
7 changed files with 86 additions and 7 deletions

View File

@ -59,6 +59,13 @@ class DbQuery extends SimpleQuery
*/ */
protected $count; protected $count;
/**
* GROUP BY clauses
*
* @var string|array
*/
protected $group;
protected function init() protected function init()
{ {
$this->db = $this->ds->getDbAdapter(); $this->db = $this->ds->getDbAdapter();
@ -100,6 +107,10 @@ class DbQuery extends SimpleQuery
} }
} }
if ($this->group) {
$select->group($this->group);
}
$select->columns($this->columns); $select->columns($this->columns);
$this->applyFilterSql($select); $this->applyFilterSql($select);
@ -300,4 +311,17 @@ class DbQuery extends SimpleQuery
{ {
return (string) $this->getSelectQuery(); return (string) $this->getSelectQuery();
} }
/**
* Add a GROUP BY clause
*
* @param string|array $group
*
* @return $this
*/
public function group($group)
{
$this->group = $group;
return $this;
}
} }

View File

@ -0,0 +1,12 @@
<?php
// {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Exception;
/**
* Exception thrown if a query contains invalid parameters
*/
class QueryException extends IcingaException
{
}

View File

@ -44,7 +44,6 @@ class GroupSummaryQuery extends IdoQuery
$columns = array( $columns = array(
'object_type', 'object_type',
'host_state', 'host_state',
'host_name'
); );
// Prepend group column since we'll use columns index 0 later for grouping // Prepend group column since we'll use columns index 0 later for grouping
@ -61,6 +60,9 @@ class GroupSummaryQuery extends IdoQuery
'in_downtime' => 'host_in_downtime' 'in_downtime' => 'host_in_downtime'
) )
); );
if (in_array('servicegroup', $this->desiredColumns)) {
$hosts->group(array('sgo.name1', 'ho.object_id', 'state', 'acknowledged', 'in_downtime'));
}
$services = $this->createSubQuery( $services = $this->createSubQuery(
'Status', 'Status',
$columns + array( $columns + array(

View File

@ -6,12 +6,14 @@ namespace Icinga\Module\Monitoring\DataView;
use Countable; use Countable;
use Icinga\Data\Filter\Filter; use Icinga\Data\Filter\Filter;
use Icinga\Data\Filter\FilterMatch;
use Icinga\Data\SimpleQuery; use Icinga\Data\SimpleQuery;
use Icinga\Data\Browsable; use Icinga\Data\Browsable;
use Icinga\Data\PivotTable; use Icinga\Data\PivotTable;
use Icinga\Data\Sortable; use Icinga\Data\Sortable;
use Icinga\Data\ConnectionInterface; use Icinga\Data\ConnectionInterface;
use Icinga\Data\Filterable; use Icinga\Data\Filterable;
use Icinga\Exception\QueryException;
use Icinga\Web\Request; use Icinga\Web\Request;
use Icinga\Web\Url; use Icinga\Web\Url;
use Icinga\Module\Monitoring\Backend; use Icinga\Module\Monitoring\Backend;
@ -206,13 +208,13 @@ public function dump()
if ($sortRules !== null) { if ($sortRules !== null) {
if ($column === null) { if ($column === null) {
$sortColumns = reset($sortRules); $sortColumns = reset($sortRules);
if (!isset($sortColumns['columns'])) { if (! isset($sortColumns['columns'])) {
$sortColumns['columns'] = array(key($sortRules)); $sortColumns['columns'] = array(key($sortRules));
} }
} else { } else {
if (isset($sortRules[$column])) { if (isset($sortRules[$column])) {
$sortColumns = $sortRules[$column]; $sortColumns = $sortRules[$column];
if (!isset($sortColumns['columns'])) { if (! isset($sortColumns['columns'])) {
$sortColumns['columns'] = array($column); $sortColumns['columns'] = array($column);
} }
} else { } else {
@ -227,6 +229,13 @@ public function dump()
$order = (strtoupper($order) === self::SORT_ASC) ? 'ASC' : 'DESC'; $order = (strtoupper($order) === self::SORT_ASC) ? 'ASC' : 'DESC';
foreach ($sortColumns['columns'] as $column) { foreach ($sortColumns['columns'] as $column) {
if (! $this->isValidFilterTarget($column)) {
throw new QueryException(
t('The sort column "%s" is not allowed in "%s".'),
$column,
get_class($this)
);
}
$this->query->order($column, $order); $this->query->order($column, $order);
} }
$this->isSorted = true; $this->isSorted = true;
@ -289,15 +298,44 @@ public function dump()
*/ */
public function getQuery() public function getQuery()
{ {
if (! $this->isSorted) { $this->sort(); } if (! $this->isSorted) {
$this->order();
}
return $this->query; return $this->query;
} }
public function applyFilter(Filter $filter) public function applyFilter(Filter $filter)
{ {
$this->validateFilterColumns($filter);
return $this->addFilter($filter); return $this->addFilter($filter);
} }
/**
* Validates recursive the Filter columns against the isValidFilterTarget() method
*
* @param Filter $filter
*
* @throws \Icinga\Data\Filter\FilterException
*/
public function validateFilterColumns(Filter $filter)
{
if ($filter instanceof FilterMatch) {
if (! $this->isValidFilterTarget($filter->getColumn())) {
throw new QueryException(
t('The filter column "%s" is not allowed here.'),
$filter->getColumn()
);
}
}
if (method_exists($filter, 'filters')) {
foreach ($filter->filters() as $filter) {
$this->validateFilterColumns($filter);
}
}
}
public function clearFilter() public function clearFilter()
{ {
$this->query->clearFilter(); $this->query->clearFilter();

View File

@ -64,7 +64,8 @@ class HostStatus extends DataView
'host_percent_state_change', 'host_percent_state_change',
'host_modified_host_attributes', 'host_modified_host_attributes',
'host_severity', 'host_severity',
'host_problem' 'host_problem',
'host_ipv4'
); );
} }
@ -105,7 +106,7 @@ class HostStatus extends DataView
public function getFilterColumns() public function getFilterColumns()
{ {
return array('hostgroup', 'service_problems'); return array('hostgroup', 'service_problems', 'servicegroup');
} }
public function isValidFilterTarget($column) public function isValidFilterTarget($column)

View File

@ -101,6 +101,7 @@ class ServiceStatus extends DataView
'service_flap_detection_enabled', 'service_flap_detection_enabled',
'service_flap_detection_enabled_changed', 'service_flap_detection_enabled_changed',
'service_modified_service_attributes', 'service_modified_service_attributes',
'service_host_name'
); );
} }

View File

@ -191,7 +191,8 @@ class Service extends MonitoredObject
'service_flap_detection_enabled_changed', 'service_flap_detection_enabled_changed',
'service_modified_service_attributes', 'service_modified_service_attributes',
'service_process_performance_data', 'service_process_performance_data',
'service_percent_state_change' 'service_percent_state_change',
'service_host_name'
)) ))
->where('host_name', $this->host->getName()) ->where('host_name', $this->host->getName())
->where('service_description', $this->service); ->where('service_description', $this->service);