Commit ec78f088 authored by Pavel's avatar Pavel
Browse files

Merge branch 'filter_group' into 'main'

Filter group

See merge request piligrimov/search-es!1
parents 41380b82 874f3637
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@
  "require": {
    "php": ">=7.4",
    "ramsey/collection": "^1.2",
    "iqdev/search-dc": "1.0",
    "iqdev/search-dc": "1.1.*",
    "elasticsearch/elasticsearch": "^8.5",
    "vlucas/phpdotenv": "^5.4.1"
  },
@@ -32,5 +32,10 @@
      "type": "vcs",
      "url": "ssh://git@gitlab.iqdev.digital:8422/piligrimov/search-dc.git"
    }
  ]
  ],
  "config": {
    "allow-plugins": {
      "php-http/discovery": true
    }
  }
}
+205 −169
Original line number Diff line number Diff line
@@ -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,7 +91,9 @@ final class CriteriaToEsRequest
            return $request;
        }

        foreach ($criteria->filters() as $filter) {
        foreach ($criteria->filters() as $filterGroup) {
            /** @var FilterGroupCollection $filterGroup */
            foreach ($filterGroup as $filter) {
                /** @var Filter $filter */
                $value = $filter->value()->value();
                $field = $filter->field()->value();
@@ -119,6 +124,7 @@ final class CriteriaToEsRequest
                    continue;
                }
            }
        }

        $keywordFilter = $this->getKeywordFilter($criteria);
        if (false === $keywordFilter->isEmpty()) {
@@ -147,7 +153,16 @@ final class CriteriaToEsRequest

        $ranges = [];

        foreach ($criteria->filters() as $filter) {
        foreach ($criteria->filters() as $filterGroup) {
            /** @var FilterGroupCollection $filterGroup */
            if ($filterGroup->isEmpty()) {
                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();
@@ -156,23 +171,30 @@ final class CriteriaToEsRequest
                    continue;
                }
                if (in_array($filter->operator()->value(), [FilterOperator::LT, FilterOperator::LTE], true)) {
                $ranges[$field][$filter->operator()->value()] = $value;
                    $ranges[$group][$field][$filter->operator()->value()] = $value;
                    continue;
                }

                if (in_array($filter->operator()->value(), [FilterOperator::GT, FilterOperator::GTE], true)) {
                $ranges[$field][$filter->operator()->value()] = $value;
                    $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,7 +204,13 @@ final class CriteriaToEsRequest
    private function getKeywordFilter(Criteria $criteria, array $excludeFilter = []): Query
    {
        $keywordFilter = new Query();
        foreach ($criteria->filters() as $filter) {
        foreach ($criteria->filters() as $filterGroup) {
            /** @var FilterGroupCollection $filterGroup */
            if ($filterGroup->isEmpty()) {
                continue;
            }
            $should = $filterGroup->getLogicalType()->value() === LogicOperator::OR;
            foreach ($filterGroup as $filter) {
                /** @var Filter $filter */
                $value = $filter->value()->value();
                $field = $filter->field()->value();
@@ -213,8 +241,13 @@ final class CriteriaToEsRequest
                    $value = (string)$value;
                }

                if ($should) {
                    $keywordFilter->should(new FilterKeywordFacet($field, $value));
                } else {
                    $keywordFilter->filter(new FilterKeywordFacet($field, $value));
                }
            }
        }

        return $keywordFilter;
    }
@@ -242,7 +275,9 @@ final class CriteriaToEsRequest
        );

        $getKey = static fn(string $type, string $name): string => sprintf('%s_facet_%s', $type, $name);
        foreach ($criteria->filters() as $filter) {
        foreach ($criteria->filters() as $filterGroup) {
            /** @var FilterGroupCollection $filterGroup */
            foreach ($filterGroup as $filter) {
                /** @var Filter $filter */
                $field = $filter->field()->value();

@@ -392,6 +427,7 @@ final class CriteriaToEsRequest
            $request->getAggs()
                ->add($aggsKeywordFiltered)
                ->add($aggsNumberFiltered);
        }

        return $request;
    }
+1 −0
Original line number Diff line number Diff line
@@ -113,6 +113,7 @@ final class Query implements Esable

        if (false === $this->should->isEmpty()) {
            $bool['should'] = $this->should->es();
            $bool['minimum_should_match'] = 1;
        }

        if (false === $this->match->isEmpty()) {