From 61dd80ec2135ed6791ceda78830095b463718f1e Mon Sep 17 00:00:00 2001
From: Martynas Sudintas <martynas.sudintas@nfq.lt>
Date: Thu, 22 Jan 2015 16:58:49 +0200
Subject: [PATCH] implemented FriendlyBuilderBag

---
 Aggregation/AbstractAggregation.php |  15 ++--
 Aggregation/Aggregations.php        |  86 ---------------------
 FriendlyBuilderBag.php              | 114 ++++++++++++++++++++++++++++
 FriendlyBuilderInterface.php        |  25 ++++++
 Search.php                          |  16 ++--
 Suggester/AbstractSuggester.php     |   6 +-
 Suggester/Suggesters.php            |  86 ---------------------
 7 files changed, 158 insertions(+), 190 deletions(-)
 delete mode 100644 Aggregation/Aggregations.php
 create mode 100644 FriendlyBuilderBag.php
 create mode 100644 FriendlyBuilderInterface.php
 delete mode 100644 Suggester/Suggesters.php

diff --git a/Aggregation/AbstractAggregation.php b/Aggregation/AbstractAggregation.php
index e9106db..88f786f 100644
--- a/Aggregation/AbstractAggregation.php
+++ b/Aggregation/AbstractAggregation.php
@@ -11,13 +11,16 @@
 
 namespace ONGR\ElasticsearchBundle\DSL\Aggregation;
 
-use ONGR\ElasticsearchBundle\DSL\BuilderInterface;
+use ONGR\ElasticsearchBundle\DSL\FriendlyBuilderBag;
+use ONGR\ElasticsearchBundle\DSL\FriendlyBuilderInterface;
 
 /**
  * AbstractAggregation class.
  */
