Skip to content
FilterGroupCollection.php 3.06 KiB
Newer Older
Nikita Chernykh's avatar
Nikita Chernykh committed
<?php

Nikita Chernykh's avatar
Nikita Chernykh committed
namespace IQDEV\ElasticSearch\Criteria\Filter\Collection;
Nikita Chernykh's avatar
Nikita Chernykh committed

Nikita Chernykh's avatar
Nikita Chernykh committed
use IQDEV\ElasticSearch\Criteria\Filter\Filter;
use IQDEV\ElasticSearch\Criteria\Filter\FilterOperator;
use IQDEV\ElasticSearch\Criteria\Filter\FilterType;
use IQDEV\ElasticSearch\Criteria\Filter\LogicOperator;
Nikita Chernykh's avatar
Nikita Chernykh committed
use Ramsey\Collection\AbstractCollection;

/**
 * @method bool add(Filter $item)
 */
class FilterGroupCollection extends AbstractCollection
{
    /** @var LogicOperator Тип логической операции для коллекции */
    protected LogicOperator $logicOperator;
Nikita Chernykh's avatar
Nikita Chernykh committed
    /** @var FilterType Тип фильтра для коллекции */
    protected FilterType $filterType;

    /**
     * @param Filter[] $data
     */
    public function __construct(array $data = [])
    {
        parent::__construct($data);
        $this->logicOperator = LogicOperator::AND;
        $this->filterType = FilterType::POST;
Nikita Chernykh's avatar
Nikita Chernykh committed
    }

    /**
     * @inheritDoc
     */
    public function getType(): string
    {
        return Filter::class;
    }

    /**
     * Установка типа логической операции
     *
     * @param LogicOperator $type
     *
     * @return $this
     */
    public function setLogicOperator(LogicOperator $type): self
Nikita Chernykh's avatar
Nikita Chernykh committed
    {
        $this->logicOperator = $type;
Nikita Chernykh's avatar
Nikita Chernykh committed

        return $this;
    }

    /**
     * Получение типа логической операции
     *
     * @return LogicOperator
     */
    public function getLogicOperator(): LogicOperator
Nikita Chernykh's avatar
Nikita Chernykh committed
    {
        return $this->logicOperator;
Nikita Chernykh's avatar
Nikita Chernykh committed
    }

    /**
     * Установка типа фильтрации
     *
     * @param FilterType $type
     *
     * @return $this
     */
    public function setFilterType(FilterType $type): self
    {
        $this->filterType = $type;

        return $this;
    }

    /**
     * Получение типа фильтрации
     *
     * @return FilterType
     */
    public function getFilterType(): FilterType
    {
        return $this->filterType;
    }

    public function getKeywordFilters(array $excludeFilter = []): FilterGroupCollection
    {
        return $this->getFilters(false, $excludeFilter);
    }

    public function getRangeFilters(array $excludeFilter = []): FilterGroupCollection
    {
        return $this->getFilters(true, $excludeFilter);
    }

    private function getFilters(bool $range = false, array $excludeFilter = []): FilterGroupCollection
    {
        $filterGroup = new FilterGroupCollection();
        $filterGroup->setLogicOperator($this->getLogicOperator());

        foreach ($this->data as $filter) {
            /** @var Filter $filter */

            $field = $filter->field()->value();

            if (false === in_array($field, $excludeFilter, true)
                && $range === in_array($filter->operator(), [
                    FilterOperator::LT,
                    FilterOperator::LTE,
                    FilterOperator::GT,
                    FilterOperator::GTE
                ], true)
            ) {
                $filterGroup->add($filter);
            }
        }

        return $filterGroup;
    }
Nikita Chernykh's avatar
Nikita Chernykh committed
}