From 3edb5c3c94ebfb5eceb018d4bc39172a93c6bb4e Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 12 May 2022 16:26:07 +0200 Subject: [PATCH] IdoQuery: Introduce method `whereEx()` --- .../Backend/Ido/Query/CommentQuery.php | 11 +++++++++ .../Ido/Query/CommentdeletionhistoryQuery.php | 11 +++++++++ .../Backend/Ido/Query/CommenthistoryQuery.php | 11 +++++++++ .../Backend/Ido/Query/ContactQuery.php | 11 +++++++++ .../Backend/Ido/Query/CustomvarQuery.php | 15 ++++++++++++ .../Backend/Ido/Query/DowntimeQuery.php | 11 +++++++++ .../Ido/Query/DowntimeendhistoryQuery.php | 11 +++++++++ .../Ido/Query/DowntimestarthistoryQuery.php | 11 +++++++++ .../Backend/Ido/Query/EventhistoryQuery.php | 11 +++++++++ .../Ido/Query/FlappingstarthistoryQuery.php | 11 +++++++++ .../Ido/Query/HoststatussummaryQuery.php | 8 +++++++ .../Monitoring/Backend/Ido/Query/IdoQuery.php | 24 +++++++++++++++++++ .../Backend/Ido/Query/NotificationQuery.php | 11 +++++++++ .../Ido/Query/NotificationhistoryQuery.php | 11 +++++++++ .../Ido/Query/ServicestatussummaryQuery.php | 8 +++++++ .../Backend/Ido/Query/StatehistoryQuery.php | 11 +++++++++ .../Backend/Ido/Query/StatussummaryQuery.php | 11 +++++++++ .../library/Monitoring/DataView/DataView.php | 14 +++++++++++ 18 files changed, 212 insertions(+) diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/CommentQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/CommentQuery.php index 1d723a0c1..6c0193128 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/CommentQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/CommentQuery.php @@ -3,6 +3,7 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; +use Icinga\Data\Filter\FilterExpression; use Zend_Db_Expr; use Zend_Db_Select; use Icinga\Data\Filter\Filter; @@ -144,4 +145,14 @@ class CommentQuery extends IdoQuery } return $this; } + + public function whereEx(FilterExpression $ex) + { + $this->requireColumn($ex->getColumn()); + foreach ($this->subQueries as $sub) { + $sub->whereEx($ex); + } + + return $this; + } } diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/CommentdeletionhistoryQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/CommentdeletionhistoryQuery.php index 64ecb865b..8cb4ddbf6 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/CommentdeletionhistoryQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/CommentdeletionhistoryQuery.php @@ -3,6 +3,7 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; +use Icinga\Data\Filter\FilterExpression; use Zend_Db_Expr; use Zend_Db_Select; use Icinga\Data\Filter\Filter; @@ -165,4 +166,14 @@ class CommentdeletionhistoryQuery extends IdoQuery } return $this; } + + public function whereEx(FilterExpression $ex) + { + $this->requireColumn($ex->getColumn()); + foreach ($this->subQueries as $sub) { + $sub->whereEx($ex); + } + + return $this; + } } diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/CommenthistoryQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/CommenthistoryQuery.php index d49d6ea07..47dd97c0a 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/CommenthistoryQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/CommenthistoryQuery.php @@ -3,6 +3,7 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; +use Icinga\Data\Filter\FilterExpression; use Zend_Db_Expr; use Zend_Db_Select; use Icinga\Data\Filter\Filter; @@ -165,4 +166,14 @@ class CommenthistoryQuery extends IdoQuery } return $this; } + + public function whereEx(FilterExpression $ex) + { + $this->requireColumn($ex->getColumn()); + foreach ($this->subQueries as $sub) { + $sub->whereEx($ex); + } + + return $this; + } } diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/ContactQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/ContactQuery.php index 7a4a231f6..ca10323f1 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/ContactQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/ContactQuery.php @@ -3,6 +3,7 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; +use Icinga\Data\Filter\FilterExpression; use Zend_Db_Select; use Icinga\Data\Filter\Filter; @@ -106,6 +107,16 @@ class ContactQuery extends IdoQuery return $this; } + public function whereEx(FilterExpression $ex) + { + $this->requireColumn($ex->getColumn()); + foreach ($this->subQueries as $sub) { + $sub->whereEx($ex); + } + + return $this; + } + public function transformToUnion() { $this->contactQuery = $this->db->select(); diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/CustomvarQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/CustomvarQuery.php index c97cc916a..1492894e3 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/CustomvarQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/CustomvarQuery.php @@ -4,6 +4,7 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; use Icinga\Application\Config; +use Icinga\Data\Filter\FilterExpression; class CustomvarQuery extends IdoQuery { @@ -40,6 +41,20 @@ class CustomvarQuery extends IdoQuery return $this; } + public function whereEx(FilterExpression $ex) + { + $types = ['host' => 1, 'service' => 2, 'contact' => 10]; + if ($ex->getColumn() === 'object_type') { + $ex = clone $ex; + $ex->setColumn('object_type_id'); + $ex->setExpression($types[$ex->getExpression()]); + } + + parent::whereEx($ex); + + return $this; + } + protected function joinBaseTables() { if (version_compare($this->getIdoVersion(), '1.12.0', '<')) { diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/DowntimeQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/DowntimeQuery.php index 2c85c1547..9bc1d88be 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/DowntimeQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/DowntimeQuery.php @@ -3,6 +3,7 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; +use Icinga\Data\Filter\FilterExpression; use Zend_Db_Expr; use Zend_Db_Select; use Icinga\Data\Filter\Filter; @@ -149,4 +150,14 @@ class DowntimeQuery extends IdoQuery } return $this; } + + public function whereEx(FilterExpression $ex) + { + $this->requireColumn($ex->getColumn()); + foreach ($this->subQueries as $sub) { + $sub->whereEx($ex); + } + + return $this; + } } diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/DowntimeendhistoryQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/DowntimeendhistoryQuery.php index 99c2ed243..de47418f2 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/DowntimeendhistoryQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/DowntimeendhistoryQuery.php @@ -3,6 +3,7 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; +use Icinga\Data\Filter\FilterExpression; use Zend_Db_Expr; use Zend_Db_Select; use Icinga\Data\Filter\Filter; @@ -165,4 +166,14 @@ class DowntimeendhistoryQuery extends IdoQuery } return $this; } + + public function whereEx(FilterExpression $ex) + { + $this->requireColumn($ex->getColumn()); + foreach ($this->subQueries as $sub) { + $sub->whereEx($ex); + } + + return $this; + } } diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/DowntimestarthistoryQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/DowntimestarthistoryQuery.php index dd6c18b7b..3ba600ddd 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/DowntimestarthistoryQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/DowntimestarthistoryQuery.php @@ -3,6 +3,7 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; +use Icinga\Data\Filter\FilterExpression; use Zend_Db_Expr; use Zend_Db_Select; use Icinga\Data\Filter\Filter; @@ -165,4 +166,14 @@ class DowntimestarthistoryQuery extends IdoQuery } return $this; } + + public function whereEx(FilterExpression $ex) + { + $this->requireColumn($ex->getColumn()); + foreach ($this->subQueries as $sub) { + $sub->whereEx($ex); + } + + return $this; + } } diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/EventhistoryQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/EventhistoryQuery.php index 041028cda..680e2caa6 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/EventhistoryQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/EventhistoryQuery.php @@ -3,6 +3,7 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; +use Icinga\Data\Filter\FilterExpression; use Zend_Db_Select; use Icinga\Data\Filter\Filter; @@ -120,4 +121,14 @@ class EventhistoryQuery extends IdoQuery } return $this; } + + public function whereEx(FilterExpression $ex) + { + $this->requireColumn($ex->getColumn()); + foreach ($this->subQueries as $sub) { + $sub->whereEx($ex); + } + + return $this; + } } diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/FlappingstarthistoryQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/FlappingstarthistoryQuery.php index 9c24c0a47..5c8bec532 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/FlappingstarthistoryQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/FlappingstarthistoryQuery.php @@ -3,6 +3,7 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; +use Icinga\Data\Filter\FilterExpression; use Zend_Db_Expr; use Zend_Db_Select; use Icinga\Data\Filter\Filter; @@ -165,4 +166,14 @@ class FlappingstarthistoryQuery extends IdoQuery } return $this; } + + public function whereEx(FilterExpression $ex) + { + $this->requireColumn($ex->getColumn()); + foreach ($this->subQueries as $sub) { + $sub->whereEx($ex); + } + + return $this; + } } diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/HoststatussummaryQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/HoststatussummaryQuery.php index 7066dbb2c..5d7914389 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/HoststatussummaryQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/HoststatussummaryQuery.php @@ -4,6 +4,7 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; use Icinga\Data\Filter\Filter; +use Icinga\Data\Filter\FilterExpression; /** * Query for host group summaries @@ -80,4 +81,11 @@ class HoststatussummaryQuery extends IdoQuery $this->subSelect->where($condition, $value); return $this; } + + public function whereEx(FilterExpression $ex) + { + $this->subSelect->whereEx($ex); + + return $this; + } } diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/IdoQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/IdoQuery.php index eafe94bea..b7d4c0e15 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/IdoQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/IdoQuery.php @@ -783,6 +783,30 @@ abstract class IdoQuery extends DbQuery return parent::where($col, $value); } + /** + * Add a filter expression, with as less validation as possible + * + * @param FilterExpression $ex + * + * @internal If you use this outside the monitoring module, it's your fault if something breaks + * @return $this + */ + public function whereEx(FilterExpression $ex) + { + $this->requireColumn($ex->getColumn()); + $col = $this->getMappedField($ex->getColumn()); + if ($col === null) { + throw new IcingaException( + 'No such field: %s', + $ex->getColumn() + ); + } + + parent::addFilter((clone $ex)->setColumn($col)); + + return $this; + } + /** * Return true if an field contains an explicit timestamp * diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/NotificationQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/NotificationQuery.php index 9af24f79b..8bfb7253a 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/NotificationQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/NotificationQuery.php @@ -3,6 +3,7 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; +use Icinga\Data\Filter\FilterExpression; use Zend_Db_Expr; use Zend_Db_Select; use Icinga\Data\Filter\Filter; @@ -130,4 +131,14 @@ class NotificationQuery extends IdoQuery } return $this; } + + public function whereEx(FilterExpression $ex) + { + $this->requireColumn($ex->getColumn()); + foreach ($this->subQueries as $sub) { + $sub->whereEx($ex); + } + + return $this; + } } diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/NotificationhistoryQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/NotificationhistoryQuery.php index f08a2b916..f62911584 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/NotificationhistoryQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/NotificationhistoryQuery.php @@ -3,6 +3,7 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; +use Icinga\Data\Filter\FilterExpression; use Zend_Db_Expr; use Zend_Db_Select; use Icinga\Data\Filter\Filter; @@ -128,4 +129,14 @@ class NotificationhistoryQuery extends IdoQuery } return $this; } + + public function whereEx(FilterExpression $ex) + { + $this->requireColumn($ex->getColumn()); + foreach ($this->subQueries as $sub) { + $sub->whereEx($ex); + } + + return $this; + } } diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/ServicestatussummaryQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/ServicestatussummaryQuery.php index addc6850c..cf59cf3eb 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/ServicestatussummaryQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/ServicestatussummaryQuery.php @@ -4,6 +4,7 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; use Icinga\Data\Filter\Filter; +use Icinga\Data\Filter\FilterExpression; /** * Query for service status summary @@ -93,4 +94,11 @@ class ServicestatussummaryQuery extends IdoQuery $this->subSelect->where($condition, $value); return $this; } + + public function whereEx(FilterExpression $ex) + { + $this->subSelect->whereEx($ex); + + return $this; + } } diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/StatehistoryQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/StatehistoryQuery.php index 90befc60a..56d1e3bb7 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/StatehistoryQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/StatehistoryQuery.php @@ -3,6 +3,7 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; +use Icinga\Data\Filter\FilterExpression; use Zend_Db_Expr; use Zend_Db_Select; use Icinga\Data\Filter\Filter; @@ -165,4 +166,14 @@ class StatehistoryQuery extends IdoQuery } return $this; } + + public function whereEx(FilterExpression $ex) + { + $this->requireColumn($ex->getColumn()); + foreach ($this->subQueries as $sub) { + $sub->whereEx($ex); + } + + return $this; + } } diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/StatussummaryQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/StatussummaryQuery.php index c9c29b620..b1ee9e22d 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/StatussummaryQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/StatussummaryQuery.php @@ -3,6 +3,7 @@ namespace Icinga\Module\Monitoring\Backend\Ido\Query; +use Icinga\Data\Filter\FilterExpression; use Zend_Db_Expr; use Zend_Db_Select; use Icinga\Data\Filter\Filter; @@ -229,4 +230,14 @@ We have to find a better solution here. } return $this; } + + public function whereEx(FilterExpression $ex) + { + $this->requireColumn($ex->getColumn()); + foreach ($this->subQueries as $sub) { + $sub->whereEx($ex); + } + + return $this; + } } diff --git a/modules/monitoring/library/Monitoring/DataView/DataView.php b/modules/monitoring/library/Monitoring/DataView/DataView.php index e16656ec6..affc0f78f 100644 --- a/modules/monitoring/library/Monitoring/DataView/DataView.php +++ b/modules/monitoring/library/Monitoring/DataView/DataView.php @@ -94,6 +94,20 @@ abstract class DataView implements QueryInterface, SortRules, FilterColumns, Ite return $this; } + /** + * Add a filter expression, with as less validation as possible + * + * @param FilterExpression $ex + * + * @internal If you use this outside the monitoring module, it's your fault if something breaks + * @return $this + */ + public function whereEx(FilterExpression $ex) + { + $this->query->whereEx($ex); + return $this; + } + public function dump() { if (! $this->isSorted) {