-abstract class AbstractAggregation implements BuilderInterface
+abstract class AbstractAggregation implements FriendlyBuilderInterface
 {
+    const PREFIX = 'agg_';
+
     /**
      * @var string
      */
@@ -29,7 +32,7 @@ abstract class AbstractAggregation implements BuilderInterface
     protected $name;
 
     /**
-     * @var Aggregations
+     * @var FriendlyBuilderBag
      */
     public $aggregations;
 
@@ -58,7 +61,7 @@ abstract class AbstractAggregation implements BuilderInterface
     public function __construct($name)
     {
         $this->name = $name;
-        $this->aggregations = new Aggregations();
+        $this->aggregations = new FriendlyBuilderBag();
     }
 
     /**
@@ -78,11 +81,11 @@ abstract class AbstractAggregation implements BuilderInterface
     }
 
     /**
-     * @return string
+     * {@inheritdoc}
      */
     public function getName()
     {
-        return Aggregations::PREFIX . $this->name;
+        return self::PREFIX . $this->name;
     }
 
     /**
diff --git a/Aggregation/Aggregations.php b/Aggregation/Aggregations.php
deleted file mode 100644
index c7885ab..0000000
--- a/Aggregation/Aggregations.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-
-/*
- * This file is part of the ONGR package.
- *
- * (c) NFQ Technologies UAB <info@nfq.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace ONGR\ElasticsearchBundle\DSL\Aggregation;
-
-/**
- * Aggregations class.
- */
-class Aggregations
-{
-    const PREFIX = 'agg_';
-
-    /**
-     * @var array
-     */
-    private $aggregations = [];
-
-    /**
-     * @param AbstractAggregation $agg
-     */
-    public function addAggregation(AbstractAggregation $agg)
-    {
-        $this->aggregations[$agg->getName()] = $agg;
-    }
-
-    /**
-     * Checks if aggregation is set.
-     *
-     * @param string $name
-     *
-     * @return bool
-     */
-    public function has($name)
-    {
-        return isset($this->aggregations[$name]);
-    }
-
-    /**
-     * Removes aggregation by it's name.
-     *
-     * @param string $name
-     */
-    public function remove($name)
-    {
-        unset($this->aggregations[$name]);
-    }
-
-    /**
-     * Gets aggregation by it's name.
-     *
-     * @param string $name
-     *
-     * @return AbstractAggregation
-     */
-    public function get($name)
-    {
-        return $this->aggregations[$name];
-    }
-
-    /**
-     * Returns all aggregations.
-     *
-     * @param string|null $type
-     *
-     * @return AbstractAggregation[]
-     */
-    public function all($type = null)
-    {
-        return array_filter(
-            $this->aggregations,
-            function ($aggregation) use ($type) {
-                /** @var AbstractAggregation $aggregation */
-
-                return $type === null || $aggregation->getType() == $type;
-            }
-        );
-    }
-}
diff --git a/FriendlyBuilderBag.php b/FriendlyBuilderBag.php
new file mode 100644
index 0000000..dd90e94
--- /dev/null
+++ b/FriendlyBuilderBag.php
@@ -0,0 +1,114 @@
+<?php
+
+/*
+ * This file is part of the ONGR package.
+ *
+ * (c) NFQ Technologies UAB <info@nfq.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace ONGR\ElasticsearchBundle\DSL;
+
+/**
+ * Container for friendly builders.
+ */
+class FriendlyBuilderBag
+{
+    /**
+     * @var FriendlyBuilderInterface[]
+     */
+    private $bag = [];
+
+    /**
+     * @param FriendlyBuilderInterface[] $builders
+     */
+    public function __construct(array $builders = [])
+    {
+        $this->set($builders);
+    }
+
+    /**
+     * Replaces builders with new ones.
+     *
+     * @param FriendlyBuilderInterface[] $builders
+     */
+    public function set(array $builders)
+    {
+        foreach ($builders as $builder) {
+            $this->add($builder);
+        }
+    }
+
+    /**
+     * Adds a builder.
+     *
+     * @param FriendlyBuilderInterface $builder
+     */
+    public function add(FriendlyBuilderInterface $builder)
+    {
+        $this->bag[$builder->getName()] = $builder;
+    }
+
+    /**
+     * Checks if builder is set by name.
+     *
+     * @param string $name Builder name.
+     *
+     * @return bool
+     */
+    public function has($name)
+    {
+        return isset($this->bag[$name]);
+    }
+
+    /**
+     * Removes a builder by name.
+     *
+     * @param string $name Builder name.
+     */
+    public function remove($name)
+    {
+        unset($this->bag[$name]);
+    }
+
+    /**
+     * Clears contained builders.
+     */
+    public function clear()
+    {
+        $this->bag = [];
+    }
+
+    /**
+     * Returns a builder by name.
+     *
+     * @param string $name Builder name.
+     *
+     * @return FriendlyBuilderInterface
+     */
+    public function get($name)
+    {
+        return $this->bag[$name];
+    }
+
+    /**
+     * Returns all builders contained.
+     *
+     * @param string|null $name Builder name.
+     *
+     * @return FriendlyBuilderInterface[]
+     */
+    public function all($name = null)
+    {
+        return array_filter(
+            $this->bag,
+            function ($builder) use ($name) {
+                /** @var FriendlyBuilderInterface $builder */
+
+                return $name === null || $builder->getName() == $name;
+            }
+        );
+    }
+}
diff --git a/FriendlyBuilderInterface.php b/FriendlyBuilderInterface.php
new file mode 100644
index 0000000..a4e1e4b
--- /dev/null
+++ b/FriendlyBuilderInterface.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * This file is part of the ONGR package.
+ *
+ * (c) NFQ Technologies UAB <info@nfq.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace ONGR\ElasticsearchBundle\DSL;
+
+/**
+ * Interface used by builders with names.
+ */
+interface FriendlyBuilderInterface extends BuilderInterface
+{
+    /**
+     * Returns builder name.
+     *
+     * @return string
+     */
+    public function getName();
+}
diff --git a/Search.php b/Search.php
index 94316a4..0328cf6 100644
--- a/Search.php
+++ b/Search.php
@@ -12,7 +12,6 @@
 namespace ONGR\ElasticsearchBundle\DSL;
 
 use ONGR\ElasticsearchBundle\DSL\Aggregation\AbstractAggregation;
-use ONGR\ElasticsearchBundle\DSL\Aggregation\Aggregations;
 use ONGR\ElasticsearchBundle\DSL\Bool\Bool;
 use ONGR\ElasticsearchBundle\DSL\Filter\PostFilter;
 use ONGR\ElasticsearchBundle\DSL\Highlight\Highlight;
@@ -21,7 +20,6 @@ use ONGR\ElasticsearchBundle\DSL\Query\Query;
 use ONGR\ElasticsearchBundle\DSL\Sort\AbstractSort;
 use ONGR\ElasticsearchBundle\DSL\Sort\Sorts;
 use ONGR\ElasticsearchBundle\DSL\Suggester\AbstractSuggester;
-use ONGR\ElasticsearchBundle\DSL\Suggester\Suggesters;
 
 /**
  * Search object that can be executed by a manager.
@@ -91,7 +89,7 @@ class Search
     private $scriptFields;
 
     /**
-     * @var Suggesters
+     * @var FriendlyBuilderBag
      */
     private $suggesters;
 
@@ -116,7 +114,7 @@ class Search
     private $stats;
 
     /**
-     * @var Aggregations
+     * @var FriendlyBuilderBag
      */
     private $aggregations;
 
@@ -361,9 +359,9 @@ class Search
     public function addAggregation($agg)
     {
         if ($this->aggregations === null) {
-            $this->aggregations = new Aggregations();
+            $this->aggregations = new FriendlyBuilderBag();
         }
-        $this->aggregations->addAggregation($agg);
+        $this->aggregations->add($agg);
 
         return $this;
     }
@@ -406,7 +404,7 @@ class Search
     public function addSuggester(AbstractSuggester $suggester)
     {
         if ($this->suggesters === null) {
-            $this->suggesters = new Suggesters();
+            $this->suggesters = new FriendlyBuilderBag();
         }
         $this->suggesters->add($suggester);
 
@@ -475,7 +473,7 @@ class Search
     }
 
     /**
-     * @return Aggregations
+     * @return FriendlyBuilderBag
      */
     public function getAggregations()
     {
@@ -611,7 +609,7 @@ class Search
     }
 
     /**
-     * @return Suggesters
+     * @return FriendlyBuilderBag
      */
     public function getSuggesters()
     {
diff --git a/Suggester/AbstractSuggester.php b/Suggester/AbstractSuggester.php
index 922aec1..ecef664 100644
--- a/Suggester/AbstractSuggester.php
+++ b/Suggester/AbstractSuggester.php
@@ -11,12 +11,12 @@
 
 namespace ONGR\ElasticsearchBundle\DSL\Suggester;
 
-use ONGR\ElasticsearchBundle\DSL\BuilderInterface;
+use ONGR\ElasticsearchBundle\DSL\FriendlyBuilderInterface;
 
 /**
  * AbstractSuggester class.
  */
-abstract class AbstractSuggester implements BuilderInterface
+abstract class AbstractSuggester implements FriendlyBuilderInterface
 {
     /**
      * @var string
@@ -96,7 +96,7 @@ abstract class AbstractSuggester implements BuilderInterface
     }
 
     /**
-     * @return string
+     * {@inheritdoc}
      */
     public function getName()
     {
diff --git a/Suggester/Suggesters.php b/Suggester/Suggesters.php
deleted file mode 100644
index dcfdca0..0000000
--- a/Suggester/Suggesters.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-
-/*
- * This file is part of the ONGR package.
- *
- * (c) NFQ Technologies UAB <info@nfq.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace ONGR\ElasticsearchBundle\DSL\Suggester;
-
-/**
- * Suggesters class.
- */
-class Suggesters
-{
-    /**
-     * @var AbstractSuggester
-     */
-    private $suggesters = [];
-
-    /**
-     * Adds a suggester.
-     *
-     * @param AbstractSuggester $suggester
-     */
-    public function add(AbstractSuggester $suggester)
-    {
-        $this->suggesters[$suggester->getName()] = $suggester;
-    }
-
-    /**
-     * Checks if suggester is set.
-     *
-     * @param string $name
-     *
-     * @return bool
-     */
-    public function has($name)
-    {
-        return isset($this->suggesters[$name]);
-    }
-
-    /**
-     * Removes suggester.
-     *
-     * @param string $name
-     */
-    public function remove($name)
-    {
-        unset($this->suggesters[$name]);
-    }
-
-    /**
-     * Gets a suggester by it's name.
-     *
-     * @param string $name
-     *
-     * @return AbstractSuggester
-     */
-    public function get($name)
-    {
-        return $this->suggesters[$name];
-    }
-
-    /**
-     * Gets all suggesters.
-     *
-     * @param string|null $name
-     *
-     * @return AbstractSuggester[]
-     */
-    public function all($name = null)
-    {
-        return array_filter(
-            $this->suggesters,
-            function ($build) use ($name) {
-                /** @var AbstractSuggester $suggester */
-
-                return $name === null || $suggester->getName() == $name;
-            }
-        );
-    }
-}
-- 
GitLab