diff --git a/src/ElasticSearch/Config/BaseConfiguration.php b/src/ElasticSearch/Config/BaseConfiguration.php index 421dc12b6b55a04a5460c928bcb50309faebf78f..73e561c182aa0095786c64ae58987c690b01c4be 100644 --- a/src/ElasticSearch/Config/BaseConfiguration.php +++ b/src/ElasticSearch/Config/BaseConfiguration.php @@ -3,23 +3,17 @@ namespace IQDEV\ElasticSearch\Config; use IQDEV\ElasticSearch\Configuration; -use IQDEV\ElasticSearch\Mapping; class BaseConfiguration implements Configuration { - public function __construct( - private readonly Mapping $mapping, - ) { - } - public function getIndexName(): string { return $_ENV['IQ_ES_PRODUCT_SEARCH_INDEX']; } - public function getMapping(): Mapping + public function getMapping(): array { - return $this->mapping; + return include __DIR__.'/product.mappings.php'; } public function getSettings(): array diff --git a/src/ElasticSearch/Config/Mapping/ProductMapping.php b/src/ElasticSearch/Config/Mapping/ProductMapping.php deleted file mode 100644 index 01e5d287338804f7b0f66571f0b1601bdd0419e2..0000000000000000000000000000000000000000 --- a/src/ElasticSearch/Config/Mapping/ProductMapping.php +++ /dev/null @@ -1,41 +0,0 @@ - [ - 'type' => 'object', - 'enabled' => false, - ], - 'full_search_content' => [ - 'type' => 'text', - ], - 'suggest_search_content' => [ - 'type' => 'text', - 'analyzer' => 'autocomplete', - 'search_analyzer' => 'standard', - ], - 'category_id' => [ - 'type' => 'keyword', - 'index' => false, - ], - 'rating' => [ - 'type' => 'double', - 'index' => false, - ], - 'popular' => [ - 'type' => 'double', - 'index' => false, - ], - ]; - } -} diff --git a/src/ElasticSearch/Config/MappingValidator.php b/src/ElasticSearch/Config/MappingValidator.php index 81faf5ed8ab1242a01ce86627064c2eb5a68c35f..e8d6b308b9385047f3b490b467b2b144390b00f4 100644 --- a/src/ElasticSearch/Config/MappingValidator.php +++ b/src/ElasticSearch/Config/MappingValidator.php @@ -16,7 +16,7 @@ class MappingValidator */ public static function isPropertyExists(Configuration $configuration, string $property): bool { - $properties = array_keys($configuration->getMapping()->es()['properties'] ?? []); + $properties = array_keys($configuration->getMapping()['properties'] ?? []); return in_array($property, $properties, true); } diff --git a/src/ElasticSearch/Configuration.php b/src/ElasticSearch/Configuration.php index 0baecb94b078b06f14452da3f9f5a915b2b876d4..da7c7d2a80b39e0acd3b0f5a00a0f404a8fe437c 100644 --- a/src/ElasticSearch/Configuration.php +++ b/src/ElasticSearch/Configuration.php @@ -6,7 +6,7 @@ interface Configuration { public function getIndexName(): string; - public function getMapping(): Mapping; + public function getMapping(): array; public function getSettings(): array; } diff --git a/src/ElasticSearch/Converter/CriteriaToEsRequest.php b/src/ElasticSearch/Converter/CriteriaToEsRequest.php deleted file mode 100644 index 333babfc646a7662f049628c0e1d819f171bc95f..0000000000000000000000000000000000000000 --- a/src/ElasticSearch/Converter/CriteriaToEsRequest.php +++ /dev/null @@ -1,487 +0,0 @@ -pagination($request, $criteria); - $request = $this->order($request, $criteria); - $request = $this->search($request, $criteria); - $request = $this->filter($request, $criteria); - $request = $this->aggs($request, $criteria); - - return $request; - } - - private function pagination(Request $request, Criteria $criteria): Request - { - $request = clone $request; - - $request->setPagination(new Pagination($criteria->getPagination()->limit, $criteria->getPagination()->offset)); - - return $request; - } - - private function order(Request $request, Criteria $criteria): Request - { - $request = clone $request; - - if (true === $criteria->getSorting()->isEmpty()) { - return $request; - } - - foreach ($criteria->getSorting() as $order) { - /** @var Order $order */ - $request->getSort()->add($order); - } - - return $request; - } - - private function search(Request $request, Criteria $criteria): Request - { - $request = clone $request; - - foreach ($criteria->getSearch() as $search) { - /** @var Search $search */ - $searchQuery = new SearchQuery($search); - - if ($search->getProperty()->getType() === PropertyType::TEXT) { - $request->getQueryMatch()->add($searchQuery->toQueryMatch()); - } else { - $request->getQuery()->getMust()->add($searchQuery->toMust($this->configuration)); - } - } - - return $request; - } - - private function filter(Request $request, Criteria $criteria): Request - { - $request = clone $request; - if ($criteria->getFilters()->isEmpty()) { - return $request; - } - - $queryFilters = $criteria->getFilters()->getFilterCollectionByType(FilterType::QUERY); - $postFilters = $criteria->getFilters()->getFilterCollectionByType(FilterType::POST); - - $this->addFilterToRequest($request, $queryFilters); - $this->addPostFilterToRequest($request, $postFilters); - - return $request; - } - - private function separatePropertyTypes(FilterCollection $filterCollection): array - { - $propertyFilter = new FilterCollection(); - $nestedFilter = new FilterCollection(); - - foreach ($filterCollection as $groupFilter) { - /** @var FilterGroupCollection $groupFilter */ - $propertyGroupCollection = new FilterGroupCollection(); - $nestedGroupCollection = new FilterGroupCollection(); - - $propertyGroupCollection->setLogicOperator($groupFilter->getLogicOperator()); - $nestedGroupCollection->setLogicOperator($groupFilter->getLogicOperator()); - - foreach ($groupFilter as $filter) { - /** @var Filter $filter */ - if (true === MappingValidator::isPropertyExists($this->configuration, $filter->field()->value())) { - $propertyGroupCollection->add($filter); - } else { - $nestedGroupCollection->add($filter); - } - } - - if (false === $propertyGroupCollection->isEmpty()) { - $propertyFilter->add($propertyGroupCollection); - } - - if (false === $nestedGroupCollection->isEmpty()) { - $nestedFilter->add($nestedGroupCollection); - } - } - - return [$propertyFilter, $nestedFilter]; - } - - private function addFilterToRequest(Request $request, QueryFilterCollection $filterCollection): void - { - [$propertyFilterCollection, $nestedFilterCollection] = $this->separatePropertyTypes($filterCollection); - - $this->addPropertyFilterToRequest($request, $propertyFilterCollection); - $this->addNestedFilterToRequest($request, $nestedFilterCollection); - } - - private function addPostFilterToRequest(Request $request, PostFilterCollection $filterCollection): void - { - [$propertyFilterCollection, $nestedFilterCollection] = $this->separatePropertyTypes($filterCollection); - - $this->addPropertyPostFilterToRequest($request, $propertyFilterCollection); - $this->addNestedPostFilterToRequest($request, $nestedFilterCollection); - } - - private function addPropertyFilterToRequest(Request $request, FilterCollection $filterCollection): void - { - $keywordFilterCollection = $this->getKeywordFilter($filterCollection); - foreach ($keywordFilterCollection->getFilter() as $filter) { - $request->getQuery()->getFilter()->add($filter); - } - foreach ($keywordFilterCollection->getShould() as $should) { - $request->getQuery()->getShould()->add($should); - } - - $numberFilterCollection = $this->getNumberFilter($filterCollection); - foreach ($numberFilterCollection->getFilter() as $filter) { - $request->getQuery()->getFilter()->add($filter); - } - foreach ($numberFilterCollection->getShould() as $should) { - $request->getQuery()->getShould()->add($should); - } - } - - private function addPropertyPostFilterToRequest(Request $request, FilterCollection $filterCollection): void - { - $keywordFilterCollection = $this->getKeywordFilter($filterCollection); - foreach ($keywordFilterCollection->getFilter() as $filter) { - $request->getPostFilter()->getFilter()->add($filter); - } - foreach ($keywordFilterCollection->getShould() as $should) { - $request->getPostFilter()->getShould()->add($should); - } - - $numberFilterCollection = $this->getNumberFilter($filterCollection); - foreach ($numberFilterCollection->getFilter() as $filter) { - $request->getPostFilter()->getFilter()->add($filter); - } - foreach ($numberFilterCollection->getShould() as $should) { - $request->getPostFilter()->getShould()->add($should); - } - } - - private function addNestedFilterToRequest(Request $request, FilterCollection $filterCollection): void - { - $keywordFilterCollection = $this->getKeywordFilter($filterCollection); - $keywordFilter = new Nested(); - $keywordFilter->setPath('search_data'); - - if (false === $keywordFilterCollection->isEmpty()) { - $keywordNestedFilterQuery = clone $keywordFilter; - $keywordNestedFilterQuery->setQuery($keywordFilterCollection); - $request->getQuery()->getFilter()->add($keywordNestedFilterQuery); - } - - $numberFilterCollection = $this->getNumberFilter($filterCollection); - $numberFilter = new Nested(); - $numberFilter->setPath('search_data'); - - if (false === $numberFilterCollection->isEmpty()) { - $numberNestedFilterQuery = clone $numberFilter; - $numberNestedFilterQuery->setQuery($numberFilterCollection); - $request->getQuery()->getFilter()->add($numberNestedFilterQuery); - } - } - - private function addNestedPostFilterToRequest(Request $request, FilterCollection $postFilter): void - { - $keywordFilterCollection = $this->getKeywordFilter($postFilter); - $keywordFilter = new Nested(); - $keywordFilter->setPath('search_data'); - - if (false === $keywordFilterCollection->isEmpty()) { - $keywordNestedFilterQuery = clone $keywordFilter; - $keywordNestedFilterQuery->setQuery($keywordFilterCollection); - $request->getPostFilter()->getFilter()->add($keywordNestedFilterQuery); - } - - $numberFilterCollection = $this->getNumberFilter($postFilter); - $numberFilter = new Nested(); - $numberFilter->setPath('search_data'); - - if (false === $numberFilterCollection->isEmpty()) { - $numberNestedFilterQuery = clone $numberFilter; - $numberNestedFilterQuery->setQuery($numberFilterCollection); - $request->getPostFilter()->getFilter()->add($numberNestedFilterQuery); - } - } - - private function getNumberFilter(FilterCollection $filterCollection, array $excludeFilter = []): Query - { - $numberFilter = new Query(); - - if ($filterCollection->isEmpty()) { - return $numberFilter; - } - $ranges = []; - - foreach ($filterCollection as $filterGroup) { - /** @var FilterGroupCollection $filterGroup */ - if ($filterGroup->isEmpty()) { - continue; - } - $group = $filterGroup->getLogicOperator() === 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($field, $excludeFilter, true)) { - continue; - } - if (in_array($filter->operator(), [FilterOperator::LT, FilterOperator::LTE], true)) { - $ranges[$group][$field][$filter->operator()->value] = $value; - continue; - } - - if (in_array($filter->operator(), [FilterOperator::GT, FilterOperator::GTE], true)) { - $ranges[$group][$field][$filter->operator()->value] = $value; - } - } - } - - if (false === empty($ranges)) { - foreach ($ranges as $iGroup => $group) { - foreach ($group as $field => $range) { - $isProperty = MappingValidator::isPropertyExists($this->configuration, $field); - $facet = $isProperty ? new Stats($field, $range) : new FilterNumberFacet( - $field, - $range - ); - - if ($iGroup === 0) { - $numberFilter->getFilter()->add($facet); - } else { - $numberFilter->getShould()->add($facet); - } - } - } - } - - return $numberFilter; - } - - private function getKeywordFilter(FilterCollection $filterCollection, array $excludeFilter = []): Query - { - $keywordFilter = new Query(); - - if ($filterCollection->isEmpty()) { - return $keywordFilter; - } - - foreach ($filterCollection as $filterGroup) { - /** @var FilterGroupCollection $filterGroup */ - if ($filterGroup->isEmpty()) { - continue; - } - $should = $filterGroup->getLogicOperator() === LogicOperator::OR; - foreach ($filterGroup as $filter) { - /** @var Filter $filter */ - $value = $filter->value()->value(); - $field = $filter->field()->value(); - $isProperty = MappingValidator::isPropertyExists($this->configuration, $field); - - if (in_array($field, $excludeFilter, true)) { - continue; - } - - if (in_array($filter->operator(), [FilterOperator::LT, FilterOperator::LTE], true)) { - continue; - } - - if (in_array($filter->operator(), [FilterOperator::GT, FilterOperator::GTE], true)) { - continue; - } - - if (is_array($value)) { - $value = array_map(static fn($v) => (string)$v, $value); - } else { - $value = (string)$value; - } - - if ($should) { - $keywordFilter->getShould()->add($isProperty ? new Terms($field, $value) : new FilterKeywordFacet($field, $value)); - } else { - $keywordFilter->getFilter()->add($isProperty ? new Terms($field, $value) : new FilterKeywordFacet($field, $value)); - } - } - } - - return $keywordFilter; - } - - private function aggs(Request $request, Criteria $criteria): Request - { - $request = clone $request; - - if ($criteria->getFilters()->isEmpty() && $criteria->getSearch()->isEmpty()) { - return $request; - } - - $request->getAggs()->add( - AggsFacetTerms::create( - 'keyword_facet', - 'keyword_facet' - ) - ); - - $request->getAggs()->add( - AggsFacetStats::create( - 'number_facet', - 'number_facet' - ) - ); - - $postFilters = $criteria->getFilters()->getFilterCollectionByType(FilterType::POST); - - $getKey = static fn(string $type, string $name): string => sprintf('%s_facet_%s', $type, $name); - foreach ($postFilters as $filterGroup) { - /** @var FilterGroupCollection $filterGroup */ - foreach ($filterGroup as $filter) { - /** @var Filter $filter */ - $field = $filter->field()->value(); - - if ($filter->value() instanceof FilterNumber) { - continue; - } - - if (in_array($filter->operator(), [], true)) { - continue; - } - - if ($filter->value() instanceof FilterKeyword) { - $aggsFiltered = new Aggs($getKey('keyword', $field)); - $aggsFiltered->addAggs( - AggsFacetTerms::create( - 'agg_special', - 'keyword_facet' - ) - ); - $queryKeywordFiltered = new Query(); - - $keywordFilter = $this->getKeywordFilter($postFilters, [$field]); - $numberFilter = $this->getNumberFilter($postFilters); - if (false === $keywordFilter->isEmpty()) { - $nestedFilterKeyword = new Nested(); - $nestedFilterKeyword->setPath('search_data') - ->setQuery($keywordFilter); - $queryKeywordFiltered->getFilter()->add($nestedFilterKeyword); - } - - if (false === $numberFilter->isEmpty()) { - $nestedFilterNumber = new Nested(); - $nestedFilterNumber->setPath('search_data') - ->setQuery($numberFilter); - $queryKeywordFiltered->getFilter()->add($nestedFilterNumber); - } - - if ($queryKeywordFiltered->isEmpty() === false) { - $aggsFiltered->setQuery($queryKeywordFiltered); - } else { - $aggsFiltered->setNested((new Nested())->setPath('search_data')); - } - - $request->getAggs()->add($aggsFiltered); - } - } - } - - $keywordFilter = $this->getKeywordFilter($postFilters); - $numberFilter = $this->getNumberFilter($postFilters); - - $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->getFilter()->add($nestedFilterKeyword); - $queryNumberFiltered->getFilter()->add($nestedFilterKeyword); - } - - if (false === $numberFilter->isEmpty()) { - $nestedFilterNumber = new Nested(); - $nestedFilterNumber->setPath('search_data') - ->setQuery($numberFilter); - - $queryKeywordFiltered->getFilter()->add($nestedFilterNumber); - $queryNumberFiltered->getFilter()->add($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')); - } - - $request->getAggs() - ->add($aggsKeywordFiltered) - ->add($aggsNumberFiltered); - - return $request; - } -} diff --git a/src/ElasticSearch/Converter/Request/Aggregation/Aggregation.php b/src/ElasticSearch/Converter/Request/Aggregation/Aggregation.php index 0b54e4bed9697a4bd1a861f7446fe97533e003b3..07b0fd2cbb80da4482d7156044dff8de5c2c6f65 100644 --- a/src/ElasticSearch/Converter/Request/Aggregation/Aggregation.php +++ b/src/ElasticSearch/Converter/Request/Aggregation/Aggregation.php @@ -5,10 +5,8 @@ declare(strict_types=1); namespace IQDEV\ElasticSearch\Converter\Request\Aggregation; use IQDEV\ElasticSearch\Configuration; -use IQDEV\ElasticSearch\Criteria; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection; -use IQDEV\ElasticSearch\Request\Filter\Filter; -use IQDEV\ElasticSearch\Request\Filter\FilterType; +use IQDEV\ElasticSearch\Criteria\Criteria; +use IQDEV\ElasticSearch\Criteria\Filter\FilterType; use IQDEV\ElasticSearch\Search\Aggs\AggsCollection; use IQDEV\ElasticSearch\Search\Aggs\AggsFacetStats; use IQDEV\ElasticSearch\Search\Aggs\AggsFacetTerms; @@ -41,7 +39,7 @@ class Aggregation $postFilterCollection = $this->criteria->getFilters()->getFilterCollectionByType(FilterType::POST); - $filterAggregation = new FilterAggregation($this->configuration, $postFilterCollection->getKeywordFilters()); + $filterAggregation = new FilterAggregation($this->configuration, $postFilterCollection); $filterAggregation->updateRequestAggregation($this->aggregations); $fullAggregation = new FullAggregation($this->configuration, $postFilterCollection); diff --git a/src/ElasticSearch/Converter/Request/Aggregation/FilterAggregation.php b/src/ElasticSearch/Converter/Request/Aggregation/FilterAggregation.php index ed1bf0aafc5a56397d9b06be4f2762fc90cae165..7c3567141a9a69ef7b1d41e85826076657cdde73 100644 --- a/src/ElasticSearch/Converter/Request/Aggregation/FilterAggregation.php +++ b/src/ElasticSearch/Converter/Request/Aggregation/FilterAggregation.php @@ -6,14 +6,12 @@ namespace IQDEV\ElasticSearch\Converter\Request\Aggregation; use IQDEV\ElasticSearch\Configuration; use IQDEV\ElasticSearch\Converter\Request\FilterQuery; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterCollection; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection; -use IQDEV\ElasticSearch\Request\Filter\Filter; -use IQDEV\ElasticSearch\Request\Filter\Value\FilterKeyword; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Filter; use IQDEV\ElasticSearch\Search\Aggs\Aggs; use IQDEV\ElasticSearch\Search\Aggs\AggsCollection; use IQDEV\ElasticSearch\Search\Aggs\AggsFacetTerms; -use IQDEV\ElasticSearch\Search\BoolQuery\Query; use IQDEV\ElasticSearch\Search\Nested; class FilterAggregation diff --git a/src/ElasticSearch/Converter/Request/Aggregation/FullAggregation.php b/src/ElasticSearch/Converter/Request/Aggregation/FullAggregation.php index 1e00192d05807a0bc8af8a6413ec616514bb96c1..91751222cf44fd6db0db96f9e5248339f5b626dd 100644 --- a/src/ElasticSearch/Converter/Request/Aggregation/FullAggregation.php +++ b/src/ElasticSearch/Converter/Request/Aggregation/FullAggregation.php @@ -6,20 +6,15 @@ namespace IQDEV\ElasticSearch\Converter\Request\Aggregation; use IQDEV\ElasticSearch\Configuration; use IQDEV\ElasticSearch\Converter\Request\FilterQuery; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterCollection; use IQDEV\ElasticSearch\Search\Aggs\Aggs; use IQDEV\ElasticSearch\Search\Aggs\AggsCollection; use IQDEV\ElasticSearch\Search\Aggs\AggsFacetStats; use IQDEV\ElasticSearch\Search\Aggs\AggsFacetTerms; -use IQDEV\ElasticSearch\Search\BoolQuery\Query; use IQDEV\ElasticSearch\Search\Nested; class FullAggregation { - private Query $queryKeywordFiltered; - private Query $queryNumberFiltered; - - public function __construct( private readonly Configuration $configuration, private readonly FilterCollection $filterCollection, diff --git a/src/ElasticSearch/Converter/Request/Collection/NestedFilterCollection.php b/src/ElasticSearch/Converter/Request/Collection/NestedFilterCollection.php index 6e779de1b1eeed5c457eff46c689d430c6aef314..8dd31f3c39855d4d0c4056fc71e6f069bb55aa75 100644 --- a/src/ElasticSearch/Converter/Request/Collection/NestedFilterCollection.php +++ b/src/ElasticSearch/Converter/Request/Collection/NestedFilterCollection.php @@ -4,7 +4,7 @@ declare(strict_types=1); namespace IQDEV\ElasticSearch\Converter\Request\Collection; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterCollection; class NestedFilterCollection extends FilterCollection { diff --git a/src/ElasticSearch/Converter/Request/Collection/PropertyFilterCollection.php b/src/ElasticSearch/Converter/Request/Collection/PropertyFilterCollection.php index 48cf2f10b5cf6f68bb64eb471004c32711d062c3..ef3b1c251ee0ebe2f0210247ea27e799d0ebb71e 100644 --- a/src/ElasticSearch/Converter/Request/Collection/PropertyFilterCollection.php +++ b/src/ElasticSearch/Converter/Request/Collection/PropertyFilterCollection.php @@ -4,7 +4,7 @@ declare(strict_types=1); namespace IQDEV\ElasticSearch\Converter\Request\Collection; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterCollection; class PropertyFilterCollection extends FilterCollection { diff --git a/src/ElasticSearch/Converter/Request/CriteriaRequestBuilder.php b/src/ElasticSearch/Converter/Request/CriteriaRequestBuilder.php index 4a6f4338c0839a8cc0c09b152f4f737797bc1c4d..cf4dc66dc1c1a288006604758e76bbfe0ca55fcb 100644 --- a/src/ElasticSearch/Converter/Request/CriteriaRequestBuilder.php +++ b/src/ElasticSearch/Converter/Request/CriteriaRequestBuilder.php @@ -6,14 +6,12 @@ namespace IQDEV\ElasticSearch\Converter\Request; use IQDEV\ElasticSearch\Configuration; use IQDEV\ElasticSearch\Converter\Request\Aggregation\Aggregation; -use IQDEV\ElasticSearch\Criteria; +use IQDEV\ElasticSearch\Criteria\Criteria; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\PostFilterCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\QueryFilterCollection; +use IQDEV\ElasticSearch\Criteria\Search\Search; +use IQDEV\ElasticSearch\Criteria\Search\SearchQuery; use IQDEV\ElasticSearch\Document\Property\PropertyType; -use IQDEV\ElasticSearch\Request\Filter\Collection\PostFilterCollection; -use IQDEV\ElasticSearch\Request\Filter\Collection\QueryFilterCollection; -use IQDEV\ElasticSearch\Request\Search\Search; -use IQDEV\ElasticSearch\Request\Search\SearchQuery; -use IQDEV\ElasticSearch\Search\Aggs\AggsFacetStats; -use IQDEV\ElasticSearch\Search\Aggs\AggsFacetTerms; use IQDEV\ElasticSearch\Search\Pagination; class CriteriaRequestBuilder extends RequestBuilder diff --git a/src/ElasticSearch/Converter/CriteriaToRequest.php b/src/ElasticSearch/Converter/Request/CriteriaToRequest.php similarity index 76% rename from src/ElasticSearch/Converter/CriteriaToRequest.php rename to src/ElasticSearch/Converter/Request/CriteriaToRequest.php index 8efde5b386dc799047b95b9d7bbc1c04eda9d371..a3cdfcd14c2cceb4c79a340366c692195a40c4e3 100644 --- a/src/ElasticSearch/Converter/CriteriaToRequest.php +++ b/src/ElasticSearch/Converter/Request/CriteriaToRequest.php @@ -2,11 +2,10 @@ declare(strict_types=1); -namespace IQDEV\ElasticSearch\Converter; +namespace IQDEV\ElasticSearch\Converter\Request; use IQDEV\ElasticSearch\Configuration; -use IQDEV\ElasticSearch\Converter\Request\CriteriaRequestBuilder; -use IQDEV\ElasticSearch\Criteria; +use IQDEV\ElasticSearch\Criteria\Criteria; use IQDEV\ElasticSearch\Search\Request; final class CriteriaToRequest diff --git a/src/ElasticSearch/Converter/Request/Filter/AbstractFilterQuery.php b/src/ElasticSearch/Converter/Request/Filter/AbstractFilterQuery.php index 87eff1161e6203c76987da8d63636825bfe64b62..4b5d5adfa555b04bebf3a1d14382abba0e0c0761 100644 --- a/src/ElasticSearch/Converter/Request/Filter/AbstractFilterQuery.php +++ b/src/ElasticSearch/Converter/Request/Filter/AbstractFilterQuery.php @@ -5,8 +5,8 @@ declare(strict_types=1); namespace IQDEV\ElasticSearch\Converter\Request\Filter; use IQDEV\ElasticSearch\Esable; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection; -use IQDEV\ElasticSearch\Request\Filter\LogicOperator; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection; +use IQDEV\ElasticSearch\Criteria\Filter\LogicOperator; use IQDEV\ElasticSearch\Search\BoolQuery\Query; use IQDEV\ElasticSearch\Search\Nested; @@ -18,12 +18,12 @@ abstract class AbstractFilterQuery $this->query = new Query(); } - protected function setFilterByLogic(LogicOperator $logicOperator, Esable $filter): void + protected function setFilterByLogic(Query $query, LogicOperator $logicOperator, Esable $filter): void { match ($logicOperator) { - LogicOperator::AND => $this->query->getFilter()->add($filter), - LogicOperator::OR => $this->query->getShould()->add($filter), - LogicOperator::NOT => $this->query->getMustNot()->add($filter), + LogicOperator::AND => $query->getFilter()->add($filter), + LogicOperator::OR => $query->getShould()->add($filter), + LogicOperator::NOT => $query->getMustNot()->add($filter), }; } diff --git a/src/ElasticSearch/Converter/Request/Filter/NestedFilter.php b/src/ElasticSearch/Converter/Request/Filter/NestedFilter.php index d135ac6619c31a35f8d848d7cf7417d32502f4c9..9670b94e441f722718a704e5777139f9fe2d2673 100644 --- a/src/ElasticSearch/Converter/Request/Filter/NestedFilter.php +++ b/src/ElasticSearch/Converter/Request/Filter/NestedFilter.php @@ -6,8 +6,8 @@ namespace IQDEV\ElasticSearch\Converter\Request\Filter; use IQDEV\ElasticSearch\Converter\Request\Filter\Type\KeywordFilterType; use IQDEV\ElasticSearch\Converter\Request\Filter\Type\RangeFilterType; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection; -use IQDEV\ElasticSearch\Request\Filter\Filter; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Filter; use IQDEV\ElasticSearch\Search\BoolQuery\Query; use IQDEV\ElasticSearch\Search\BoolQuery\Terms; use IQDEV\ElasticSearch\Search\Nested; @@ -19,12 +19,14 @@ class NestedFilter extends AbstractFilterQuery public function getQuery(FilterGroupCollection $filterGroupCollection, array $exclude): Nested { + $query = new Query(); + $keywordFiltersGroup = $filterGroupCollection->getKeywordFilters($exclude); foreach ($keywordFiltersGroup as $keywordFilter) { /** @var Filter $keywordFilter */ $esableFilter = new KeywordFilterType($keywordFilter); - $this->setFilterByLogic($filterGroupCollection->getLogicOperator(), $this->getNested($esableFilter, self::NESTED_KEYWORD_PATH)); + $this->setFilterByLogic($query, $filterGroupCollection->getLogicOperator(), $this->getNested($esableFilter, self::NESTED_KEYWORD_PATH)); } $rangeFilterGroup = $filterGroupCollection->getRangeFilters($exclude); @@ -33,12 +35,12 @@ class NestedFilter extends AbstractFilterQuery /** @var FilterGroupCollection $filterGroup */ $esableFilter = new RangeFilterType($filterGroup); - $this->setFilterByLogic($filterGroupCollection->getLogicOperator(), $this->getNested($esableFilter, self::NESTED_RANGE_PATH)); + $this->setFilterByLogic($query, $filterGroupCollection->getLogicOperator(), $this->getNested($esableFilter, self::NESTED_RANGE_PATH)); } return (new Nested()) ->setPath('search_data') - ->setQuery($this->query); + ->setQuery($query); } private function getNested(RangeFilterType|KeywordFilterType $filter, string $path): Nested diff --git a/src/ElasticSearch/Converter/Request/Filter/PropertyFilter.php b/src/ElasticSearch/Converter/Request/Filter/PropertyFilter.php index e78a5c3f8172eca8f1aeb85b4411002bb13828aa..f3afd3e0047be7e02d5b432a473902d124d81816 100644 --- a/src/ElasticSearch/Converter/Request/Filter/PropertyFilter.php +++ b/src/ElasticSearch/Converter/Request/Filter/PropertyFilter.php @@ -6,20 +6,22 @@ namespace IQDEV\ElasticSearch\Converter\Request\Filter; use IQDEV\ElasticSearch\Converter\Request\Filter\Type\KeywordFilterType; use IQDEV\ElasticSearch\Converter\Request\Filter\Type\RangeFilterType; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection; -use IQDEV\ElasticSearch\Request\Filter\Filter; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Filter; use IQDEV\ElasticSearch\Search\BoolQuery\Query; class PropertyFilter extends AbstractFilterQuery { public function getQuery(FilterGroupCollection $filterGroupCollection, array $exclude = []): Query { + $query = new Query(); + $keywordFiltersGroup = $filterGroupCollection->getKeywordFilters($exclude); foreach ($keywordFiltersGroup as $keywordFilter) { /** @var Filter $keywordFilter */ $esableFilter = new KeywordFilterType($keywordFilter); - $this->setFilterByLogic($filterGroupCollection->getLogicOperator(), $esableFilter->getEsable()); + $this->setFilterByLogic($query, $filterGroupCollection->getLogicOperator(), $esableFilter->getEsable()); } $rangeFilterGroup = $filterGroupCollection->getRangeFilters($exclude); @@ -28,9 +30,9 @@ class PropertyFilter extends AbstractFilterQuery /** @var FilterGroupCollection $filterGroup */ $esableFilter = new RangeFilterType($filterGroup); - $this->setFilterByLogic($filterGroupCollection->getLogicOperator(), $esableFilter->getEsable()); + $this->setFilterByLogic($query, $filterGroupCollection->getLogicOperator(), $esableFilter->getEsable()); } - return $this->query; + return $query; } } diff --git a/src/ElasticSearch/Converter/Request/Filter/Type/KeywordFilterType.php b/src/ElasticSearch/Converter/Request/Filter/Type/KeywordFilterType.php index f78e18a35401ca4e2c9fd722b2058ff0823cf10f..28d3ef4fb497431ed812e0805d372e1ec24b8433 100644 --- a/src/ElasticSearch/Converter/Request/Filter/Type/KeywordFilterType.php +++ b/src/ElasticSearch/Converter/Request/Filter/Type/KeywordFilterType.php @@ -5,7 +5,7 @@ declare(strict_types=1); namespace IQDEV\ElasticSearch\Converter\Request\Filter\Type; use IQDEV\ElasticSearch\Esable; -use IQDEV\ElasticSearch\Request\Filter\Filter; +use IQDEV\ElasticSearch\Criteria\Filter\Filter; use IQDEV\ElasticSearch\Search\BoolQuery\Terms; class KeywordFilterType extends AbstractFilterType diff --git a/src/ElasticSearch/Converter/Request/Filter/Type/RangeFilterType.php b/src/ElasticSearch/Converter/Request/Filter/Type/RangeFilterType.php index fcf6a2a6fb4d0b686d89599ad1d194004b2b05d4..2d303710ef415379c649c84d354c1917b68d9af9 100644 --- a/src/ElasticSearch/Converter/Request/Filter/Type/RangeFilterType.php +++ b/src/ElasticSearch/Converter/Request/Filter/Type/RangeFilterType.php @@ -5,9 +5,9 @@ declare(strict_types=1); namespace IQDEV\ElasticSearch\Converter\Request\Filter\Type; use IQDEV\ElasticSearch\Esable; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterCollection; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection; -use IQDEV\ElasticSearch\Request\Filter\Filter; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Filter; use IQDEV\ElasticSearch\Search\BoolQuery\Stats; class RangeFilterType extends AbstractFilterType diff --git a/src/ElasticSearch/Converter/Request/FilterQuery.php b/src/ElasticSearch/Converter/Request/FilterQuery.php index 0e715d3226273af5e8e89f684ced7aa50af780cb..6d70b64cbb1ea023b2c2ef54290c82f2a72678d6 100644 --- a/src/ElasticSearch/Converter/Request/FilterQuery.php +++ b/src/ElasticSearch/Converter/Request/FilterQuery.php @@ -11,9 +11,9 @@ use IQDEV\ElasticSearch\Converter\Request\Collection\PropertyFilterCollection; use IQDEV\ElasticSearch\Converter\Request\Filter\AbstractFilterQuery; use IQDEV\ElasticSearch\Converter\Request\Filter\NestedFilter; use IQDEV\ElasticSearch\Converter\Request\Filter\PropertyFilter; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterCollection; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection; -use IQDEV\ElasticSearch\Request\Filter\Filter; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Filter; use IQDEV\ElasticSearch\Search\BoolQuery\Query; use IQDEV\ElasticSearch\Search\Nested; @@ -34,8 +34,13 @@ class FilterQuery { [$propertyFilterCollection, $nestedFilterCollection] = $this->separatePropertyTypes($this->filterCollection); - $this->fillQuery($propertyFilterCollection, new PropertyFilter()); - $this->fillQuery($nestedFilterCollection, new NestedFilter()); + if (false === $propertyFilterCollection->isEmpty()) { + $this->fillQuery($propertyFilterCollection, new PropertyFilter()); + } + + if (false === $nestedFilterCollection->isEmpty()) { + $this->fillQuery($nestedFilterCollection, new NestedFilter()); + } } private function fillQuery(FilterCollection $filterCollection, AbstractFilterQuery $filterQuery): void diff --git a/src/ElasticSearch/Converter/EsResponseToResult.php b/src/ElasticSearch/Converter/Result/EsResponseToResult.php similarity index 99% rename from src/ElasticSearch/Converter/EsResponseToResult.php rename to src/ElasticSearch/Converter/Result/EsResponseToResult.php index 2b06234c95e885d6cb3196ca1b8bb3ec4f461504..4666a1a7a69728087e142be2812ffd42373dd7e3 100644 --- a/src/ElasticSearch/Converter/EsResponseToResult.php +++ b/src/ElasticSearch/Converter/Result/EsResponseToResult.php @@ -1,11 +1,11 @@ $this->configuration->getIndexName(), 'body' => [ - 'mappings' => $this->configuration->getMapping()->es(), + 'mappings' => $this->configuration->getMapping(), 'settings' => $this->configuration->getSettings(), ], ] @@ -99,7 +99,7 @@ final class EsHelperEndpoint 'Accept' => 'application/json', 'Content-Type' => 'application/json', ], - $this->configuration->getMapping()->es(), + $this->configuration->getMapping(), ) ); diff --git a/src/ElasticSearch/Mapping.php b/src/ElasticSearch/Mapping.php deleted file mode 100644 index ba1ab6e1658a48a3c3c640d6168642834762ca78..0000000000000000000000000000000000000000 --- a/src/ElasticSearch/Mapping.php +++ /dev/null @@ -1,53 +0,0 @@ - 'nested', - 'properties' => [ - 'keyword_facet' => [ - 'type' => 'nested', - 'properties' => [ - 'facet_code' => [ - 'type' => 'keyword', - 'index' => true - ], - 'facet_value' => [ - 'type' => 'keyword', - 'index' => true - ] - ] - ], - 'number_facet' => [ - 'type' => 'nested', - 'properties' => [ - 'facet_code' => [ - 'type' => 'keyword', - 'index' => true - ], - 'facet_value' => [ - 'type' => 'double' - ] - ] - ] - ] - ]; - } - - public function es(): array - { - return [ - 'properties' => array_merge( - $this->getPropertiesMap(), - ['search_data' => $this->getSearchDataMap()], - ) - ]; - } -} diff --git a/src/ElasticSearch/Search/BoolQuery/FilterNumberFacet.php b/src/ElasticSearch/Search/BoolQuery/FilterNumberFacet.php index f87777225cb5e3e53bd92943a56afd8ca2f3c6d1..3a2ab3aee1608a152fd3bd3837b617e4ad2822e0 100644 --- a/src/ElasticSearch/Search/BoolQuery/FilterNumberFacet.php +++ b/src/ElasticSearch/Search/BoolQuery/FilterNumberFacet.php @@ -3,7 +3,7 @@ namespace IQDEV\ElasticSearch\Search\BoolQuery; use IQDEV\ElasticSearch\Esable; -use IQDEV\ElasticSearch\Request\Filter\FilterOperator; +use IQDEV\ElasticSearch\Criteria\Filter\FilterOperator; use IQDEV\ElasticSearch\Search\Nested; final class FilterNumberFacet implements Esable diff --git a/src/ElasticSearch/Search/Request.php b/src/ElasticSearch/Search/Request.php index 88f41f18c66ab2bf4cddf0d6be4957b3de59d18d..14e7596c6c2004b564e6d3d930b1b5a36ae48ba3 100644 --- a/src/ElasticSearch/Search/Request.php +++ b/src/ElasticSearch/Search/Request.php @@ -3,8 +3,8 @@ namespace IQDEV\ElasticSearch\Search; use IQDEV\ElasticSearch\Esable; -use IQDEV\ElasticSearch\Request\Match\QueryMatchCollection; -use IQDEV\ElasticSearch\Request\Order\OrderCollection; +use IQDEV\ElasticSearch\Criteria\Match\QueryMatchCollection; +use IQDEV\ElasticSearch\Criteria\Order\OrderCollection; use IQDEV\ElasticSearch\Search\Aggs\AggsCollection; use IQDEV\ElasticSearch\Search\BoolQuery\Query; diff --git a/src/ElasticSearch/SearchService.php b/src/ElasticSearch/SearchService.php index bac451786d711e026c291742b3a0d9a7aab6d777..356eb067c7ead5444cc7769188ee7fef0c742b4b 100644 --- a/src/ElasticSearch/SearchService.php +++ b/src/ElasticSearch/SearchService.php @@ -5,19 +5,20 @@ namespace IQDEV\ElasticSearch; use Elastic\Elasticsearch\Client; use Elastic\Elasticsearch\Exception\ClientResponseException; use Elastic\Elasticsearch\Exception\ServerResponseException; -use IQDEV\ElasticSearch\Converter\CriteriaToRequest; -use IQDEV\ElasticSearch\Converter\EsResponseToResult; +use IQDEV\ElasticSearch\Converter\Request\CriteriaToRequest; +use IQDEV\ElasticSearch\Converter\Result\EsResponseToResult; +use IQDEV\ElasticSearch\Criteria\Criteria; class SearchService implements Searchable { - private CriteriaToRequest $criteriaToEsRequest; + private CriteriaToRequest $criteriaToRequest; private EsResponseToResult $esResponseToResult; public function __construct( private Client $esClient, private Configuration $configuration ) { - $this->criteriaToEsRequest = new CriteriaToRequest($this->configuration); + $this->criteriaToRequest = new CriteriaToRequest($this->configuration); $this->esResponseToResult = new EsResponseToResult(); } @@ -27,11 +28,8 @@ class SearchService implements Searchable */ public function search(Criteria $criteria): Result { - $request = $this->criteriaToEsRequest->fromCriteria($criteria); + $request = $this->criteriaToRequest->fromCriteria($criteria); - if (isset($GLOBALS['DD']) && $GLOBALS['DD'] === true) { - dd(json_encode($request->es())); - } $response = $this->esClient->search([ 'index' => $this->configuration->getIndexName(), 'body' => $request->es(), diff --git a/src/ElasticSearch/Searchable.php b/src/ElasticSearch/Searchable.php index b47bed57fb7ea2d03d0ebdcd442c6e61b0ba2a1a..f88a798f0e33ee7b69f532ff4f30bada6603df3e 100644 --- a/src/ElasticSearch/Searchable.php +++ b/src/ElasticSearch/Searchable.php @@ -2,6 +2,8 @@ namespace IQDEV\ElasticSearch; +use IQDEV\ElasticSearch\Criteria\Criteria; + interface Searchable { /** diff --git a/tests/Filter/AggsTest.php b/tests/Filter/AggsTest.php index 1d8a4f3886fd3d7e1b51969a91d23168d6892454..178bae1317df52af7582892231dc003ebd9d9bc8 100644 --- a/tests/Filter/AggsTest.php +++ b/tests/Filter/AggsTest.php @@ -2,17 +2,17 @@ namespace IQDEV\ElasticSearchTests\Filter; -use IQDEV\ElasticSearch\Criteria; +use IQDEV\ElasticSearch\Criteria\Criteria; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Field; +use IQDEV\ElasticSearch\Criteria\Filter\Filter; +use IQDEV\ElasticSearch\Criteria\Filter\FilterOperator; +use IQDEV\ElasticSearch\Criteria\Filter\LogicOperator; +use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterKeyword; +use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterNumber; +use IQDEV\ElasticSearch\Criteria\Query\SearchQuery; +use IQDEV\ElasticSearch\Criteria\Search\Search; use IQDEV\ElasticSearch\Document\Property\Property; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection; -use IQDEV\ElasticSearch\Request\Filter\Field; -use IQDEV\ElasticSearch\Request\Filter\Filter; -use IQDEV\ElasticSearch\Request\Filter\FilterOperator; -use IQDEV\ElasticSearch\Request\Filter\LogicOperator; -use IQDEV\ElasticSearch\Request\Filter\Value\FilterKeyword; -use IQDEV\ElasticSearch\Request\Filter\Value\FilterNumber; -use IQDEV\ElasticSearch\Request\Query\SearchQuery; -use IQDEV\ElasticSearch\Request\Search\Search; use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Service\SearchClient; diff --git a/tests/Filter/CommonRangeKeywordsTest.php b/tests/Filter/CommonRangeKeywordsTest.php index 035dc784e0b1f6cdb826f47d834ede123089960f..681dd4100c5015ae4af5dbe3b78154c33686e5d9 100644 --- a/tests/Filter/CommonRangeKeywordsTest.php +++ b/tests/Filter/CommonRangeKeywordsTest.php @@ -2,14 +2,14 @@ namespace IQDEV\ElasticSearchTests\Filter; -use IQDEV\ElasticSearch\Criteria; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection; -use IQDEV\ElasticSearch\Request\Filter\Field; -use IQDEV\ElasticSearch\Request\Filter\Filter; -use IQDEV\ElasticSearch\Request\Filter\FilterOperator; -use IQDEV\ElasticSearch\Request\Filter\Value\FilterKeyword; -use IQDEV\ElasticSearch\Request\Filter\Value\FilterNumber; -use IQDEV\ElasticSearch\Request\Query\SearchQuery; +use IQDEV\ElasticSearch\Criteria\Criteria; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Field; +use IQDEV\ElasticSearch\Criteria\Filter\Filter; +use IQDEV\ElasticSearch\Criteria\Filter\FilterOperator; +use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterKeyword; +use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterNumber; +use IQDEV\ElasticSearch\Criteria\Query\SearchQuery; use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Service\SearchClient; diff --git a/tests/Filter/IndexesTest.php b/tests/Filter/IndexesTest.php index 925a071d0fdd96fd86d233c4cbb2d5dae14cba36..9745f9e7d9dfc2d5de64fede77183f624d449705 100644 --- a/tests/Filter/IndexesTest.php +++ b/tests/Filter/IndexesTest.php @@ -3,9 +3,8 @@ namespace IQDEV\ElasticSearchTests\Filter; use Elastic\Elasticsearch\Client; -use IQDEV\ElasticSearch\Config\Mapping\ProductMapping; use IQDEV\ElasticSearch\Configuration; -use IQDEV\ElasticSearch\Converter\EsResponseToResult; +use IQDEV\ElasticSearch\Converter\Result\EsResponseToResult; use IQDEV\ElasticSearch\Indexer\IndexRunner; use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\Config\ChangingStateConfiguration; @@ -35,7 +34,7 @@ class IndexesTest extends AbstractTestCase { parent::__construct($name, $data, $dataName); - $this->configuration = new ChangingStateConfiguration(new ProductMapping()); + $this->configuration = new ChangingStateConfiguration(); $this->esClient = ClientFactory::create(); $this->indexRunner = new IndexRunner( diff --git a/tests/Filter/KeywordsTest.php b/tests/Filter/KeywordsTest.php index ff61436121c7f1abe58bb118b5f337eb70155391..3f6064b43cb9b30918b1c9c1c675cd51f976ecb3 100644 --- a/tests/Filter/KeywordsTest.php +++ b/tests/Filter/KeywordsTest.php @@ -2,15 +2,15 @@ namespace IQDEV\ElasticSearchTests\Filter; -use IQDEV\ElasticSearch\Criteria; +use IQDEV\ElasticSearch\Criteria\Criteria; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Field; +use IQDEV\ElasticSearch\Criteria\Filter\Filter; +use IQDEV\ElasticSearch\Criteria\Filter\FilterOperator; +use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterKeyword; +use IQDEV\ElasticSearch\Criteria\Query\SearchQuery; +use IQDEV\ElasticSearch\Criteria\Search\Search; use IQDEV\ElasticSearch\Document\Property\Property; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection; -use IQDEV\ElasticSearch\Request\Filter\Field; -use IQDEV\ElasticSearch\Request\Filter\Filter; -use IQDEV\ElasticSearch\Request\Filter\FilterOperator; -use IQDEV\ElasticSearch\Request\Filter\Value\FilterKeyword; -use IQDEV\ElasticSearch\Request\Query\SearchQuery; -use IQDEV\ElasticSearch\Request\Search\Search; use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Service\SearchClient; diff --git a/tests/Filter/QueryAndPostFilterTest.php b/tests/Filter/QueryAndPostFilterTest.php index c2f72f9de54da158f6e019c39666bddf4ffead7a..8ad528d3dc15745785881c553b2a537ea4454f6c 100644 --- a/tests/Filter/QueryAndPostFilterTest.php +++ b/tests/Filter/QueryAndPostFilterTest.php @@ -2,16 +2,16 @@ namespace IQDEV\ElasticSearchTests\Filter; -use IQDEV\ElasticSearch\Criteria; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection; -use IQDEV\ElasticSearch\Request\Filter\Field; -use IQDEV\ElasticSearch\Request\Filter\Filter; -use IQDEV\ElasticSearch\Request\Filter\FilterOperator; -use IQDEV\ElasticSearch\Request\Filter\FilterType; -use IQDEV\ElasticSearch\Request\Filter\LogicOperator; -use IQDEV\ElasticSearch\Request\Filter\Value\FilterKeyword; -use IQDEV\ElasticSearch\Request\Filter\Value\FilterNumber; -use IQDEV\ElasticSearch\Request\Query\SearchQuery; +use IQDEV\ElasticSearch\Criteria\Criteria; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Field; +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 IQDEV\ElasticSearch\Criteria\Filter\Value\FilterKeyword; +use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterNumber; +use IQDEV\ElasticSearch\Criteria\Query\SearchQuery; use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Service\SearchClient; diff --git a/tests/Filter/QueryTest.php b/tests/Filter/QueryTest.php index ca4d22902a597095975fec3a6534adb97a95641d..9c903aa7bd8aa0127d68b64d40403cb1e3da70fa 100644 --- a/tests/Filter/QueryTest.php +++ b/tests/Filter/QueryTest.php @@ -3,20 +3,18 @@ namespace IQDEV\ElasticSearchTests\Filter; use IQDEV\ElasticSearch\Config\BaseConfiguration; -use IQDEV\ElasticSearch\Config\Mapping\ProductMapping; -use IQDEV\ElasticSearch\Converter\CriteriaToEsRequest; -use IQDEV\ElasticSearch\Converter\CriteriaToRequest; -use IQDEV\ElasticSearch\Criteria; +use IQDEV\ElasticSearch\Converter\Request\CriteriaToRequest; +use IQDEV\ElasticSearch\Criteria\Criteria; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Field; +use IQDEV\ElasticSearch\Criteria\Filter\Filter; +use IQDEV\ElasticSearch\Criteria\Filter\FilterOperator; +use IQDEV\ElasticSearch\Criteria\Filter\FilterType; +use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterKeyword; +use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterNumber; +use IQDEV\ElasticSearch\Criteria\Query\SearchQuery; +use IQDEV\ElasticSearch\Criteria\Search\Search; use IQDEV\ElasticSearch\Document\Property\Property; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection; -use IQDEV\ElasticSearch\Request\Filter\Field; -use IQDEV\ElasticSearch\Request\Filter\Filter; -use IQDEV\ElasticSearch\Request\Filter\FilterOperator; -use IQDEV\ElasticSearch\Request\Filter\FilterType; -use IQDEV\ElasticSearch\Request\Filter\Value\FilterKeyword; -use IQDEV\ElasticSearch\Request\Filter\Value\FilterNumber; -use IQDEV\ElasticSearch\Request\Query\SearchQuery; -use IQDEV\ElasticSearch\Request\Search\Search; use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Service\SearchClient; @@ -97,9 +95,9 @@ class QueryTest extends AbstractTestCase // Получение классов с данными для запроса в es - $criteriaToEsRequest = new CriteriaToRequest(new BaseConfiguration(new ProductMapping())); - $requestPost = $criteriaToEsRequest->fromCriteria($criteriaPost); - $requestQuery = $criteriaToEsRequest->fromCriteria($criteriaQuery); + $criteriaToRequest = new CriteriaToRequest(new BaseConfiguration()); + $requestPost = $criteriaToRequest->fromCriteria($criteriaPost); + $requestQuery = $criteriaToRequest->fromCriteria($criteriaQuery); $expectedFilter = [ [ @@ -110,18 +108,21 @@ class QueryTest extends AbstractTestCase "filter" => [ [ "nested" => [ - "path" => "search_data.keyword_facet", + "path" => "search_data.number_facet", "query" => [ "bool" => [ "filter" => [ [ "term" => [ - "search_data.keyword_facet.facet_code" => $filter['brand']['key'] + "search_data.number_facet.facet_code" => $filter['price']['key'] ] ], [ - "term" => [ - "search_data.keyword_facet.facet_value" => $filter['brand']['value'] + "range" => [ + "search_data.number_facet.facet_value" => [ + "lt" => $filter['price']['min'], + "gt" => $filter['price']['max'], + ] ] ] ] @@ -142,21 +143,18 @@ class QueryTest extends AbstractTestCase "filter" => [ [ "nested" => [ - "path" => "search_data.number_facet", + "path" => "search_data.keyword_facet", "query" => [ "bool" => [ "filter" => [ [ "term" => [ - "search_data.number_facet.facet_code" => $filter['price']['key'] + "search_data.keyword_facet.facet_code" => $filter['brand']['key'] ] ], [ - "range" => [ - "search_data.number_facet.facet_value" => [ - "lt" => $filter['price']['min'], - "gt" => $filter['price']['max'], - ] + "term" => [ + "search_data.keyword_facet.facet_value" => $filter['brand']['value'] ] ] ] @@ -168,7 +166,7 @@ class QueryTest extends AbstractTestCase ] ] ] - ] + ], ]; $expected = [ "query" => [ @@ -184,7 +182,6 @@ class QueryTest extends AbstractTestCase ], ]; - $this->assertArray( array_merge($expected, [ "query" => [ @@ -251,8 +248,8 @@ class QueryTest extends AbstractTestCase $criteria->getFilters()->add($filterCollectionQueryPrice); - $criteriaToEsRequest = new CriteriaToRequest(new BaseConfiguration(new ProductMapping())); - $request = $criteriaToEsRequest->fromCriteria($criteria); + $criteriaToRequest = new CriteriaToRequest(new BaseConfiguration()); + $request = $criteriaToRequest->fromCriteria($criteria); $expected = [ diff --git a/tests/Filter/RangeTest.php b/tests/Filter/RangeTest.php index 9b7c711f3c97de8b649dc98b507e5512313b9c21..3d8f0afb68698a28398907b6c3d376b029d77059 100644 --- a/tests/Filter/RangeTest.php +++ b/tests/Filter/RangeTest.php @@ -2,13 +2,13 @@ namespace IQDEV\ElasticSearchTests\Filter; -use IQDEV\ElasticSearch\Criteria; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection; -use IQDEV\ElasticSearch\Request\Filter\Field; -use IQDEV\ElasticSearch\Request\Filter\Filter; -use IQDEV\ElasticSearch\Request\Filter\FilterOperator; -use IQDEV\ElasticSearch\Request\Filter\Value\FilterNumber; -use IQDEV\ElasticSearch\Request\Query\SearchQuery; +use IQDEV\ElasticSearch\Criteria\Criteria; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Field; +use IQDEV\ElasticSearch\Criteria\Filter\Filter; +use IQDEV\ElasticSearch\Criteria\Filter\FilterOperator; +use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterNumber; +use IQDEV\ElasticSearch\Criteria\Query\SearchQuery; use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Service\SearchClient; diff --git a/tests/Filter/SearchItemsTest.php b/tests/Filter/SearchItemsTest.php index 597c27d1fde62729dd454f422e76ef16d767e7a5..2b20a542a47e968ab9f60418fed24d74a48b9347 100644 --- a/tests/Filter/SearchItemsTest.php +++ b/tests/Filter/SearchItemsTest.php @@ -2,11 +2,11 @@ namespace IQDEV\ElasticSearchTests\Filter; -use IQDEV\ElasticSearch\Criteria; +use IQDEV\ElasticSearch\Criteria\Criteria; +use IQDEV\ElasticSearch\Criteria\Query\SearchQuery; +use IQDEV\ElasticSearch\Criteria\Search\Search; use IQDEV\ElasticSearch\Document\Property\Property; use IQDEV\ElasticSearch\Document\Property\PropertyType; -use IQDEV\ElasticSearch\Request\Query\SearchQuery; -use IQDEV\ElasticSearch\Request\Search\Search; use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Service\SearchClient; diff --git a/tests/Filter/SortTest.php b/tests/Filter/SortTest.php index 24d3359e30e4bf2ab3ebb1c7089be357b3057216..653f7ba7ac4741ce2259e565c4c7bc31ffa2f1af 100644 --- a/tests/Filter/SortTest.php +++ b/tests/Filter/SortTest.php @@ -2,12 +2,12 @@ namespace IQDEV\ElasticSearchTests\Filter; -use IQDEV\ElasticSearch\Criteria; +use IQDEV\ElasticSearch\Criteria\Criteria; +use IQDEV\ElasticSearch\Criteria\Order\OrderDirection; +use IQDEV\ElasticSearch\Criteria\Order\OrderFactory; +use IQDEV\ElasticSearch\Criteria\Query\SearchQuery; use IQDEV\ElasticSearch\Document\Property\Property; use IQDEV\ElasticSearch\Document\Property\PropertyType; -use IQDEV\ElasticSearch\Request\Order\OrderDirection; -use IQDEV\ElasticSearch\Request\Order\OrderFactory; -use IQDEV\ElasticSearch\Request\Query\SearchQuery; use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Service\SearchClient; diff --git a/tests/Filter/UpdatedSearchTest.php b/tests/Filter/UpdatedSearchTest.php index 6e42b1aba4fef9fc80be4c15185059241c0bde3e..d3a1ccb07b7eb728b8848e5951a54dc2153ba303 100644 --- a/tests/Filter/UpdatedSearchTest.php +++ b/tests/Filter/UpdatedSearchTest.php @@ -4,16 +4,16 @@ declare(strict_types=1); namespace IQDEV\ElasticSearchTests\Filter; -use IQDEV\ElasticSearch\Criteria; +use IQDEV\ElasticSearch\Criteria\Criteria; +use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection; +use IQDEV\ElasticSearch\Criteria\Filter\Field; +use IQDEV\ElasticSearch\Criteria\Filter\Filter; +use IQDEV\ElasticSearch\Criteria\Filter\FilterOperator; +use IQDEV\ElasticSearch\Criteria\Filter\LogicOperator; +use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterKeyword; +use IQDEV\ElasticSearch\Criteria\Query\SearchQuery; +use IQDEV\ElasticSearch\Criteria\Search\Search; use IQDEV\ElasticSearch\Document\Property\Property; -use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection; -use IQDEV\ElasticSearch\Request\Filter\Field; -use IQDEV\ElasticSearch\Request\Filter\Filter; -use IQDEV\ElasticSearch\Request\Filter\FilterOperator; -use IQDEV\ElasticSearch\Request\Filter\LogicOperator; -use IQDEV\ElasticSearch\Request\Filter\Value\FilterKeyword; -use IQDEV\ElasticSearch\Request\Query\SearchQuery; -use IQDEV\ElasticSearch\Request\Search\Search; use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Service\SearchClient; @@ -226,4 +226,71 @@ class UpdatedSearchTest extends AbstractTestCase $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result)); } + + public function testMustNotNestedFilter(): void + { + $criteria = new Criteria(); + $group = new FilterGroupCollection([ + new Filter( + new Field('brand'), + FilterOperator::EQ, + new FilterKeyword('adidas'), + ) + ]); + $group->setLogicOperator(LogicOperator::NOT); + + $criteria->getFilters()->add($group); + + $q = new SearchQuery($criteria); + + $handler = SearchClient::getInstance(); + $result = $handler->handle($q)->result; + + $expected = [ + 'hits' => [ + 's3', + 's4', + 'h1', + 'h2', + 'h3', + 'p1', + ] + ]; + + $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result)); + } + + public function testMustNotPropertyFilter(): void + { + $criteria = new Criteria(); + $group = new FilterGroupCollection([ + new Filter( + new Field('category_id'), + FilterOperator::EQ, + new FilterKeyword('prices'), + ) + ]); + $group->setLogicOperator(LogicOperator::NOT); + + $criteria->getFilters()->add($group); + + $q = new SearchQuery($criteria); + + $handler = SearchClient::getInstance(); + $result = $handler->handle($q)->result; + + $expected = [ + 'hits' => [ + 's1', + 's2', + 's3', + 's4', + 'h1', + 'h2', + 'h3', + ] + ]; + + $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result)); + } } diff --git a/tests/Seed/DefaultSeed.php b/tests/Seed/DefaultSeed.php index d1a200b3c96d92baf83c795b3435dfe23877600e..cb867ed06fcf7152e82811d8cb4220c8f8e8d7b0 100644 --- a/tests/Seed/DefaultSeed.php +++ b/tests/Seed/DefaultSeed.php @@ -3,7 +3,6 @@ namespace IQDEV\ElasticSearchTests\Seed; use IQDEV\ElasticSearch\Config\BaseConfiguration; -use IQDEV\ElasticSearch\Config\Mapping\ProductMapping; use IQDEV\ElasticSearch\Configuration; use IQDEV\ElasticSearch\Indexer\IndexRunner; use IQDEV\ElasticSearchTests\Factory\ClientFactory; @@ -18,7 +17,7 @@ class DefaultSeed public function __construct() { - $this->configuration = new BaseConfiguration(new ProductMapping()); + $this->configuration = new BaseConfiguration(); $this->indexRunner = new IndexRunner( ClientFactory::create(), diff --git a/tests/Service/SearchClient.php b/tests/Service/SearchClient.php index 3bcfbc9d8e091a3ff46b35edccb7c93423dab176..adfdde92ad7f22a85bb7814b4fd49d47dd9caa61 100644 --- a/tests/Service/SearchClient.php +++ b/tests/Service/SearchClient.php @@ -3,8 +3,7 @@ namespace IQDEV\ElasticSearchTests\Service; use IQDEV\ElasticSearch\Config\BaseConfiguration as Configuration; -use IQDEV\ElasticSearch\Config\Mapping\ProductMapping; -use IQDEV\ElasticSearch\Request\Query\SearchQueryHandler; +use IQDEV\ElasticSearch\Criteria\Query\SearchQueryHandler; use IQDEV\ElasticSearch\SearchService; use IQDEV\ElasticSearchTests\Factory\ClientFactory; @@ -20,7 +19,7 @@ class SearchClient static::$oInstance = new SearchQueryHandler( new SearchService( ClientFactory::create(), - new Configuration(new ProductMapping()), + new Configuration(), ) ); }