Skip to content
NestedFilter.php 2.3 KiB
Newer Older
<?php

declare(strict_types=1);

namespace IQDEV\ElasticSearch\Converter\Request\Filter;

use IQDEV\ElasticSearch\Converter\Request\Filter\Type\KeywordFilterType;
use IQDEV\ElasticSearch\Converter\Request\Filter\Type\RangeFilterType;
Nikita Chernykh's avatar
Nikita Chernykh committed
use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection;
use IQDEV\ElasticSearch\Criteria\Filter\Filter;
use IQDEV\ElasticSearch\Search\BoolQuery\Query;
use IQDEV\ElasticSearch\Search\BoolQuery\Terms;
use IQDEV\ElasticSearch\Search\Nested;

class NestedFilter extends AbstractFilterQuery
{
    public const NESTED_RANGE_PATH = 'search_data.number_facet';
    public const NESTED_KEYWORD_PATH = 'search_data.keyword_facet';

Nikita Chernykh's avatar
Nikita Chernykh committed
    public function getQuery(FilterGroupCollection $filterGroupCollection, array $exclude): Nested
Nikita Chernykh's avatar
Nikita Chernykh committed
        $query = new Query();

Nikita Chernykh's avatar
Nikita Chernykh committed
        $keywordFiltersGroup = $filterGroupCollection->getKeywordFilters($exclude);
        foreach ($keywordFiltersGroup as $keywordFilter) {
            /** @var Filter $keywordFilter */
            $esableFilter = new KeywordFilterType($keywordFilter);

Nikita Chernykh's avatar
Nikita Chernykh committed
            $this->setFilterByLogic($query, $filterGroupCollection->getLogicOperator(), $this->getNested($esableFilter, self::NESTED_KEYWORD_PATH));
Nikita Chernykh's avatar
Nikita Chernykh committed
        $rangeFilterGroup = $filterGroupCollection->getRangeFilters($exclude);
        $rangesFilter = RangeFilterType::getFiltersByOneProperty($rangeFilterGroup);
        foreach ($rangesFilter as $filterGroup) {
            /** @var FilterGroupCollection $filterGroup */

            $esableFilter = new RangeFilterType($filterGroup);
Nikita Chernykh's avatar
Nikita Chernykh committed
            $this->setFilterByLogic($query, $filterGroupCollection->getLogicOperator(), $this->getNested($esableFilter, self::NESTED_RANGE_PATH));
        }

        return (new Nested())
            ->setPath('search_data')
Nikita Chernykh's avatar
Nikita Chernykh committed
            ->setQuery($query);
    }

    private function getNested(RangeFilterType|KeywordFilterType $filter, string $path): Nested
    {
        $cloneFilter = clone $filter;
        $nested = new Nested();
        $query = new Query();

        $query->getFilter()->add(new Terms($path . '.facet_code', $cloneFilter->getField()));

        $cloneFilter->setField($path . '.facet_value');
        $query->getFilter()->add($cloneFilter->getEsable());

        $nested
            ->setPath($path)
            ->setQuery($query);

        return $nested;
    }
}