From 925348d1714dccbf9d4184800ee9451e36c35f37 Mon Sep 17 00:00:00 2001
From: Thomas Gelf <thomas@gelf.net>
Date: Fri, 14 Nov 2014 23:06:20 +0100
Subject: [PATCH] Data\Filter: add or/andFilter implementations

Those shortcuts make it easy to correctly add or/and conditions
regardless of the original filter type
---
 library/Icinga/Data/Filter/Filter.php           |  4 ++++
 library/Icinga/Data/Filter/FilterAnd.php        | 10 ++++++++++
 library/Icinga/Data/Filter/FilterExpression.php | 10 ++++++++++
 library/Icinga/Data/Filter/FilterNot.php        | 10 ++++++++++
 library/Icinga/Data/Filter/FilterOr.php         | 10 ++++++++++
 5 files changed, 44 insertions(+)

diff --git a/library/Icinga/Data/Filter/Filter.php b/library/Icinga/Data/Filter/Filter.php
index dcedfdf95..a0a56e4bb 100644
--- a/library/Icinga/Data/Filter/Filter.php
+++ b/library/Icinga/Data/Filter/Filter.php
@@ -30,6 +30,10 @@ abstract class Filter
 
     abstract public function toQueryString();
 
+    abstract public function andFilter(Filter $filter);
+
+    abstract public function orFilter(Filter $filter);
+
     public function getUrlParams()
     {
         return UrlParams::fromQueryString($this->toQueryString());
diff --git a/library/Icinga/Data/Filter/FilterAnd.php b/library/Icinga/Data/Filter/FilterAnd.php
index 899f488ce..8fd2f2411 100644
--- a/library/Icinga/Data/Filter/FilterAnd.php
+++ b/library/Icinga/Data/Filter/FilterAnd.php
@@ -30,4 +30,14 @@ class FilterAnd extends FilterChain
         }
         return true;
     }
+
+    public function andFilter(Filter $filter)
+    {
+        return $this->addFilter($filter);
+    }
+
+    public function orFilter(Filter $filter)
+    {
+        return Filter::matchAny($this, $filter);
+    }
 }
diff --git a/library/Icinga/Data/Filter/FilterExpression.php b/library/Icinga/Data/Filter/FilterExpression.php
index 8f78d6a87..f87f3602f 100644
--- a/library/Icinga/Data/Filter/FilterExpression.php
+++ b/library/Icinga/Data/Filter/FilterExpression.php
@@ -107,4 +107,14 @@ class FilterExpression extends Filter
             return (bool) preg_match($pattern, $row->{$this->column});
         }
     }
+
+    public function andFilter(Filter $filter)
+    {
+        return Filter::matchAll($this, $filter);
+    }
+
+    public function orFilter(Filter $filter)
+    {
+        return Filter::matchAny($this, $filter);
+    }
 }
diff --git a/library/Icinga/Data/Filter/FilterNot.php b/library/Icinga/Data/Filter/FilterNot.php
index a49a7ab3d..5e63691f1 100644
--- a/library/Icinga/Data/Filter/FilterNot.php
+++ b/library/Icinga/Data/Filter/FilterNot.php
@@ -22,6 +22,16 @@ class FilterNot extends FilterChain
         return true;
     }
 
+    public function andFilter(Filter $filter)
+    {
+        return Filter::matchAll($this, $filter);
+    }
+
+    public function orFilter(Filter $filter)
+    {
+        return Filter::matchAny($filter);
+    }
+
     public function toQueryString()
     {
         $parts = array();
diff --git a/library/Icinga/Data/Filter/FilterOr.php b/library/Icinga/Data/Filter/FilterOr.php
index 427c17fd2..4e4de2d66 100644
--- a/library/Icinga/Data/Filter/FilterOr.php
+++ b/library/Icinga/Data/Filter/FilterOr.php
@@ -19,4 +19,14 @@ class FilterOr extends FilterChain
         }
         return false;
     }
+
+    public function andFilter(Filter $filter)
+    {
+        return Filter::matchAll($this, $filter);
+    }
+
+    public function orFilter(Filter $filter)
+    {
+        return $this->addFilter($filter);
+    }
 }