From 617a83ea6928570b9de9ea6288319e53dedefeb6 Mon Sep 17 00:00:00 2001
From: Martynas Sudintas <martynas.sudintas@ongr.io>
Date: Wed, 29 Apr 2015 13:39:31 +0300
Subject: [PATCH] improved AndFilter with setters

---
 Filter/AndFilter.php | 64 ++++++++++++++++++++++++++++++++++----------
 1 file changed, 50 insertions(+), 14 deletions(-)

diff --git a/Filter/AndFilter.php b/Filter/AndFilter.php
index b8d1154..a3bfb16 100644
--- a/Filter/AndFilter.php
+++ b/Filter/AndFilter.php
@@ -16,32 +16,60 @@ use ONGR\ElasticsearchBundle\DSL\ParametersTrait;
 
 /**
  * Represents Elasticsearch "and" filter.
+ *
+ * @link http://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-and-filter.html
  */
 class AndFilter implements BuilderInterface
 {
     use ParametersTrait;
 
     /**
-     * @var BuilderInterface[]
+     * @var array
      */
-    private $filters;
-
+    private $filters = [];
+    
     /**
-     * @param BuilderInterface[] $filters    Array.
+     * @param BuilderInterface[] $filters    Filter array.
      * @param array              $parameters Optional parameters.
      */
-    public function __construct($filters, array $parameters = [])
+    public function __construct(array $filters = [], array $parameters = [])
     {
-        $this->filters = $filters;
+        $this->set($filters);
         $this->setParameters($parameters);
     }
 
     /**
-     * {@inheritdoc}
+     * Sets filters.
+     *
+     * @param BuilderInterface[] $filters Filter array.
      */
-    public function getType()
+    public function set(array $filters)
     {
-        return 'and';
+        foreach ($filters as $filter) {
+            $this->add($filter);
+        }
+    }
+    
+    /**
+     * Adds filter.
+     *
+     * @param BuilderInterface $filter
+     *
+     * @return AndFilter
+     */
+    public function add(BuilderInterface $filter)
+    {
+        $this->filters[] = [$filter->getType() => $filter->toArray()];
+        
+        return $this;
+    }
+
+    /**
+     * Clears filters.
+     */
+    public function clear()
+    {
+        $this->filters = [];
     }
 
     /**
@@ -49,14 +77,22 @@ class AndFilter implements BuilderInterface
      */
     public function toArray()
     {
-        $query = [];
+        $query = $this->processArray();
 
-        foreach ($this->filters as $filter) {
-            $query['filters'][] = [$filter->getType() => $filter->toArray()];
+        if (count($query) > 0) {
+            $query['filters'] = $this->filters;
+        } else {
+            $query = $this->filters;
         }
 
-        $output = $this->processArray($query);
+        return $query;
+    }
 
-        return $output;
+    /**
+     * {@inheritdoc}
+     */
+    public function getType()
+    {
+        return 'and';
     }
 }
-- 
GitLab