monitoring: Eliminate unncessary GROUP BY clauses in the ServicestatusQuery

refs #9956
This commit is contained in:
Eric Lippmann 2015-08-18 16:37:14 +02:00
parent f5ffa8047c
commit 18f720d31f
1 changed files with 52 additions and 60 deletions

View File

@ -366,68 +366,60 @@ class ServicestatusQuery extends IdoQuery
if (! is_array($group)) { if (! is_array($group)) {
$group = array($group); $group = array($group);
} }
$groupedTables = array();
if ($this->hasJoinedVirtualTable('hostgroups') || $this->hasJoinedVirtualTable('servicegroups')) { if ($this->hasJoinedVirtualTable('servicegroups')) {
$group[] = 's.service_id'; $serviceGroupColumns = array_keys($this->columnMap['servicegroups']);
$group[] = 'so.object_id'; $selectedServiceGroupColumns = array_intersect($serviceGroupColumns, array_keys($this->columns));
if (! empty($selectedServiceGroupColumns)) {
if ($this->hasJoinedVirtualTable('hosts')) { $group[] = 'so.object_id';
$group[] = 'h.host_id'; $group[] = 's.service_id';
} $group[] = 'sgo.object_id';
$groupedTables['services'] = true;
if ($this->hasJoinedVirtualTable('hoststatus')) { $groupedTables['servicegroups'] = true;
$group[] = 'hs.hoststatus_id'; }
} }
if ($this->hasJoinedVirtualTable('hostgroups')) {
if ($this->hasJoinedVirtualTable('servicestatus')) { $hostGroupColumns = array_keys($this->columnMap['hostgroups']);
$group[] = 'ss.servicestatus_id'; $selectedHostGroupColumns = array_intersect($hostGroupColumns, array_keys($this->columns));
} if (! empty($selectedHostGroupColumns)) {
if (! isset($groupedTables['services'])) {
if ($this->hasJoinedVirtualTable('hostgroups')) { $group[] = 'so.object_id';
$selected = false; $group[] = 's.service_id';
foreach ($this->columns as $alias => $column) { $groupedTables['services'] = true;
if ($column instanceof Zend_Db_Expr) { }
continue; $group[] = 'hgo.object_id';
} $groupedTables['hostgroups'] = true;
}
$table = $this->aliasToTableName( }
$this->hasAliasName($alias) ? $alias : $this->customAliasToAlias($alias) if (! empty($groupedTables)) {
); foreach ($this->columns as $alias => $column) {
if ($table === 'hostgroups') { if ($column instanceof Zend_Db_Expr || $column === '(NULL)') {
$selected = true; continue;
break; }
} $tableName = $this->aliasToTableName(
} $this->hasAliasName($alias) ? $alias : $this->customAliasToAlias($alias)
);
if ($selected) { if (isset($groupedTables[$tableName])) {
$group[] = 'hg.hostgroup_id'; continue;
$group[] = 'hgo.object_id'; }
} switch ($tableName) {
} case 'hosts':
$groupColumn = 'h.host_id';
if ($this->hasJoinedVirtualTable('servicegroups')) { break;
$selected = false; case 'hoststatus':
foreach ($this->columns as $alias => $column) { $groupColumn = 'hs.hoststatus_id';
if ($column instanceof Zend_Db_Expr) { break;
continue; case 'servicestatus':
} $groupColumn = 'ss.servicestatus_id';
break;
$table = $this->aliasToTableName( default:
$this->hasAliasName($alias) ? $alias : $this->customAliasToAlias($alias) continue 2;
); }
if ($table === 'servicegroups') { /** @var string $groupColumn */
$selected = true; $group[] = $groupColumn;
break; $groupedTables[$tableName] = true;
}
}
if ($selected) {
$group[] = 'sg.servicegroup_id';
$group[] = 'sgo.object_id';
}
} }
} }
return $group; return $group;
} }
} }