Newer
Older
namespace IQDEV\ElasticSearch\Criteria\Filter\Collection;
use IQDEV\ElasticSearch\Criteria\Filter\Filter;
use IQDEV\ElasticSearch\Criteria\Filter\FilterOperator;
use IQDEV\ElasticSearch\Criteria\Filter\FilterType;
use IQDEV\ElasticSearch\Criteria\Filter\LogicOperator;
use Ramsey\Collection\AbstractCollection;
/**
* @method bool add(Filter $item)
*/
class FilterGroupCollection extends AbstractCollection
{
/** @var LogicOperator Тип логической операции для коллекции */
/** @var FilterType Тип фильтра для коллекции */
protected FilterType $filterType;
/**
* @param Filter[] $data
*/
public function __construct(array $data = [])
{
parent::__construct($data);
$this->filterType = FilterType::POST;
}
/**
* @inheritDoc
*/
public function getType(): string
{
return Filter::class;
}
/**
* Установка типа логической операции
*
* @param LogicOperator $type
*
* @return $this
*/
public function setLogicOperator(LogicOperator $type): self
return $this;
}
/**
* Получение типа логической операции
*
* @return LogicOperator
*/
public function getLogicOperator(): LogicOperator
}
/**
* Установка типа фильтрации
*
* @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;
}
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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;
}