Skip to content
Snippets Groups Projects
Aggregation.php 2.05 KiB
Newer Older
<?php

declare(strict_types=1);

namespace IQDEV\ElasticSearch\Converter\Request\Aggregation;

use IQDEV\ElasticSearch\Configuration;
Nikita Chernykh's avatar
Nikita Chernykh committed
use IQDEV\ElasticSearch\Criteria\Criteria;
use IQDEV\ElasticSearch\Criteria\Filter\FilterType;
use IQDEV\ElasticSearch\Search\Aggs\AggsCollection;
use IQDEV\ElasticSearch\Search\Aggs\AggsFacetStats;
use IQDEV\ElasticSearch\Search\Aggs\AggsFacetTerms;

class Aggregation
{
    public function __construct(
        private readonly Configuration $configuration,
        private readonly Criteria $criteria,
        private readonly AggsCollection $aggregations = new AggsCollection(),
    ) {
        $this->convertToQuery();
    }

    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'
                )
            );

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

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

            $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;
    }
}