66
77use DateInterval ;
88use DatePeriod ;
9+ use Generator ;
910use Icinga \Module \Icingadb \Common \Auth ;
1011use Icinga \Module \Icingadb \Common \Database ;
1112use Icinga \Module \Icingadb \Widget \EmptyState ;
1516use Icinga \Module \Reporting \Timerange ;
1617use ipl \Html \Form ;
1718use ipl \Html \Html ;
19+ use ipl \Orm \Query ;
20+ use ipl \Sql \Expression ;
1821use ipl \Stdlib \Filter \Rule ;
1922use ipl \Web \Filter \QueryString ;
2023
@@ -57,9 +60,9 @@ abstract protected function createReportRow($row);
5760 * @param Timerange $timerange
5861 * @param Rule|null $filter
5962 *
60- * @return iterable
63+ * @return Query
6164 */
62- abstract protected function fetchSla (Timerange $ timerange , Rule $ filter = null );
65+ abstract protected function fetchSla (Timerange $ timerange , Rule $ filter = null ): Query ;
6366
6467 protected function fetchReportData (Timerange $ timerange , array $ config = null )
6568 {
@@ -69,6 +72,27 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
6972 $ filter = trim ((string ) $ config ['filter ' ]) ?: '* ' ;
7073 $ filter = $ filter !== '* ' ? QueryString::parse ($ filter ) : null ;
7174
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+
7296 if (isset ($ config ['breakdown ' ]) && $ config ['breakdown ' ] !== 'none ' ) {
7397 switch ($ config ['breakdown ' ]) {
7498 case 'day ' :
@@ -96,7 +120,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
96120 $ rd ->setDimensions ($ dimensions );
97121
98122 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 ) {
100124 $ row = $ this ->createReportRow ($ row );
101125
102126 if ($ row === null ) {
@@ -111,7 +135,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
111135 }
112136 }
113137 } else {
114- foreach ($ this -> fetchSla ($ timerange , $ filter ) as $ row ) {
138+ foreach ($ yieldSla ($ timerange , $ filter ) as $ row ) {
115139 $ rows [] = $ this ->createReportRow ($ row );
116140 }
117141 }
@@ -129,7 +153,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
129153 * @param string|null $boundary English text datetime description for calculating bounds to get
130154 * calendar days, weeks or months instead of relative times according to interval
131155 *
132- * @return \ Generator
156+ * @return Generator
133157 */
134158 protected function yieldTimerange (Timerange $ timerange , DateInterval $ interval , $ boundary = null )
135159 {
@@ -188,6 +212,12 @@ public function initConfigForm(Form $form)
188212 'min ' => '1 ' ,
189213 'max ' => '12 '
190214 ]);
215+
216+ $ form ->addElement ('checkbox ' , 'only-violation ' , [
217+ 'label ' => t ('Show only critical SLA ' ),
218+ 'checkedValue ' => '1 ' ,
219+ 'uncheckedValue ' => '0 '
220+ ]);
191221 }
192222
193223 public function getData (Timerange $ timerange , array $ config = null )
0 commit comments