From a923e25984c4b63a218760cee12c0653620d1ef0 Mon Sep 17 00:00:00 2001 From: Nikita Chernykh Date: Tue, 10 Oct 2023 14:36:45 +0500 Subject: [PATCH] global refactor --- .../Config/BaseConfiguration.php | 10 +- .../Config/Mapping/ProductMapping.php | 41 -- src/ElasticSearch/Config/MappingValidator.php | 2 +- src/ElasticSearch/Configuration.php | 2 +- .../Converter/CriteriaToEsRequest.php | 487 ------------------ .../Request/Aggregation/Aggregation.php | 8 +- .../Request/Aggregation/FilterAggregation.php | 8 +- .../Request/Aggregation/FullAggregation.php | 7 +- .../Collection/NestedFilterCollection.php | 2 +- .../Collection/PropertyFilterCollection.php | 2 +- .../Request/CriteriaRequestBuilder.php | 12 +- .../{ => Request}/CriteriaToRequest.php | 5 +- .../Request/Filter/AbstractFilterQuery.php | 12 +- .../Converter/Request/Filter/NestedFilter.php | 12 +- .../Request/Filter/PropertyFilter.php | 12 +- .../Request/Filter/Type/KeywordFilterType.php | 2 +- .../Request/Filter/Type/RangeFilterType.php | 6 +- .../Converter/Request/FilterQuery.php | 15 +- .../{ => Result}/EsResponseToResult.php | 4 +- src/ElasticSearch/{ => Criteria}/Criteria.php | 8 +- .../Filter/Collection/FilterCollection.php | 10 +- .../Collection/FilterGroupCollection.php | 10 +- .../Collection/PostFilterCollection.php | 2 +- .../Collection/QueryFilterCollection.php | 2 +- .../{Request => Criteria}/Filter/Field.php | 2 +- .../{Request => Criteria}/Filter/Filter.php | 2 +- .../Filter/FilterOperator.php | 2 +- .../Filter/FilterType.php | 2 +- .../Filter/FilterValue.php | 2 +- .../Filter/LogicOperator.php | 2 +- .../Filter/Value/FilterKeyword.php | 4 +- .../Filter/Value/FilterNumber.php | 4 +- .../Match/QueryMatch.php | 2 +- .../Match/QueryMatchCollection.php | 2 +- .../{Request => Criteria}/Order/Order.php | 2 +- .../Order/OrderCollection.php | 2 +- .../Order/OrderDirection.php | 2 +- .../Order/OrderFactory.php | 8 +- .../Order/Type/BaseOrder.php | 4 +- .../Order/Type/KeywordPropertyOrder.php | 4 +- .../Order/Type/NumberPropertyOrder.php | 4 +- .../{ => Criteria}/Pagination.php | 2 +- .../Query/SearchQuery.php | 4 +- .../Query/SearchQueryHandler.php | 2 +- .../Query/SearchQueryResponse.php | 2 +- .../{Request => Criteria}/Search/Search.php | 2 +- .../Search/SearchCollection.php | 2 +- .../Search/SearchQuery.php | 4 +- .../Indexer/EsHelperEndpoint.php | 4 +- src/ElasticSearch/Mapping.php | 53 -- .../Search/BoolQuery/FilterNumberFacet.php | 2 +- src/ElasticSearch/Search/Request.php | 4 +- src/ElasticSearch/SearchService.php | 14 +- src/ElasticSearch/Searchable.php | 2 + tests/Filter/AggsTest.php | 20 +- tests/Filter/CommonRangeKeywordsTest.php | 16 +- tests/Filter/IndexesTest.php | 5 +- tests/Filter/KeywordsTest.php | 16 +- tests/Filter/QueryAndPostFilterTest.php | 20 +- tests/Filter/QueryTest.php | 59 +-- tests/Filter/RangeTest.php | 14 +- tests/Filter/SearchItemsTest.php | 6 +- tests/Filter/SortTest.php | 8 +- tests/Filter/UpdatedSearchTest.php | 85 ++- tests/Seed/DefaultSeed.php | 3 +- tests/Service/SearchClient.php | 5 +- 66 files changed, 278 insertions(+), 807 deletions(-) delete mode 100644 src/ElasticSearch/Config/Mapping/ProductMapping.php delete mode 100644 src/ElasticSearch/Converter/CriteriaToEsRequest.php rename src/ElasticSearch/Converter/{ => Request}/CriteriaToRequest.php (76%) rename src/ElasticSearch/Converter/{ => Result}/EsResponseToResult.php (99%) rename src/ElasticSearch/{ => Criteria}/Criteria.php (82%) rename src/ElasticSearch/{Request => Criteria}/Filter/Collection/FilterCollection.php (94%) rename src/ElasticSearch/{Request => Criteria}/Filter/Collection/FilterGroupCollection.php (91%) rename src/ElasticSearch/{Request => Criteria}/Filter/Collection/PostFilterCollection.php (52%) rename src/ElasticSearch/{Request => Criteria}/Filter/Collection/QueryFilterCollection.php (52%) rename src/ElasticSearch/{Request => Criteria}/Filter/Field.php (79%) rename src/ElasticSearch/{Request => Criteria}/Filter/Filter.php (90%) rename src/ElasticSearch/{Request => Criteria}/Filter/FilterOperator.php (83%) rename src/ElasticSearch/{Request => Criteria}/Filter/FilterType.php (55%) rename src/ElasticSearch/{Request => Criteria}/Filter/FilterValue.php (57%) rename src/ElasticSearch/{Request => Criteria}/Filter/LogicOperator.php (68%) rename src/ElasticSearch/{Request => Criteria}/Filter/Value/FilterKeyword.php (75%) rename src/ElasticSearch/{Request => Criteria}/Filter/Value/FilterNumber.php (70%) rename src/ElasticSearch/{Request => Criteria}/Match/QueryMatch.php (89%) rename src/ElasticSearch/{Request => Criteria}/Match/QueryMatchCollection.php (92%) rename src/ElasticSearch/{Request => Criteria}/Order/Order.php (92%) rename src/ElasticSearch/{Request => Criteria}/Order/OrderCollection.php (90%) rename src/ElasticSearch/{Request => Criteria}/Order/OrderDirection.php (65%) rename src/ElasticSearch/{Request => Criteria}/Order/OrderFactory.php (70%) rename src/ElasticSearch/{Request => Criteria}/Order/Type/BaseOrder.php (70%) rename src/ElasticSearch/{Request => Criteria}/Order/Type/KeywordPropertyOrder.php (88%) rename src/ElasticSearch/{Request => Criteria}/Order/Type/NumberPropertyOrder.php (88%) rename src/ElasticSearch/{ => Criteria}/Pagination.php (78%) rename src/ElasticSearch/{Request => Criteria}/Query/SearchQuery.php (57%) rename src/ElasticSearch/{Request => Criteria}/Query/SearchQueryHandler.php (88%) rename src/ElasticSearch/{Request => Criteria}/Query/SearchQueryResponse.php (77%) rename src/ElasticSearch/{Request => Criteria}/Search/Search.php (89%) rename src/ElasticSearch/{Request => Criteria}/Search/SearchCollection.php (82%) rename src/ElasticSearch/{Request => Criteria}/Search/SearchQuery.php (93%) delete mode 100644 src/ElasticSearch/Mapping.php diff --git a/src/ElasticSearch/Config/BaseConfiguration.php b/src/ElasticSearch/Config/BaseConfiguration.php index 421dc12..73e561c 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 01e5d28..0000000 --- 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 81faf5e..e8d6b30 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 0baecb9..da7c7d2 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 333babf..0000000 --- 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 0b54e4b..07b0fd2 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 ed1bf0a..7c35671 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 1e00192..9175122 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 6e779de..8dd31f3 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 48cf2f1..ef3b1c2 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 4a6f433..cf4dc66 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 8efde5b..a3cdfcd 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 87eff11..4b5d5ad 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 d135ac6..9670b94 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 e78a5c3..f3afd3e 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 f78e18a..28d3ef4 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 fcf6a2a..2d30371 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 0e715d3..6d70b64 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 2b06234..4666a1a 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 ba1ab6e..0000000 --- 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 f877772..3a2ab3a 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 88f41f1..14e7596 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 bac4517..356eb06 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 b47bed5..f88a798 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 1d8a4f3..178bae1 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 035dc78..681dd41 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 925a071..9745f9e 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 ff61436..3f6064b 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 c2f72f9..8ad528d 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 ca4d229..9c903aa 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 9b7c711..3d8f0af 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 597c27d..2b20a54 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 24d3359..653f7ba 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 6e42b1a..d3a1ccb 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 d1a200b..cb867ed 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 3bcfbc9..adfdde9 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(), ) ); } -- GitLab