From cfefc1fcc6f1bec34a993f1c994f38bf66040a95 Mon Sep 17 00:00:00 2001
From: tchiotludo <tchiot.ludo@gmail.com>
Date: Wed, 7 Sep 2016 18:29:51 +0200
Subject: [PATCH] InnerHit new implementation

---
 src/InnerHit/NestedInnerHit.php       | 89 +++------------------------
 tests/InnerHit/NestedInnerHitTest.php | 55 +++++++++--------
 tests/InnerHit/ParentInnerHitTest.php |  7 ++-
 3 files changed, 45 insertions(+), 106 deletions(-)

diff --git a/src/InnerHit/NestedInnerHit.php b/src/InnerHit/NestedInnerHit.php
index 73dc853..7df7421 100644
--- a/src/InnerHit/NestedInnerHit.php
+++ b/src/InnerHit/NestedInnerHit.php
@@ -11,10 +11,10 @@
 
 namespace ONGR\ElasticsearchDSL\InnerHit;
 
-use ONGR\ElasticsearchDSL\BuilderBag;
 use ONGR\ElasticsearchDSL\BuilderInterface;
 use ONGR\ElasticsearchDSL\NameAwareTrait;
 use ONGR\ElasticsearchDSL\ParametersTrait;
+use ONGR\ElasticsearchDSL\Search;
 
 /**
  * Represents Elasticsearch top level nested inner hits.
@@ -36,19 +36,14 @@ class NestedInnerHit implements BuilderInterface
      */
     private $query;
 
-    /**
-     * @var BuilderBag
-     */
-    private $innerHits;
-
     /**
      * Inner hits container init.
      *
-     * @param string           $name
-     * @param string           $path
-     * @param BuilderInterface $query
+     * @param string $name
+     * @param string $path
+     * @param Search $query
      */
-    public function __construct($name, $path, BuilderInterface $query)
+    public function __construct($name, $path, Search $query = null)
     {
         $this->setName($name);
         $this->setPath($path);
@@ -80,9 +75,9 @@ class NestedInnerHit implements BuilderInterface
     }
 
     /**
-     * @param BuilderInterface $query
+     * @param Search $query
      */
-    public function setQuery(BuilderInterface $query)
+    public function setQuery(Search $query = null)
     {
         $this->query = $query;
     }
@@ -95,64 +90,16 @@ class NestedInnerHit implements BuilderInterface
         return 'nested';
     }
 
-    /**
-     * Adds a sub-innerHit.
-     *
-     * @param NestedInnerHit $innerHit
-     */
-    public function addInnerHit(NestedInnerHit $innerHit)
-    {
-        if (!$this->innerHits) {
-            $this->innerHits = new BuilderBag();
-        }
-
-        $this->innerHits->add($innerHit);
-    }
-
-    /**
-     * Returns all sub inner hits.
-     *
-     * @return BuilderInterface[]
-     */
-    public function getInnerHits()
-    {
-        if ($this->innerHits) {
-            return $this->innerHits->all();
-        } else {
-            return [];
-        }
-    }
-
-    /**
-     * Returns sub inner hit.
-     * @param string $name inner hit name to return.
-     *
-     * @return NestedInnerHit|null
-     */
-    public function getInnerHit($name)
-    {
-        if ($this->innerHits && $this->innerHits->has($name)) {
-            return $this->innerHits->get($name);
-        } else {
-            return null;
-        }
-    }
-
     /**
      * {@inheritdoc}
      */
     public function toArray()
     {
-        $out = array_filter(
-            [
-                'query' => $this->getQuery()->toArray(),
-                'inner_hits' => $this->collectNestedInnerHits(),
-            ]
-        );
+        $out = $this->getQuery() ? $this->getQuery()->toArray() : new \stdClass();
 
         $out = [
             $this->getPathType() => [
-                $this->getPath() => $this->processArray($out),
+                $this->getPath() => $out ,
             ],
         ];
 
@@ -160,7 +107,7 @@ class NestedInnerHit implements BuilderInterface
     }
 
     /**
-     * Returns 'path' for neted and 'type' for parent inner hits
+     * Returns 'path' for nested and 'type' for parent inner hits
      *
      * @return null|string
      */
@@ -178,20 +125,4 @@ class NestedInnerHit implements BuilderInterface
         }
         return $type;
     }
-
-    /**
-     * Process all nested inner hits.
-     *
-     * @return array
-     */
-    private function collectNestedInnerHits()
-    {
-        $result = [];
-        /** @var NestedInnerHit $innerHit */
-        foreach ($this->getInnerHits() as $innerHit) {
-            $result[$innerHit->getName()] = $innerHit->toArray();
-        }
-
-        return $result;
-    }
 }
