Skip to content

Commit 4984f68

Browse files
committed
ServicegroupSummary: Don't use unions & sub-selects for ServicegroupSummary
1 parent 9272e35 commit 4984f68

File tree

2 files changed

+36
-68
lines changed

2 files changed

+36
-68
lines changed

application/controllers/ServicegroupController.php

+3-6
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,9 @@ public function init()
2727
$name = $this->params->getRequired('name');
2828

2929
$query = ServicegroupSummary::on($this->getDb());
30-
$query->disableDefaultSort();
31-
32-
foreach ($query->getUnions() as $unionPart) {
33-
$unionPart->filter(Filter::equal('servicegroup.name', $name));
34-
$unionPart->disableDefaultSort();
35-
}
30+
$query
31+
->disableDefaultSort()
32+
->filter(Filter::equal('servicegroup.name', $name));
3633

3734
$this->applyRestrictions($query);
3835

library/Icingadb/Model/ServicegroupSummary.php

+33-62
Original file line numberDiff line numberDiff line change
@@ -4,57 +4,58 @@
44

55
namespace Icinga\Module\Icingadb\Model;
66

7-
use ipl\Orm\UnionModel;
7+
use ipl\Orm\Query;
88
use ipl\Sql\Expression;
99

10-
class ServicegroupSummary extends UnionModel
10+
class ServicegroupSummary extends Servicegroup
1111
{
12-
public function getTableName()
13-
{
14-
return 'servicegroup';
15-
}
16-
17-
public function getKeyName()
18-
{
19-
return ['id' => 'servicegroup_id'];
20-
}
21-
2212
public function getColumns()
2313
{
2414
return [
25-
'display_name' => 'servicegroup_display_name',
26-
'name' => 'servicegroup_name',
15+
'display_name' => 'display_name',
16+
'name' => 'name',
2717
'services_critical_handled' => new Expression(
28-
'SUM(CASE WHEN service_state = 2 AND service_handled = \'y\' THEN 1 ELSE 0 END)'
18+
'SUM(CASE WHEN servicegroup_service_state.soft_state = 2
19+
AND servicegroup_service_state.is_handled = \'y\' THEN 1 ELSE 0 END)'
2920
),
3021
'services_critical_unhandled' => new Expression(
31-
'SUM(CASE WHEN service_state = 2 AND service_handled = \'n\' THEN 1 ELSE 0 END)'
22+
'SUM(CASE WHEN servicegroup_service_state.soft_state = 2
23+
AND servicegroup_service_state.is_handled = \'n\' THEN 1 ELSE 0 END)'
3224
),
3325
'services_ok' => new Expression(
34-
'SUM(CASE WHEN service_state = 0 THEN 1 ELSE 0 END)'
26+
'SUM(CASE WHEN servicegroup_service_state.soft_state = 0 THEN 1 ELSE 0 END)'
3527
),
3628
'services_pending' => new Expression(
37-
'SUM(CASE WHEN service_state = 99 THEN 1 ELSE 0 END)'
29+
'SUM(CASE WHEN servicegroup_service_state.soft_state = 99 THEN 1 ELSE 0 END)'
3830
),
3931
'services_total' => new Expression(
40-
'SUM(CASE WHEN service_id IS NOT NULL THEN 1 ELSE 0 END)'
32+
'SUM(CASE WHEN servicegroup_servicegroup_member.service_id IS NOT NULL THEN 1 ELSE 0 END)'
4133
),
4234
'services_unknown_handled' => new Expression(
43-
'SUM(CASE WHEN service_state = 3 AND service_handled = \'y\' THEN 1 ELSE 0 END)'
35+
'SUM(CASE WHEN servicegroup_service_state.soft_state = 3
36+
AND servicegroup_service_state.is_handled = \'y\' THEN 1 ELSE 0 END)'
4437
),
4538
'services_unknown_unhandled' => new Expression(
46-
'SUM(CASE WHEN service_state = 3 AND service_handled = \'n\' THEN 1 ELSE 0 END)'
39+
'SUM(CASE WHEN servicegroup_service_state.soft_state = 3
40+
AND servicegroup_service_state.is_handled = \'n\' THEN 1 ELSE 0 END)'
4741
),
4842
'services_warning_handled' => new Expression(
49-
'SUM(CASE WHEN service_state = 1 AND service_handled = \'y\' THEN 1 ELSE 0 END)'
43+
'SUM(CASE WHEN servicegroup_service_state.soft_state = 1
44+
AND servicegroup_service_state.is_handled = \'y\' THEN 1 ELSE 0 END)'
5045
),
5146
'services_warning_unhandled' => new Expression(
52-
'SUM(CASE WHEN service_state = 1 AND service_handled = \'n\' THEN 1 ELSE 0 END)'
47+
'SUM(CASE WHEN servicegroup_service_state.soft_state = 1
48+
AND servicegroup_service_state.is_handled = \'n\' THEN 1 ELSE 0 END)'
5349
),
54-
'services_severity' => new Expression('MAX(service_severity)')
50+
'services_severity' => new Expression('MAX(servicegroup_service_state.severity)')
5551
];
5652
}
5753

54+
public function getMetaData()
55+
{
56+
return [];
57+
}
58+
5859
public function getAggregateColumns()
5960
{
6061
return true;
@@ -65,45 +66,15 @@ public function getSearchColumns()
6566
return ['display_name'];
6667
}
6768

68-
public function getDefaultSort()
69-
{
70-
return 'display_name';
71-
}
72-
73-
public function getUnions()
69+
public function createDefaultUtilize(Query $query)
7470
{
75-
$unions = [
76-
[
77-
Servicegroup::class,
78-
[],
79-
[
80-
'servicegroup_id' => 'servicegroup.id',
81-
'servicegroup_name' => 'servicegroup.name',
82-
'servicegroup_display_name' => 'servicegroup.display_name',
83-
'service_id' => new Expression('NULL'),
84-
'service_state' => new Expression('NULL'),
85-
'service_handled' => new Expression('NULL'),
86-
'service_severity' => new Expression('0')
87-
]
88-
],
89-
[
90-
Service::class,
91-
[
92-
'servicegroup',
93-
'state'
94-
],
95-
[
96-
'servicegroup_id' => 'servicegroup.id',
97-
'servicegroup_name' => new Expression('NULL'),
98-
'servicegroup_display_name' => new Expression('NULL'),
99-
'service_id' => 'service.id',
100-
'service_state' => 'state.soft_state',
101-
'service_handled' => 'state.is_handled',
102-
'service_severity' => 'state.severity'
103-
]
104-
]
105-
];
71+
$query->utilize([
72+
'service',
73+
'service.state'
74+
]);
10675

107-
return $unions;
76+
// We need to select all servicegroups regardless of whether they have services or not
77+
$query->getUtilize()['servicegroup.service']->setJoinType('LEFT');
78+
$query->getUtilize()['servicegroup.service.state']->setJoinType('LEFT');
10879
}
10980
}

0 commit comments

Comments
 (0)