Commit ac3e9dd0 authored by Vadim Galizyanov's avatar Vadim Galizyanov
Browse files

separation of filters into post and query

parent ec78f088
Loading
Loading
Loading
Loading

.env.example

0 → 100644
+4 −0
Original line number Diff line number Diff line
IQ_ES_HOSTS=127.0.0.1:9200
IQ_ES_USER=
IQ_ES_PASSWORD=
IQ_ES_PRODUCT_SEARCH_INDEX=
 No newline at end of file
+3 −1
Original line number Diff line number Diff line
@@ -2,3 +2,5 @@
/composer.lock
/vendor/
/.idea/
.env
.phpunit.result.cache
 No newline at end of file
+12 −0
Original line number Diff line number Diff line
@@ -27,12 +27,24 @@
      "IQDEV\\ElasticSearch\\": "src/ElasticSearch/"
    }
  },
  "autoload-dev": {
    "psr-4": {
      "IQDEV\\ElasticSearchTests\\": "tests/"
    }
  },
  "repositories": [
    {
      "type": "vcs",
      "url": "ssh://git@gitlab.iqdev.digital:8422/piligrimov/search-dc.git"
    }
  ],
  "require-dev": {
    "phpunit/phpunit": "^9.5",
    "symfony/var-dumper": "^5.4"
  },
  "scripts": {
    "tests": "php ./vendor/bin/phpunit --testdox --verbose"
  },
  "config": {
    "allow-plugins": {
      "php-http/discovery": true

phpunit.xml.dist

0 → 100644
+24 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>

<phpunit colors="true" 
         convertErrorsToExceptions="true" 
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true" 
         processIsolation="false" 
         stopOnFailure="false"
         bootstrap="tests/bootstrap.php">
    <testsuites>
        <testsuite name="Project Tests Suite">
            <directory>tests</directory>
        </testsuite>
    </testsuites>

    <coverage processUncoveredFiles="true">
        <include>
            <directory suffix=".php">src/ElasticSearch/</directory>
        </include>
    </coverage>
    <php>
        <env name="IQ_ES_PRODUCT_SEARCH_INDEX" value="product-test"/>
    </php>
</phpunit>
 No newline at end of file
+72 −20
Original line number Diff line number Diff line
@@ -2,6 +2,8 @@

namespace IQDEV\ElasticSearch\Converter;

use IQDEV\ElasticSearch\Filter\PostFilterCollection;
use IQDEV\ElasticSearch\Filter\QueryFilterCollection;
use IQDEV\ElasticSearch\Order\OrderAscType;
use IQDEV\ElasticSearch\Order\OrderDescType;
use IQDEV\ElasticSearch\Order\OrderField;
@@ -24,6 +26,7 @@ use IQDEV\Search\FIlter\Filter;
use IQDEV\Search\Filter\FilterCollection;
use IQDEV\Search\Filter\FilterGroupCollection;
use IQDEV\Search\Filter\FilterOperator;
use IQDEV\Search\Filter\FilterType;
use IQDEV\Search\Filter\LogicOperator;
use IQDEV\Search\Order\Order;
use IQDEV\Search\Order\OrderAscType as SOrderAscType;
@@ -126,34 +129,56 @@ final class CriteriaToEsRequest
            }
        }

        $keywordFilter = $this->getKeywordFilter($criteria);
        if (false === $keywordFilter->isEmpty()) {
        [$queryFilters, $postFilters] = $this->groupFilters($criteria->filters());

        $keywordQueryFilter = $this->getKeywordFilter($queryFilters);
        $keywordPostFilter = $this->getKeywordFilter($postFilters);
        if (false === $keywordQueryFilter->isEmpty() || false === $keywordPostFilter->isEmpty()) {
            $keywordNestedFilter = new Nested();
            $keywordNestedFilter->setPath('search_data')
                ->setQuery($keywordFilter);
            $keywordNestedFilter->setPath('search_data');

            $request->getPostFilter()->filter($keywordNestedFilter);
            if (false === $keywordQueryFilter->isEmpty()) {
                $keywordNestedFilterQuery = clone $keywordNestedFilter;
                $keywordNestedFilterQuery->setQuery($keywordQueryFilter);
                $request->getQuery()->filter($keywordNestedFilterQuery);
            }

        $numberFilter = $this->getNumberFilter($criteria);
        if (false === $numberFilter->isEmpty()) {
            if (false === $keywordPostFilter->isEmpty()) {
                $keywordNestedFilterPost = clone $keywordNestedFilter;
                $keywordNestedFilterPost->setQuery($keywordPostFilter);
                $request->getPostFilter()->filter($keywordNestedFilterPost);
            }
        }

        $numberQueryFilter = $this->getNumberFilter($queryFilters);
        $numberPostFilter = $this->getNumberFilter($postFilters);
        if (false === $numberQueryFilter->isEmpty() || false === $numberPostFilter->isEmpty()) {
            $numberNestedFilter = new Nested();
            $numberNestedFilter->setPath('search_data')
                ->setQuery($numberFilter);
            $numberNestedFilter->setPath('search_data');

            if (false === $numberQueryFilter->isEmpty()) {
                $numberNestedFilterQuery = clone $numberNestedFilter;
                $numberNestedFilterQuery->setQuery($numberQueryFilter);
                $request->getQuery()->filter($numberNestedFilterQuery);
            }

            $request->getPostFilter()->filter($numberNestedFilter);
            if (false === $numberPostFilter->isEmpty()) {
                $numberNestedFilterPost = clone $numberNestedFilter;
                $numberNestedFilterPost->setQuery($numberPostFilter);
                $request->getPostFilter()->filter($numberNestedFilterPost);
            }
        }

        return $request;
    }

    private function getNumberFilter(Criteria $criteria, array $excludeFilter = []): Query
    private function getNumberFilter(FilterCollection $filterCollection, array $excludeFilter = []): Query
    {
        $numberFilter = new Query();

        $ranges = [];

        foreach ($criteria->filters() as $filterGroup) {
        foreach ($filterCollection as $filterGroup) {
            /** @var FilterGroupCollection $filterGroup */
            if ($filterGroup->isEmpty()) {
                continue;
@@ -201,10 +226,10 @@ final class CriteriaToEsRequest
        return $numberFilter;
    }

    private function getKeywordFilter(Criteria $criteria, array $excludeFilter = []): Query
    private function getKeywordFilter(FilterCollection $filterCollection, array $excludeFilter = []): Query
    {
        $keywordFilter = new Query();
        foreach ($criteria->filters() as $filterGroup) {
        foreach ($filterCollection as $filterGroup) {
            /** @var FilterGroupCollection $filterGroup */
            if ($filterGroup->isEmpty()) {
                continue;
@@ -301,8 +326,8 @@ final class CriteriaToEsRequest
                    );

                    $queryNumberFiltered = new Query();
                    $keywordFilter       = $this->getKeywordFilter($criteria);
                    $numberFilter        = $this->getNumberFilter($criteria, [$field]);
                    $keywordFilter       = $this->getKeywordFilter($criteria->filters());
                    $numberFilter        = $this->getNumberFilter($criteria->filters(), [$field]);

                    if (false === $keywordFilter->isEmpty()) {
                        $nestedFilterKeyword = new Nested();
@@ -348,8 +373,8 @@ final class CriteriaToEsRequest
                    )
                );
                $queryKeywordFiltered = new Query();
                $keywordFilter        = $this->getKeywordFilter($criteria, [$field]);
                $numberFilter         = $this->getNumberFilter($criteria);
                $keywordFilter        = $this->getKeywordFilter($criteria->filters(), [$field]);
                $numberFilter         = $this->getNumberFilter($criteria->filters());
                if (false === $keywordFilter->isEmpty()) {
                    $nestedFilterKeyword = new Nested();
                    $nestedFilterKeyword->setPath('search_data')
@@ -373,8 +398,8 @@ final class CriteriaToEsRequest
                $request->getAggs()->add($aggsFiltered);
            }

            $keywordFilter = $this->getKeywordFilter($criteria);
            $numberFilter  = $this->getNumberFilter($criteria);
            $keywordFilter = $this->getKeywordFilter($criteria->filters());
            $numberFilter  = $this->getNumberFilter($criteria->filters());

            $aggsKeywordFiltered = new Aggs('keyword_facet_filtered');
            $aggsKeywordFiltered->addAggs(
@@ -431,4 +456,31 @@ final class CriteriaToEsRequest

        return $request;
    }

    /**
     * @param FilterCollection $filters
     * @return FilterCollection[]
     */
    private function groupFilters(FilterCollection $filters): array
    {
        $queryFilters = new QueryFilterCollection();
        $postFilters = new PostFilterCollection();
        foreach ($filters as $filterGroup) {
            /** @var FilterGroupCollection $filterGroup */
            if ($filterGroup->isEmpty()) {
                continue;
            }

            switch ($filterGroup->getFilterType()->value()) {
                case FilterType::QUERY:
                    $queryFilters->add($filterGroup);
                    break;
                case FilterType::POST:
                    $postFilters->add($filterGroup);
                    break;
            }
        }

        return [$queryFilters, $postFilters];
    }
}
Loading