Commit 845a0c5e authored by Pavel's avatar Pavel
Browse files

Merge remote-tracking branch 'origin/main' into tests

parents be691757 512cbe71
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
<?php

namespace Docke\ElasticSearch\Config;
namespace IQDEV\ElasticSearch\Config;

use IQDEV\ElasticSearch\Configuration;

+32 −0
Original line number Diff line number Diff line
@@ -40,8 +40,40 @@ final class SearchResultFactory
        if (isset($data['aggregations']['keyword_facet']['agg_keyword_facet_code']['buckets'])) {
            $buckets         = $data['aggregations']['keyword_facet']['agg_keyword_facet_code']['buckets'];
            $bucketsFiltered = [];

            $aKeys = array_keys($data['aggregations']);
            foreach ($aKeys as $sKey) {
                if (strpos($sKey, 'keyword_facet_filtered_') !== false) {
                    $sCode = substr($sKey, strlen('keyword_facet_filtered_'));
                    if (isset($data['aggregations'][$sKey]['all_keyword_facet_filtered_' . $sCode]['agg_keyword_facet_code']['buckets'])) {
                        foreach ($data['aggregations'][$sKey]['all_keyword_facet_filtered_' . $sCode]['agg_keyword_facet_code']['buckets'] as $bucket) {
                            $bucketsFiltered[$bucket['key']] = [];
                            foreach ($bucket['agg_keyword_facet_value']['buckets'] as $values) {
                                $bucketsFiltered[$bucket['key']][$values['key']] = $values;
                            }
                        }
                    }
                }

                if (strpos($sKey, 'all_keyword_facet_filtered_') !== false) {
                    $sCode = substr($sKey, strlen('all_keyword_facet_filtered_'));
                    if (isset($data['aggregations']['all_keyword_facet_filtered_' . $sCode]['agg_keyword_facet_code']['buckets'])) {
                        foreach ($data['aggregations']['all_keyword_facet_filtered_' . $sCode]['agg_keyword_facet_code']['buckets'] as $bucket) {
                            $bucketsFiltered[$bucket['key']] = [];
                            foreach ($bucket['agg_keyword_facet_value']['buckets'] as $values) {
                                $bucketsFiltered[$bucket['key']][$values['key']] = $values;
                            }
                        }
                    }
                }
            }

            if (isset($data['aggregations']['keyword_facet_filtered']['all_keyword_facet_filtered']['agg_keyword_facet_code']['buckets'])) {
                foreach ($data['aggregations']['keyword_facet_filtered']['all_keyword_facet_filtered']['agg_keyword_facet_code']['buckets'] as $bucket) {
                    if (isset($bucketsFiltered[$bucket['key']])) {
                        continue;
                    }

                    $bucketsFiltered[$bucket['key']] = [];
                    foreach ($bucket['agg_keyword_facet_value']['buckets'] as $values) {
                        $bucketsFiltered[$bucket['key']][$values['key']] = $values;
+56 −31
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@ use IQDEV\ElasticSearch\Search\Pagination;
use IQDEV\ElasticSearch\Search\Request;
use Elastic\Elasticsearch\Client;
use IQDEV\Search\{Filter\Filter,
    Filter\FilterCollection,
    Filter\FilterKeyword,
    Filter\FilterCategory,
    Filter\FilterNumber,
@@ -44,8 +45,6 @@ final class SearchService implements DomainSearchService
    {
        $request       = new Request();
        $commonQuery   = new Query();
        $filterKeyword = new Query();
        $filterNumber  = new Query();

        if ($q->filters) {
            foreach ($q->filters as $filter) {
@@ -56,21 +55,8 @@ final class SearchService implements DomainSearchService
                    );
                    continue;
                }

                if ($filter instanceof FilterNumber) {
                    $oFacet = new FilterNumberFacet($filter->key, $filter->min, $filter->max);
                    $filterNumber->filter($oFacet);
                    $commonQuery->filter($oFacet);
                    continue;
                }

                if ($filter instanceof FilterKeyword) {
                    $oFacet = new FilterKeywordFacet($filter->key, $filter->value);
                    $filterKeyword->filter($oFacet);
                    $commonQuery->filter($oFacet);
                    continue;
                }
            }
            $commonQuery = $this->getQuery($q->filters);
        }
        $commonFilter = clone $commonQuery;
        $commonFilter->setType(Query::TYPE_FILTER);
@@ -103,18 +89,6 @@ final class SearchService implements DomainSearchService
            $request->addMatch('full_search_content', ['query' => $q->query]);
        }

        if ($filterKeyword->isEmpty() === false) {
            $nestedFilterKeyword = new Nested();
            $nestedFilterKeyword->setPath('search_data')
                ->setQuery($filterKeyword);
        }

        if ($filterNumber->isEmpty() === false) {
            $nestedFilterNumber = new Nested();
            $nestedFilterNumber->setPath('search_data')
                ->setQuery($filterNumber);
        }

        if ($commonQuery->isEmpty() === false) {
            $nestedFilter = new Nested();
            $nestedFilter->setPath('search_data')
@@ -131,6 +105,37 @@ final class SearchService implements DomainSearchService
            $aggsNumberFiltered->addAggs(AggsNumberFacet::create('all_number_facet_filtered', 'number_facet'))
                ->setQuery($commonFilter);
            $request->getAggs()->add($aggsNumberFiltered);

            foreach ($q->filters as $filter) {
                if ($filter instanceof FilterKeyword) {
                    $oFilters = new FilterCollection();
                    foreach ($q->filters as $filter2) {
                        if (!($filter2 instanceof Filter) || $filter2 instanceof FilterCategory) {
                            continue;
                        }

                        if ($filter->key() === $filter2->key()) {
                            continue;
                        }
                        $oFilters->add($filter2);
                    }
                    if ($oFilters->isEmpty()) {
                        $aggsKeywordFiltered = AggsKeyWordFacet::create('all_keyword_facet_filtered_' . $filter->key(
                                                                        ),
                                                                        'keyword_facet'
                        );
                    } else {
                        $aggsKeywordFiltered = new Aggs('keyword_facet_filtered_' . $filter->key());
                        $aggsKeywordFiltered->addAggs(AggsKeyWordFacet::create('all_keyword_facet_filtered_' . $filter->key(
                                                                               ),
                                                                               'keyword_facet'
                        )
                        );
                        $aggsKeywordFiltered->setQuery($this->getQuery($oFilters));
                    }
                    $request->getAggs()->add($aggsKeywordFiltered);
                }
            }
        }

        $aggsKeyword = AggsKeyWordFacet::create('keyword_facet', 'keyword_facet');
@@ -148,4 +153,24 @@ final class SearchService implements DomainSearchService

        return SearchResultFactory::createFromResponse($response, $request);
    }

    private function getQuery(FilterCollection $filters): Query
    {
        $commonQuery = new Query();
        foreach ($filters as $filter) {
            if ($filter instanceof FilterNumber) {
                $oFacet = new FilterNumberFacet($filter->key, $filter->min, $filter->max);
                $commonQuery->filter($oFacet);
                continue;
            }

            if ($filter instanceof FilterKeyword) {
                $oFacet = new FilterKeywordFacet($filter->key, $filter->value);
                $commonQuery->filter($oFacet);
                continue;
            }
        }

        return $commonQuery;
    }
}
+7 −1
Original line number Diff line number Diff line
@@ -14,8 +14,14 @@ final class AggsKeyWordFacet
        $aggKeywordFacet->setNested($nested);

        $aggKeywordFacetCode = new Aggs("agg_{$facet}_code");

        $aOptions = [];
        if (stripos($code, 'all_keyword_facet_filtered_') !== false) {
            $aOptions = ['include' => substr($code, strlen('all_keyword_facet_filtered_'))];
        }

        $aggKeywordFacetCode->setTerms(
            (new Terms("{$path}.{$facet}.facet_code"))
            (new Terms("{$path}.{$facet}.facet_code", $aOptions))
                ->setSize(250)
        );

+2 −1
Original line number Diff line number Diff line
@@ -13,9 +13,10 @@ final class Terms implements Esable
    /**
     * @param string $field
     */
    public function __construct(string $field)
    public function __construct(string $field, array $options = [])
    {
        $this->field = $field;
        $this->options = $options;
    }

    public function setSize(int $size): self
Loading