diff --git a/docs/InnerHits/Nested.md b/docs/InnerHits/Nested.md index 76b6990436d21e561c96ae695bb5aa092ed76892..1aef8df4303aa80eb26d60befad9220e2d2b8900 100644 --- a/docs/InnerHits/Nested.md +++ b/docs/InnerHits/Nested.md @@ -37,7 +37,9 @@ And now the query via DSL: ```php $matchQuery = new MatchQuery('comments.message', '[different query]'); $nestedQuery = new NestedQuery('comments', $matchQuery); -$innerHit = new NestedInnerHit('comment', 'comments', $matchQuery); +$searchQuery = new Search(); +$searchQuery->add($matchQuery); +$innerHit = new NestedInnerHit('comment', 'comments', $searchQuery); $search = new Search(); $search->addQuery(new MatchQuery('comments.message', '[actual query]')); @@ -98,14 +100,21 @@ And now the query via DSL: ```php $matchQuery = new MatchQuery('cars.manufacturers.country', 'Japan'); +$matchSearch = new Search(); +$matchSearch->addQuery($matchQuery); + $nestedQuery = new NestedQuery('cars.manufacturers', $matchQuery); -$innerHitNested = new NestedInnerHit('manufacturers', 'cars.manufacturers', $matchQuery); -$innerHit = new NestedInnerHit('cars', 'cars', $nestedQuery); -$innerHit->addInnerHit($innerHitNested); +$nestedSearch = new Search(); +$nestedSearch->addQuery($nestedQuery); + +$innerHitNested = new NestedInnerHit('manufacturers', 'cars.manufacturers', $matchSearch); + +$innerHit = new NestedInnerHit('cars', 'cars', $nestedSearch); +$nestedSearch->addInnerHit($innerHitNested); $search = new Search(); $search->addInnerHit($innerHit); $search->toArray(); ``` -[1]: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-inner-hits.html \ No newline at end of file +[1]: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-inner-hits.html diff --git a/src/InnerHit/NestedInnerHit.php b/src/InnerHit/NestedInnerHit.php index 1fdeb0a6305d7b3a92f13c933e7e5274e47cff64..e04707adb4e04cfadeb3214291264fb5602417f5 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. @@ -32,27 +32,24 @@ class NestedInnerHit implements BuilderInterface private $path; /** - * @var BuilderInterface + * @var Search */ - private $query; - - /** - * @var BuilderBag - */ - private $innerHits; + private $search; /** * Inner hits container init. * - * @param string $name - * @param string $path - * @param BuilderInterface $query + * @param string $name + * @param string $path + * @param Search $search */ - public function __construct($name, $path, BuilderInterface $query = null) + public function __construct($name, $path, Search $search = null) { $this->setName($name); $this->setPath($path); - $this->setQuery($query); + if ($search) { + $this->setSearch($search); + } } /** @@ -76,21 +73,21 @@ class NestedInnerHit implements BuilderInterface } /** - * @return BuilderInterface + * @return Search */ - public function getQuery() + public function getSearch() { - return $this->query; + return $this->search; } /** - * @param BuilderInterface $query + * @param Search $search * * @return $this */ - public function setQuery(BuilderInterface $query) + public function setSearch(Search $search) { - $this->query = $query; + $this->search = $search; return $this; } @@ -103,70 +100,16 @@ class NestedInnerHit implements BuilderInterface return 'nested'; } - /** - * Adds a sub-innerHit. - * - * @param NestedInnerHit $innerHit - * - * @return $this - */ - public function addInnerHit(NestedInnerHit $innerHit) - { - if (!$this->innerHits) { - $this->innerHits = new BuilderBag(); - } - - $this->innerHits->add($innerHit); - - return $this; - } - - /** - * 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() ? $this->getQuery()->toArray() : null, - 'inner_hits' => $this->collectNestedInnerHits(), - ] - ); - - $out = $this->processArray($out); + $out = $this->getSearch() ? $this->getSearch()->toArray() : new \stdClass(); $out = [ $this->getPathType() => [ - $this->getPath() => $out ? $out : new \stdClass(), + $this->getPath() => $out , ], ]; @@ -174,7 +117,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 */ @@ -192,20 +135,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 9cb88fcddee54176118acec853512654d92b51b8..c9bfe8a389f6845a6a70aaf8bc2a4fe32186be11 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->setSearch($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->getSearch()); } } diff --git a/tests/InnerHit/ParentInnerHitTest.php b/tests/InnerHit/ParentInnerHitTest.php index 0a80b63a8e788cbf43c95418a80fd9b6ae57090c..9444ec67a32d7d0875d6a28dad0616c0c787b27d 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' => [