Commit 64324f41 authored by Pavel's avatar Pavel
Browse files

aggs for properties of document

parent 1c16353e
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -20,7 +20,11 @@ return [
        ],
        'rating' => [
            'type' => 'double',
            'index' => false,
            'index' => true,
        ],
        'new' => [
            'type' => 'boolean',
            'index' => true
        ],
        'popular' => [
            'type' => 'double',
+31 −21
Original line number Diff line number Diff line
@@ -23,29 +23,39 @@ class Aggregation

    public function convertToQuery(): void
    {
        $queryFilterCollection = $this->criteria->getFilters()->getFilterCollectionByType(FilterType::QUERY);

        if (false === $this->criteria->getSearch()->isEmpty() || false === $this->criteria->getFilters()->isEmpty()) {

            $this->aggregations->add(
                AggsFacetTerms::create(
                'keyword_facet',
                'keyword_facet'
                    'keyword_facet', 'keyword_facet'
                )
            );

            $this->aggregations->add(
                AggsFacetStats::create(
                'number_facet',
                'number_facet'
                    'number_facet', 'number_facet'
                )
            );

       $postFilterCollection = $this->criteria->getFilters()->getFilterCollectionByType(FilterType::POST);

       $filterAggregation = new FilterAggregation($this->configuration, $postFilterCollection);
            $filterAggregation = new FilterAggregation($this->configuration, $queryFilterCollection);
            $filterAggregation->updateRequestAggregation($this->aggregations);

       $fullAggregation = new FullAggregation($this->configuration, $postFilterCollection);
            $fullAggregation = new FullAggregation($this->configuration, $queryFilterCollection);
            $fullAggregation->updateRequestAggregation($this->aggregations);
        }

        if (false === $this->criteria->getAggs()->isEmpty()) {
            $propertyAggregation = new PropertyAggregation(
                $this->configuration,
                $queryFilterCollection,
                $this->criteria->getAggs(),
            );
            $propertyAggregation->updateRequestAggregation($this->aggregations);
        }
    }

    public function getAggregation(): AggsCollection
    {
        return $this->aggregations;
+55 −0
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

namespace IQDEV\ElasticSearch\Converter\Request\Aggregation;

use IQDEV\ElasticSearch\Configuration;
use IQDEV\ElasticSearch\Converter\Request\FilterQuery;
use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterCollection;
use IQDEV\ElasticSearch\Document\Property\PropertyType;
use IQDEV\ElasticSearch\Search\Aggs\Aggs;
use IQDEV\ElasticSearch\Search\Aggs\AggsCollection;
use IQDEV\ElasticSearch\Search\Aggs\Terms;

class PropertyAggregation
{
    public function __construct(
        private readonly Configuration $configuration,
        private readonly FilterCollection $filterCollection,
        private readonly \IQDEV\ElasticSearch\Criteria\Aggs\AggsCollection $aggsCollection,
    ) {
    }

    public function updateRequestAggregation(AggsCollection $original): void
    {
        $queryFilterBuilder = new FilterQuery($this->configuration, $this->filterCollection);
        $query = $queryFilterBuilder->getQuery();

        /** @var \IQDEV\ElasticSearch\Criteria\Aggs\Aggs $aggs */
        foreach ($this->aggsCollection as $aggs) {
            $property = $aggs->getProperty();

            if ($property->getType() !== PropertyType::BASE) {
                continue;
            }

            $aggs = new Aggs($property->getKey());
            if (false === $query->isEmpty()) {
                $aggs->setQuery($query);
                $aggs->addAggs(
                    (new Aggs($property->getKey()))
                    ->setTerms(new Terms($property->getKey()))
                );
            } else {
                $aggs->setTerms(new Terms($property->getKey()));
            }
            $aggs->addAggs(
                (new Aggs($property->getKey()))
                    ->setTerms(new Terms($property->getKey()))
            );

            $original->add($aggs);
        }
    }
}
+1 −3
Original line number Diff line number Diff line
@@ -40,10 +40,8 @@ class CriteriaRequestBuilder extends RequestBuilder
            $this->setFilter();
        }

        if (false === $this->criteria->getSearch()->isEmpty() || false === $this->criteria->getFilters()->isEmpty()) {
        $this->setAggregations();
    }
    }

    public function setPagination(): void
    {
+32 −1
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@
namespace IQDEV\ElasticSearch\Converter\Result;

use Elastic\Elasticsearch\Response\Elasticsearch;
use IQDEV\ElasticSearch\Configuration;
use IQDEV\ElasticSearch\Document\Product;
use IQDEV\ElasticSearch\Facet\FacetResult;
use IQDEV\ElasticSearch\Facet\FacetType;
@@ -13,7 +14,7 @@ use IQDEV\ElasticSearch\Result;

final class EsResponseToResult
{
    public function fromResponse(Elasticsearch $response): Result
    public function fromResponse(Elasticsearch $response, Configuration $configuration): Result
    {
        $catalogSearchResult = new Result();

@@ -41,6 +42,8 @@ final class EsResponseToResult
            $this->parseNumberFacet($data, $catalogSearchResult);
        }

        $this->parsePropertyFacet($data, $catalogSearchResult, $configuration);

        return $catalogSearchResult;
    }

@@ -97,6 +100,8 @@ final class EsResponseToResult

                if (isset($bucketsFiltered[$code][$value['key']])) {
                    $count = $bucketsFiltered[$code][$value['key']]['doc_count'];
                } elseif (isset($bucketsFiltered[$code])) {
                    $count = 0;
                }

                $facet->products->add(
@@ -150,4 +155,30 @@ final class EsResponseToResult
            $catalogSearchResult->getFacets()->add($facet);
        }
    }

    private function parsePropertyFacet(array $data, Result $catalogSearchResult, Configuration $configuration)
    {
        $properties = array_keys($configuration->getMapping()['properties']);

        foreach ($data['aggregations'] as $key => $aggs) {
            if (!in_array($key, $properties, true)) {
                continue;
            }

            $facet = new FacetResult(FacetType::LIST, $key);
            $buckets = array_key_exists('buckets', $aggs) ? $aggs['buckets'] : $aggs[$key]['buckets'];
            foreach ($buckets as $bucket) {
                $code = $bucket['key'];
                $count = $bucket['doc_count'];

                $facet->products->add(
                    FacetItemList::create(
                        $code,
                        $count
                    )
                );
            }
            $catalogSearchResult->getFacets()->add($facet);
        }
    }
}
Loading