diff --git a/tests/InnerHit/NestedInnerHitTest.php b/tests/InnerHit/NestedInnerHitTest.php
index 9cb88fc..44c59ee 100644
--- a/tests/InnerHit/NestedInnerHitTest.php
+++ b/tests/InnerHit/NestedInnerHitTest.php
@@ -5,7 +5,7 @@ namespace ONGR\ElasticsearchDSL\Tests\InnerHit;
 use ONGR\ElasticsearchDSL\InnerHit\NestedInnerHit;
 use ONGR\ElasticsearchDSL\Query\MatchQuery;
 use ONGR\ElasticsearchDSL\Query\NestedQuery;
-use ONGR\ElasticsearchDSL\Query\TermQuery;
+use ONGR\ElasticsearchDSL\Search;
 
 class NestedInnerHitTest extends \PHPUnit_Framework_TestCase
 {
@@ -20,11 +20,28 @@ class NestedInnerHitTest extends \PHPUnit_Framework_TestCase
 
         $matchQuery = new MatchQuery('foo.bar.aux', 'foo');
         $nestedQuery = new NestedQuery('foo.bar', $matchQuery);
-        $innerHit = new NestedInnerHit('acme', 'foo', $nestedQuery);
-        $nestedInnerHit1 = new NestedInnerHit('aux', 'foo.bar.aux', $matchQuery);
-        $nestedInnerHit2 = new NestedInnerHit('lux', 'foo.bar.aux', $matchQuery);
-        $innerHit->addInnerHit($nestedInnerHit1);
-        $innerHit->addInnerHit($nestedInnerHit2);
+        $searchQuery = new Search();
+        $searchQuery->addQuery($nestedQuery);
+
+        $matchSearch = new Search();
+        $matchSearch->addQuery($matchQuery);
+
+        $innerHit = new NestedInnerHit('acme', 'foo', $searchQuery);
+        $emptyInnerHit = new NestedInnerHit('acme', 'foo');
+
+        $nestedInnerHit1 = new NestedInnerHit('aux', 'foo.bar.aux', $matchSearch);
+        $nestedInnerHit2 = new NestedInnerHit('lux', 'foo.bar.aux', $matchSearch);
+        $searchQuery->addInnerHit($nestedInnerHit1);
+        $searchQuery->addInnerHit($nestedInnerHit2);
+
+        $out[] = [
+            $emptyInnerHit,
+            [
+                'path' => [
+                    'foo' => new \stdClass(),
+                ],
+            ],
+        ];
 
         $out[] = [
             $nestedInnerHit1,
@@ -88,30 +105,16 @@ class NestedInnerHitTest extends \PHPUnit_Framework_TestCase
     public function testGettersAndSetters()
     {
         $query = new MatchQuery('acme', 'test');
-        $hit = new NestedInnerHit('test', 'acme', new TermQuery('foo', 'bar'));
+        $search = new Search();
+        $search->addQuery($query);
+
+        $hit = new NestedInnerHit('test', 'acme', new Search());
         $hit->setName('foo');
         $hit->setPath('bar');
-        $hit->setQuery($query);
+        $hit->setQuery($search);
 
         $this->assertEquals('foo', $hit->getName());
         $this->assertEquals('bar', $hit->getPath());
-        $this->assertEquals($query, $hit->getQuery());
-    }
-
-    /**
-     * Tests getInnerHit() method
-     */
-    public function testGetInnerHit()
-    {
-        $query = new MatchQuery('acme', 'test');
-        $hit = new NestedInnerHit('test', 'acme', $query);
-        $nestedInnerHit1 = new NestedInnerHit('foo', 'acme.foo', $query);
-        $nestedInnerHit2 = new NestedInnerHit('bar', 'acme.bar', $query);
-        $hit->addInnerHit($nestedInnerHit1);
-        $hit->addInnerHit($nestedInnerHit2);
-
-        $this->assertEquals($nestedInnerHit1, $hit->getInnerHit('foo'));
-        $this->assertEquals($nestedInnerHit2, $hit->getInnerHit('bar'));
-        $this->assertNull($hit->getInnerHit('non_existing_hit'));
+        $this->assertEquals($search, $hit->getQuery());
     }
 }
diff --git a/tests/InnerHit/ParentInnerHitTest.php b/tests/InnerHit/ParentInnerHitTest.php
index 0a80b63..9444ec6 100644
--- a/tests/InnerHit/ParentInnerHitTest.php
+++ b/tests/InnerHit/ParentInnerHitTest.php
@@ -4,13 +4,18 @@ namespace ONGR\ElasticsearchDSL\Tests\InnerHit;
 
 use ONGR\ElasticsearchDSL\InnerHit\ParentInnerHit;
 use ONGR\ElasticsearchDSL\Query\TermQuery;
+use ONGR\ElasticsearchDSL\Search;
 
 class ParentInnerHitTest extends \PHPUnit_Framework_TestCase
 {
     public function testToArray()
     {
         $query = new TermQuery('foo', 'bar');
-        $hit = new ParentInnerHit('test', 'acme', $query);
+        $search = new Search();
+        $search->addQuery($query);
+
+
+        $hit = new ParentInnerHit('test', 'acme', $search);
         $expected = [
             'type' => [
                 'acme' => [
-- 
GitLab