6
6
7
7
use DateInterval ;
8
8
use DatePeriod ;
9
+ use Generator ;
9
10
use Icinga \Module \Icingadb \Common \Auth ;
10
11
use Icinga \Module \Icingadb \Common \Database ;
11
12
use Icinga \Module \Icingadb \Widget \EmptyState ;
15
16
use Icinga \Module \Reporting \Timerange ;
16
17
use ipl \Html \Form ;
17
18
use ipl \Html \Html ;
19
+ use ipl \Orm \Query ;
20
+ use ipl \Sql \Expression ;
18
21
use ipl \Stdlib \Filter \Rule ;
19
22
use ipl \Web \Filter \QueryString ;
20
23
@@ -57,9 +60,9 @@ abstract protected function createReportRow($row);
57
60
* @param Timerange $timerange
58
61
* @param Rule|null $filter
59
62
*
60
- * @return iterable
63
+ * @return Query
61
64
*/
62
- abstract protected function fetchSla (Timerange $ timerange , Rule $ filter = null );
65
+ abstract protected function fetchSla (Timerange $ timerange , Rule $ filter = null ): Query ;
63
66
64
67
protected function fetchReportData (Timerange $ timerange , array $ config = null )
65
68
{
@@ -69,6 +72,25 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
69
72
$ filter = trim ((string ) $ config ['filter ' ]) ?: '* ' ;
70
73
$ filter = $ filter !== '* ' ? QueryString::parse ($ filter ) : null ;
71
74
75
+ $ yieldSla = function (Timerange $ timerange , Rule $ filter = null ) use ($ config ): Generator {
76
+ $ sla = $ this ->fetchSla ($ timerange , $ filter );
77
+
78
+ if ($ config ['only-violation ' ] === '1 ' ) {
79
+ $ threshold = $ config ['threshold ' ] ?? static ::DEFAULT_THRESHOLD ;
80
+
81
+ $ sla ->assembleSelect ();
82
+ $ sla ->getSelectBase ()->where (new Expression ('(%s) < %F ' ,
83
+ [$ sla ->getColumns ()['sla ' ]->getStatement (), $ threshold ]));
84
+ //$sla->filter(Filter::lessThan('sla', $threshold));
85
+ //$sla->getSelectBase()->where(['sla < ?' => $threshold]) requires to wrap Model again and
86
+ // order by sla after
87
+ }
88
+
89
+ foreach ($ sla as $ row ) {
90
+ yield $ row ;
91
+ }
92
+ };
93
+
72
94
if (isset ($ config ['breakdown ' ]) && $ config ['breakdown ' ] !== 'none ' ) {
73
95
switch ($ config ['breakdown ' ]) {
74
96
case 'day ' :
@@ -96,7 +118,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
96
118
$ rd ->setDimensions ($ dimensions );
97
119
98
120
foreach ($ this ->yieldTimerange ($ timerange , $ interval , $ boundary ) as list ($ start , $ end )) {
99
- foreach ($ this -> fetchSla (new Timerange ($ start , $ end ), $ filter ) as $ row ) {
121
+ foreach ($ yieldSla (new Timerange ($ start , $ end ), $ filter ) as $ row ) {
100
122
$ row = $ this ->createReportRow ($ row );
101
123
102
124
if ($ row === null ) {
@@ -111,7 +133,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
111
133
}
112
134
}
113
135
} else {
114
- foreach ($ this -> fetchSla ($ timerange , $ filter ) as $ row ) {
136
+ foreach ($ yieldSla ($ timerange , $ filter ) as $ row ) {
115
137
$ rows [] = $ this ->createReportRow ($ row );
116
138
}
117
139
}
@@ -129,7 +151,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
129
151
* @param string|null $boundary English text datetime description for calculating bounds to get
130
152
* calendar days, weeks or months instead of relative times according to interval
131
153
*
132
- * @return \ Generator
154
+ * @return Generator
133
155
*/
134
156
protected function yieldTimerange (Timerange $ timerange , DateInterval $ interval , $ boundary = null )
135
157
{
@@ -188,6 +210,12 @@ public function initConfigForm(Form $form)
188
210
'min ' => '1 ' ,
189
211
'max ' => '12 '
190
212
]);
213
+
214
+ $ form ->addElement ('checkbox ' , 'only-violation ' , [
215
+ 'label ' => t ('Show only critical SLA ' ),
216
+ 'checkedValue ' => '1 ' ,
217
+ 'uncheckedValue ' => '0 '
218
+ ]);
191
219
}
192
220
193
221
public function getData (Timerange $ timerange , array $ config = null )
0 commit comments