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,27 @@ 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 (
83
+ '(%s) < %F ' ,
84
+ [$ sla ->getColumns ()['sla ' ]->getStatement (), $ threshold ]
85
+ ));
86
+ //$sla->filter(Filter::lessThan('sla', $threshold));
87
+ //$sla->getSelectBase()->where(['sla < ?' => $threshold]) requires to wrap Model again and
88
+ // order by sla after
89
+ }
90
+
91
+ foreach ($ sla as $ row ) {
92
+ yield $ row ;
93
+ }
94
+ };
95
+
72
96
if (isset ($ config ['breakdown ' ]) && $ config ['breakdown ' ] !== 'none ' ) {
73
97
switch ($ config ['breakdown ' ]) {
74
98
case 'day ' :
@@ -96,7 +120,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
96
120
$ rd ->setDimensions ($ dimensions );
97
121
98
122
foreach ($ this ->yieldTimerange ($ timerange , $ interval , $ boundary ) as list ($ start , $ end )) {
99
- foreach ($ this -> fetchSla (new Timerange ($ start , $ end ), $ filter ) as $ row ) {
123
+ foreach ($ yieldSla (new Timerange ($ start , $ end ), $ filter ) as $ row ) {
100
124
$ row = $ this ->createReportRow ($ row );
101
125
102
126
if ($ row === null ) {
@@ -111,7 +135,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
111
135
}
112
136
}
113
137
} else {
114
- foreach ($ this -> fetchSla ($ timerange , $ filter ) as $ row ) {
138
+ foreach ($ yieldSla ($ timerange , $ filter ) as $ row ) {
115
139
$ rows [] = $ this ->createReportRow ($ row );
116
140
}
117
141
}
@@ -129,7 +153,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
129
153
* @param string|null $boundary English text datetime description for calculating bounds to get
130
154
* calendar days, weeks or months instead of relative times according to interval
131
155
*
132
- * @return \ Generator
156
+ * @return Generator
133
157
*/
134
158
protected function yieldTimerange (Timerange $ timerange , DateInterval $ interval , $ boundary = null )
135
159
{
@@ -188,6 +212,12 @@ public function initConfigForm(Form $form)
188
212
'min ' => '1 ' ,
189
213
'max ' => '12 '
190
214
]);
215
+
216
+ $ form ->addElement ('checkbox ' , 'only-violation ' , [
217
+ 'label ' => t ('Show only critical SLA ' ),
218
+ 'checkedValue ' => '1 ' ,
219
+ 'uncheckedValue ' => '0 '
220
+ ]);
191
221
}
192
222
193
223
public function getData (Timerange $ timerange , array $ config = null )
0 commit comments