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,25 @@ 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 ('(%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+
7294 if (isset ($ config ['breakdown ' ]) && $ config ['breakdown ' ] !== 'none ' ) {
7395 switch ($ config ['breakdown ' ]) {
7496 case 'day ' :
@@ -96,7 +118,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
96118 $ rd ->setDimensions ($ dimensions );
97119
98120 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 ) {
100122 $ row = $ this ->createReportRow ($ row );
101123
102124 if ($ row === null ) {
@@ -111,7 +133,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
111133 }
112134 }
113135 } else {
114- foreach ($ this -> fetchSla ($ timerange , $ filter ) as $ row ) {
136+ foreach ($ yieldSla ($ timerange , $ filter ) as $ row ) {
115137 $ rows [] = $ this ->createReportRow ($ row );
116138 }
117139 }
@@ -129,7 +151,7 @@ protected function fetchReportData(Timerange $timerange, array $config = null)
129151 * @param string|null $boundary English text datetime description for calculating bounds to get
130152 * calendar days, weeks or months instead of relative times according to interval
131153 *
132- * @return \ Generator
154+ * @return Generator
133155 */
134156 protected function yieldTimerange (Timerange $ timerange , DateInterval $ interval , $ boundary = null )
135157 {
@@ -188,6 +210,12 @@ public function initConfigForm(Form $form)
188210 'min ' => '1 ' ,
189211 'max ' => '12 '
190212 ]);
213+
214+ $ form ->addElement ('checkbox ' , 'only-violation ' , [
215+ 'label ' => t ('Show only critical SLA ' ),
216+ 'checkedValue ' => '1 ' ,
217+ 'uncheckedValue ' => '0 '
218+ ]);
191219 }
192220
193221 public function getData (Timerange $ timerange , array $ config = null )
0 commit comments