Skip to content
FullAggregation.php 2.39 KiB
Newer Older
<?php

declare(strict_types=1);

namespace IQDEV\ElasticSearch\Converter\Request\Aggregation;

use IQDEV\ElasticSearch\Configuration;
use IQDEV\ElasticSearch\Converter\Request\FilterQuery;
Nikita Chernykh's avatar
Nikita Chernykh committed
use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterCollection;
use IQDEV\ElasticSearch\Search\Aggs\Aggs;
Nikita Chernykh's avatar
Nikita Chernykh committed
use IQDEV\ElasticSearch\Search\Aggs\AggsCollection;
use IQDEV\ElasticSearch\Search\Aggs\AggsFacetStats;
use IQDEV\ElasticSearch\Search\Aggs\AggsFacetTerms;
use IQDEV\ElasticSearch\Search\Nested;

class FullAggregation
{
    public function __construct(
        private readonly Configuration $configuration,
        private readonly FilterCollection $filterCollection,
    ) {
    }

Nikita Chernykh's avatar
Nikita Chernykh committed
    public function updateRequestAggregation(AggsCollection $original): void
Nikita Chernykh's avatar
Nikita Chernykh committed
        $keywordQuery = (new FilterQuery($this->configuration, $this->filterCollection->getKeywordFilters()))->getQuery();
        $numberQuery = (new FilterQuery($this->configuration, $this->filterCollection->getNumberFilters()))->getQuery();

        $aggsKeywordFiltered = new Aggs('keyword_facet_filtered');
        $aggsKeywordFiltered->addAggs(
            AggsFacetTerms::create(
                'all_keyword_facet_filtered',
                'keyword_facet'
            )
        );

        $aggsNumberFiltered = new Aggs('number_facet_filtered');
        $aggsNumberFiltered->addAggs(
            AggsFacetStats::create(
                'all_number_facet_filtered',
                'number_facet'
            )
        );

Nikita Chernykh's avatar
Nikita Chernykh committed
        if (false === $keywordQuery->getFilter()->isEmpty()) {
            foreach ($keywordQuery->getFilter() as $item) {
                $numberQuery->getFilter()->add($item);
            }
        }

        if (false === $numberQuery->getFilter()->isEmpty()) {
            foreach ($numberQuery->getFilter() as $item) {
                $keywordQuery->getFilter()->add($item);
            }
        }

        if (false === $keywordQuery->getFilter()->isEmpty()) {
            $aggsKeywordFiltered->setQuery($keywordQuery);
        } else {
            $aggsKeywordFiltered->setNested((new Nested())->setPath('search_data'));
        }

        if (false === $numberQuery->getFilter()->isEmpty()) {
            $aggsNumberFiltered->setQuery($numberQuery);
        } else {
            $aggsNumberFiltered->setNested((new Nested())->setPath('search_data'));
        }

        $original->add($aggsKeywordFiltered)->add($aggsNumberFiltered);