Skip to content
Snippets Groups Projects
Commit 5cab7843 authored by Pavel's avatar Pavel
Browse files

update processing criteria

parent a97221fe
No related branches found
No related tags found
No related merge requests found
......@@ -18,7 +18,7 @@
"require": {
"php": ">=7.4",
"ramsey/collection": "^1.2",
"iqdev/search-dc": "1.1",
"iqdev/search-dc": "1.1.*",
"elasticsearch/elasticsearch": "^8.5",
"vlucas/phpdotenv": "^5.4.1"
},
......
......@@ -21,7 +21,10 @@ use IQDEV\Search\Criteria;
use IQDEV\Search\Document\Property\AttrType;
use IQDEV\Search\Document\Property\PropertyType;
use IQDEV\Search\FIlter\Filter;
use IQDEV\Search\Filter\FilterCollection;
use IQDEV\Search\Filter\FilterGroupCollection;
use IQDEV\Search\Filter\FilterOperator;
use IQDEV\Search\Filter\LogicOperator;
use IQDEV\Search\Order\Order;
use IQDEV\Search\Order\OrderAscType as SOrderAscType;
use IQDEV\Search\Order\OrderDescType as SOrderDescType;
......@@ -88,35 +91,38 @@ final class CriteriaToEsRequest
return $request;
}
foreach ($criteria->filters() as $filter) {
/** @var Filter $filter */
$value = $filter->value()->value();
$field = $filter->field()->value();
if ('search' === $field) {
if ($filter->operator()->value() === FilterOperator::CONTAINS) {
$request->addMatch(
'suggest_search_content',
[
'query' => $value,
],
);
} else {
$request->addMatch(
'full_search_content',
[
'query' => $value,
],
);
foreach ($criteria->filters() as $filterGroup) {
/** @var FilterGroupCollection $filterGroup */
foreach ($filterGroup as $filter) {
/** @var Filter $filter */
$value = $filter->value()->value();
$field = $filter->field()->value();
if ('search' === $field) {
if ($filter->operator()->value() === FilterOperator::CONTAINS) {
$request->addMatch(
'suggest_search_content',
[
'query' => $value,
],
);
} else {
$request->addMatch(
'full_search_content',
[
'query' => $value,
],
);
}
continue;
}
continue;
}
if ('category_id' === $field) {
$request->getQuery()->must(
new Terms('category_id', $filter->value()->value())
);
continue;
if ('category_id' === $field) {
$request->getQuery()->must(
new Terms('category_id', $filter->value()->value())
);
continue;
}
}
}
......@@ -147,32 +153,48 @@ final class CriteriaToEsRequest
$ranges = [];
foreach ($criteria->filters() as $filter) {
/** @var Filter $filter */
$value = $filter->value()->value();
$field = $filter->field()->value();
if (in_array($field, $excludeFilter, true)) {
foreach ($criteria->filters() as $filterGroup) {
/** @var FilterGroupCollection $filterGroup */
if ($filterGroup->isEmpty()) {
continue;
}
if (in_array($filter->operator()->value(), [FilterOperator::LT, FilterOperator::LTE], true)) {
$ranges[$field][$filter->operator()->value()] = $value;
continue;
$group = $filterGroup->getLogicalType()->value() === LogicOperator::OR ? count($ranges) + 1 : 0;
if (!isset($ranges[$group])) {
$ranges[$group] = [];
}
foreach ($filterGroup as $filter) {
/** @var Filter $filter */
$value = $filter->value()->value();
$field = $filter->field()->value();
if (in_array($filter->operator()->value(), [FilterOperator::GT, FilterOperator::GTE], true)) {
$ranges[$field][$filter->operator()->value()] = $value;
if (in_array($field, $excludeFilter, true)) {
continue;
}
if (in_array($filter->operator()->value(), [FilterOperator::LT, FilterOperator::LTE], true)) {
$ranges[$group][$field][$filter->operator()->value()] = $value;
continue;
}
if (in_array($filter->operator()->value(), [FilterOperator::GT, FilterOperator::GTE], true)) {
$ranges[$group][$field][$filter->operator()->value()] = $value;
}
}
}
if (false === empty($ranges)) {
foreach ($ranges as $field => $range) {
$numberFilter->filter(
new FilterNumberFacet(
foreach ($ranges as $iGroup => $group) {
foreach ($group as $field => $range) {
$facet = new FilterNumberFacet(
$field,
$range
)
);
);
if ($iGroup === 0) {
$numberFilter->filter($facet);
} else {
$numberFilter->should($facet);
}
}
}
}
......@@ -182,38 +204,41 @@ final class CriteriaToEsRequest
private function getKeywordFilter(Criteria $criteria, array $excludeFilter = []): Query
{
$keywordFilter = new Query();
foreach ($criteria->filters() as $filter) {
/** @var Filter $filter */
$value = $filter->value()->value();
$field = $filter->field()->value();
foreach ($criteria->filters() as $filterGroup) {
/** @var FilterGroupCollection $filterGroup */
foreach ($filterGroup as $filter) {
/** @var Filter $filter */
$value = $filter->value()->value();
$field = $filter->field()->value();
if (in_array($field, $excludeFilter, true)) {
continue;
}
if (in_array($field, $excludeFilter, true)) {
continue;
}
if (in_array($filter->operator()->value(), [FilterOperator::LT, FilterOperator::LTE], true)) {
continue;
}
if (in_array($filter->operator()->value(), [FilterOperator::LT, FilterOperator::LTE], true)) {
continue;
}
if (in_array($filter->operator()->value(), [FilterOperator::GT, FilterOperator::GTE], true)) {
continue;
}
if (in_array($filter->operator()->value(), [FilterOperator::GT, FilterOperator::GTE], true)) {
continue;
}
if ('search' === $field) {
continue;
}
if ('search' === $field) {
continue;
}
if ('category_id' === $field) {
continue;
}
if ('category_id' === $field) {
continue;
}
if (is_array($value)) {
$value = array_map(static fn($v) => (string)$v, $value);
} else {
$value = (string)$value;
}
if (is_array($value)) {
$value = array_map(static fn($v) => (string)$v, $value);
} else {
$value = (string)$value;
$keywordFilter->filter(new FilterKeywordFacet($field, $value));
}
$keywordFilter->filter(new FilterKeywordFacet($field, $value));
}
return $keywordFilter;
......@@ -242,157 +267,160 @@ final class CriteriaToEsRequest
);
$getKey = static fn(string $type, string $name): string => sprintf('%s_facet_%s', $type, $name);
foreach ($criteria->filters() as $filter) {
/** @var Filter $filter */
$field = $filter->field()->value();
if (in_array(
$filter->operator()->value(),
[
FilterOperator::LT,
FilterOperator::LTE,
FilterOperator::GT,
FilterOperator::GTE,
],
true
)
) {
$aggsFiltered = new Aggs($getKey('number', $field));
foreach ($criteria->filters() as $filterGroup) {
/** @var FilterGroupCollection $filterGroup */
foreach ($filterGroup as $filter) {
/** @var Filter $filter */
$field = $filter->field()->value();
if (in_array(
$filter->operator()->value(),
[
FilterOperator::LT,
FilterOperator::LTE,
FilterOperator::GT,
FilterOperator::GTE,
],
true
)
) {
$aggsFiltered = new Aggs($getKey('number', $field));
$aggsFiltered->addAggs(
AggsFacetStats::create(
'agg_special',
'number_facet'
)
);
$queryNumberFiltered = new Query();
$keywordFilter = $this->getKeywordFilter($criteria);
$numberFilter = $this->getNumberFilter($criteria, [$field]);
if (false === $keywordFilter->isEmpty()) {
$nestedFilterKeyword = new Nested();
$nestedFilterKeyword->setPath('search_data')
->setQuery($keywordFilter);
$queryNumberFiltered->filter($nestedFilterKeyword);
}
if (false === $numberFilter->isEmpty()) {
$nestedFilterNumber = new Nested();
$nestedFilterNumber->setPath('search_data')
->setQuery($numberFilter);
$queryNumberFiltered->filter($nestedFilterNumber);
}
if ($queryNumberFiltered->isEmpty() === false) {
$aggsFiltered->setQuery($queryNumberFiltered);
} else {
$aggsFiltered->setNested((new Nested())->setPath('search_data'));
}
$request->getAggs()->add($aggsFiltered);
continue;
}
if (in_array($filter->operator()->value(), [], true)) {
continue;
}
if ('search' === $field) {
continue;
}
if ('category_id' === $field) {
continue;
}
$aggsFiltered = new Aggs($getKey('keyword', $field));
$aggsFiltered->addAggs(
AggsFacetStats::create(
AggsFacetTerms::create(
'agg_special',
'number_facet'
'keyword_facet'
)
);
$queryNumberFiltered = new Query();
$keywordFilter = $this->getKeywordFilter($criteria);
$numberFilter = $this->getNumberFilter($criteria, [$field]);
$queryKeywordFiltered = new Query();
$keywordFilter = $this->getKeywordFilter($criteria, [$field]);
$numberFilter = $this->getNumberFilter($criteria);
if (false === $keywordFilter->isEmpty()) {
$nestedFilterKeyword = new Nested();
$nestedFilterKeyword->setPath('search_data')
->setQuery($keywordFilter);
$queryNumberFiltered->filter($nestedFilterKeyword);
$queryKeywordFiltered->filter($nestedFilterKeyword);
}
if (false === $numberFilter->isEmpty()) {
$nestedFilterNumber = new Nested();
$nestedFilterNumber->setPath('search_data')
->setQuery($numberFilter);
$queryNumberFiltered->filter($nestedFilterNumber);
$queryKeywordFiltered->filter($nestedFilterNumber);
}
if ($queryNumberFiltered->isEmpty() === false) {
$aggsFiltered->setQuery($queryNumberFiltered);
if ($queryKeywordFiltered->isEmpty() === false) {
$aggsFiltered->setQuery($queryKeywordFiltered);
} else {
$aggsFiltered->setNested((new Nested())->setPath('search_data'));
}
$request->getAggs()->add($aggsFiltered);
continue;
}
if (in_array($filter->operator()->value(), [], true)) {
continue;
}
if ('search' === $field) {
continue;
}
if ('category_id' === $field) {
continue;
}
$keywordFilter = $this->getKeywordFilter($criteria);
$numberFilter = $this->getNumberFilter($criteria);
$aggsFiltered = new Aggs($getKey('keyword', $field));
$aggsFiltered->addAggs(
$aggsKeywordFiltered = new Aggs('keyword_facet_filtered');
$aggsKeywordFiltered->addAggs(
AggsFacetTerms::create(
'agg_special',
'all_keyword_facet_filtered',
'keyword_facet'
)
);
$queryKeywordFiltered = new Query();
$keywordFilter = $this->getKeywordFilter($criteria, [$field]);
$numberFilter = $this->getNumberFilter($criteria);
$aggsNumberFiltered = new Aggs('number_facet_filtered');
$aggsNumberFiltered->addAggs(
AggsFacetStats::create(
'all_number_facet_filtered',
'number_facet'
)
);
$queryNumberFiltered = new Query();
if (false === $keywordFilter->isEmpty()) {
$nestedFilterKeyword = new Nested();
$nestedFilterKeyword->setPath('search_data')
->setQuery($keywordFilter);
$queryKeywordFiltered->filter($nestedFilterKeyword);
$queryNumberFiltered->filter($nestedFilterKeyword);
}
if (false === $numberFilter->isEmpty()) {
$nestedFilterNumber = new Nested();
$nestedFilterNumber->setPath('search_data')
->setQuery($numberFilter);
$queryKeywordFiltered->filter($nestedFilterNumber);
$queryNumberFiltered->filter($nestedFilterNumber);
}
if ($queryKeywordFiltered->isEmpty() === false) {
$aggsFiltered->setQuery($queryKeywordFiltered);
if (false === $queryKeywordFiltered->isEmpty()) {
$aggsKeywordFiltered->setQuery($queryKeywordFiltered);
} else {
$aggsFiltered->setNested((new Nested())->setPath('search_data'));
$aggsKeywordFiltered->setNested((new Nested())->setPath('search_data'));
}
$request->getAggs()->add($aggsFiltered);
}
$keywordFilter = $this->getKeywordFilter($criteria);
$numberFilter = $this->getNumberFilter($criteria);
$aggsKeywordFiltered = new Aggs('keyword_facet_filtered');
$aggsKeywordFiltered->addAggs(
AggsFacetTerms::create(
'all_keyword_facet_filtered',
'keyword_facet'
)
);
$queryKeywordFiltered = new Query();
$aggsNumberFiltered = new Aggs('number_facet_filtered');
$aggsNumberFiltered->addAggs(
AggsFacetStats::create(
'all_number_facet_filtered',
'number_facet'
)
);
$queryNumberFiltered = new Query();
if (false === $keywordFilter->isEmpty()) {
$nestedFilterKeyword = new Nested();
$nestedFilterKeyword->setPath('search_data')
->setQuery($keywordFilter);
$queryKeywordFiltered->filter($nestedFilterKeyword);
$queryNumberFiltered->filter($nestedFilterKeyword);
}
if (false === $numberFilter->isEmpty()) {
$nestedFilterNumber = new Nested();
$nestedFilterNumber->setPath('search_data')
->setQuery($numberFilter);
$queryKeywordFiltered->filter($nestedFilterNumber);
$queryNumberFiltered->filter($nestedFilterNumber);
}
if (false === $queryKeywordFiltered->isEmpty()) {
$aggsKeywordFiltered->setQuery($queryKeywordFiltered);
} else {
$aggsKeywordFiltered->setNested((new Nested())->setPath('search_data'));
}
if (false === $queryNumberFiltered->isEmpty()) {
$aggsNumberFiltered->setQuery($queryNumberFiltered);
} else {
$aggsNumberFiltered->setNested((new Nested())->setPath('search_data'));
}
if (false === $queryNumberFiltered->isEmpty()) {
$aggsNumberFiltered->setQuery($queryNumberFiltered);
} else {
$aggsNumberFiltered->setNested((new Nested())->setPath('search_data'));
$request->getAggs()
->add($aggsKeywordFiltered)
->add($aggsNumberFiltered);
}
$request->getAggs()
->add($aggsKeywordFiltered)
->add($aggsNumberFiltered);
return $request;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment