diff --git a/src/Search.php b/src/Search.php index 9760d652aa626f4ff07cc14838b6cb973de5a43a..2c72946b5adc0785601a90b8b32f7b4de4cf70ba 100644 --- a/src/Search.php +++ b/src/Search.php @@ -13,11 +13,13 @@ namespace ONGR\ElasticsearchDSL; use ONGR\ElasticsearchDSL\Aggregation\AbstractAggregation; use ONGR\ElasticsearchDSL\Highlight\Highlight; +use ONGR\ElasticsearchDSL\InnerHit\AbstractInnerHit; use ONGR\ElasticsearchDSL\Query\BoolQuery; use ONGR\ElasticsearchDSL\SearchEndpoint\AbstractSearchEndpoint; use ONGR\ElasticsearchDSL\SearchEndpoint\AggregationsEndpoint; use ONGR\ElasticsearchDSL\SearchEndpoint\FilterEndpoint; use ONGR\ElasticsearchDSL\SearchEndpoint\HighlightEndpoint; +use ONGR\ElasticsearchDSL\SearchEndpoint\InnerHitsEndpoint; use ONGR\ElasticsearchDSL\SearchEndpoint\PostFilterEndpoint; use ONGR\ElasticsearchDSL\SearchEndpoint\QueryEndpoint; use ONGR\ElasticsearchDSL\SearchEndpoint\SearchEndpointFactory; @@ -328,6 +330,30 @@ class Search return $this->getEndpoint(AggregationsEndpoint::NAME)->getAll(); } + /** + * Adds inner hit into search. + * + * @param AbstractInnerHit $innerHit + * + * @return $this + */ + public function addInnerHit(AbstractInnerHit $innerHit) + { + $this->getEndpoint(InnerHitsEndpoint::NAME)->add($innerHit, $innerHit->getName()); + + return $this; + } + + /** + * Returns all inner hits. + * + * @return BuilderInterface[] + */ + public function getInnerHits() + { + return $this->getEndpoint(InnerHitsEndpoint::NAME)->getAll(); + } + /** * Adds sort to search. * diff --git a/src/SearchEndpoint/InnerHitsEndpoint.php b/src/SearchEndpoint/InnerHitsEndpoint.php new file mode 100644 index 0000000000000000000000000000000000000000..b3d4213090960b1683198a8a0fc1078498b92980 --- /dev/null +++ b/src/SearchEndpoint/InnerHitsEndpoint.php @@ -0,0 +1,42 @@ +<?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\ElasticsearchDSL\SearchEndpoint; + +use ONGR\ElasticsearchDSL\InnerHit\AbstractInnerHit; +use Symfony\Component\Serializer\Normalizer\NormalizerInterface; + +/** + * Search inner hits dsl endpoint. + */ +class InnerHitsEndpoint extends AbstractSearchEndpoint +{ + /** + * Endpoint name + */ + const NAME = 'inner_hits'; + + /** + * {@inheritdoc} + */ + public function normalize(NormalizerInterface $normalizer, $format = null, array $context = []) + { + $output = []; + if (count($this->getAll()) > 0) { + /** @var AbstractInnerHit $innerHit */ + foreach ($this->getAll() as $innerHit) { + $output[$innerHit->getName()] = $innerHit->toArray(); + } + } + + return $output; + } +} diff --git a/src/SearchEndpoint/SearchEndpointFactory.php b/src/SearchEndpoint/SearchEndpointFactory.php index 291a631479b5f94eba66a6a4f6cda191e1348622..abfcf6112fdb86db708974913a992d2e64d63296 100644 --- a/src/SearchEndpoint/SearchEndpointFactory.php +++ b/src/SearchEndpoint/SearchEndpointFactory.php @@ -27,6 +27,7 @@ class SearchEndpointFactory 'highlight' => 'ONGR\ElasticsearchDSL\SearchEndpoint\HighlightEndpoint', 'aggregations' => 'ONGR\ElasticsearchDSL\SearchEndpoint\AggregationsEndpoint', 'suggest' => 'ONGR\ElasticsearchDSL\SearchEndpoint\SuggestEndpoint', + 'inner_hits' => 'ONGR\ElasticsearchDSL\SearchEndpoint\InnerHitsEndpoint', ]; /**