diff --git a/composer.json b/composer.json index 236261288cd93366c882e917a708eebfab3e03be..b3511eb773200bf7e3489fbb7261c7674501cac7 100644 --- a/composer.json +++ b/composer.json @@ -16,9 +16,8 @@ "php" ], "require": { - "php": ">=7.4", - "ramsey/collection": "^1.2", - "iqdev/search-dc": "1.2.*", + "php": ">=8.1", + "ramsey/collection": "^2", "elasticsearch/elasticsearch": "^8.5", "vlucas/phpdotenv": "^5.4.1" }, @@ -32,15 +31,9 @@ "IQDEV\\ElasticSearchTests\\": "tests/" } }, - "repositories": [ - { - "type": "vcs", - "url": "ssh://git@gitlab.iqdev.digital:8422/piligrimov/search-dc.git" - } - ], "require-dev": { "phpunit/phpunit": "^9.5", - "symfony/var-dumper": "^5.4" + "symfony/var-dumper": "^6.3" }, "scripts": { "tests": "php ./vendor/bin/phpunit --testdox --verbose" diff --git a/src/ElasticSearch/Converter/CriteriaToEsRequest.php b/src/ElasticSearch/Converter/CriteriaToEsRequest.php deleted file mode 100644 index 0150585d3a4716c04af9e0e5628b4376d778f8a3..0000000000000000000000000000000000000000 --- a/src/ElasticSearch/Converter/CriteriaToEsRequest.php +++ /dev/null @@ -1,458 +0,0 @@ -pagination($request, $criteria); - $request = $this->order($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->pagination()->limit, $criteria->pagination()->offset)); - - return $request; - } - - private function order(Request $request, Criteria $criteria): Request - { - $request = clone $request; - - if (true === $criteria->sorting()->isEmpty()) { - return $request; - } - - foreach ($criteria->sorting() as $order) { - /** @var Order $order */ - $direction = null; - if ($order->orderType() instanceof SOrderAscType) { - $direction = new OrderAscType(); - } - - if ($order->orderType() instanceof SOrderDescType) { - $direction = new OrderDescType(); - } - - if ($order->orderBy() instanceof AttrType) { - $request->getSort()->add(new OrderField($order->orderBy()->key(), $direction)); - } elseif ($order->orderBy() instanceof PropertyType) { - if ($order->orderBy()->type() === PropertyType::TYPE_KEYWORD) { - $request->getSort()->add(new OrderKeywordProperty($order->orderBy()->key(), $direction)); - } elseif ($order->orderBy()->type() === PropertyType::TYPE_NUMBER) { - $request->getSort()->add(new OrderNumberProperty($order->orderBy()->key(), $direction)); - } - } - } - - return $request; - } - - private function filter(Request $request, Criteria $criteria): Request - { - $request = clone $request; - if ($criteria->filters()->isEmpty()) { - return $request; - } - - foreach ($criteria->filters() as $filterGroup) { - /** @var FilterGroupCollection $filterGroup */ - foreach ($filterGroup as $filter) { - /** @var Filter $filter */ - $value = $filter->value()->value(); - $field = $filter->field()->value(); - - if ('search' === $field) { - if ($filter->operator()->value() === FilterOperator::CONTAINS) { - $request->addMatch( - 'suggest_search_content', - [ - 'query' => $value, - ], - ); - } else { - $request->addMatch( - 'full_search_content', - [ - 'query' => $value, - ], - ); - } - continue; - } - - if ('category_id' === $field) { - $request->getQuery()->must( - new Terms('category_id', $filter->value()->value()) - ); - continue; - } - } - } - - [$queryFilters, $postFilters] = $this->groupFilters($criteria->filters()); - - $keywordQueryFilter = $this->getKeywordFilter($queryFilters); - $keywordPostFilter = $this->getKeywordFilter($postFilters); - if (false === $keywordQueryFilter->isEmpty() || false === $keywordPostFilter->isEmpty()) { - $keywordNestedFilter = new Nested(); - $keywordNestedFilter->setPath('search_data'); - - if (false === $keywordQueryFilter->isEmpty()) { - $keywordNestedFilterQuery = clone $keywordNestedFilter; - $keywordNestedFilterQuery->setQuery($keywordQueryFilter); - $request->getQuery()->filter($keywordNestedFilterQuery); - } - - if (false === $keywordPostFilter->isEmpty()) { - $keywordNestedFilterPost = clone $keywordNestedFilter; - $keywordNestedFilterPost->setQuery($keywordPostFilter); - $request->getPostFilter()->filter($keywordNestedFilterPost); - } - } - - $numberQueryFilter = $this->getNumberFilter($queryFilters); - $numberPostFilter = $this->getNumberFilter($postFilters); - if (false === $numberQueryFilter->isEmpty() || false === $numberPostFilter->isEmpty()) { - $numberNestedFilter = new Nested(); - $numberNestedFilter->setPath('search_data'); - - if (false === $numberQueryFilter->isEmpty()) { - $numberNestedFilterQuery = clone $numberNestedFilter; - $numberNestedFilterQuery->setQuery($numberQueryFilter); - $request->getQuery()->filter($numberNestedFilterQuery); - } - - if (false === $numberPostFilter->isEmpty()) { - $numberNestedFilterPost = clone $numberNestedFilter; - $numberNestedFilterPost->setQuery($numberPostFilter); - $request->getPostFilter()->filter($numberNestedFilterPost); - } - } - - return $request; - } - - 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->getLogicalType()->value() === LogicOperator::OR ? count($ranges) + 1 : 0; - if (!isset($ranges[$group])) { - $ranges[$group] = []; - } - foreach ($filterGroup as $filter) { - /** @var Filter $filter */ - $value = $filter->value()->value(); - $field = $filter->field()->value(); - - if (in_array($field, $excludeFilter, true)) { - continue; - } - if (in_array($filter->operator()->value(), [FilterOperator::LT, FilterOperator::LTE], true)) { - $ranges[$group][$field][$filter->operator()->value()] = $value; - continue; - } - - if (in_array($filter->operator()->value(), [FilterOperator::GT, FilterOperator::GTE], true)) { - $ranges[$group][$field][$filter->operator()->value()] = $value; - } - } - } - - if (false === empty($ranges)) { - foreach ($ranges as $iGroup => $group) { - foreach ($group as $field => $range) { - $facet = new FilterNumberFacet( - $field, - $range - ); - - if ($iGroup === 0) { - $numberFilter->filter($facet); - } else { - $numberFilter->should($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->getLogicalType()->value() === LogicOperator::OR; - 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()->value(), [FilterOperator::LT, FilterOperator::LTE], true)) { - continue; - } - - if (in_array($filter->operator()->value(), [FilterOperator::GT, FilterOperator::GTE], true)) { - continue; - } - - if ('search' === $field) { - continue; - } - - if ('category_id' === $field) { - continue; - } - - if (is_array($value)) { - $value = array_map(static fn($v) => (string)$v, $value); - } else { - $value = (string)$value; - } - - if ($should) { - $keywordFilter->should(new FilterKeywordFacet($field, $value)); - } else { - $keywordFilter->filter(new FilterKeywordFacet($field, $value)); - } - } - } - - return $keywordFilter; - } - - private function aggs(Request $request, Criteria $criteria): Request - { - $request = clone $request; - - if ($criteria->filters()->isEmpty()) { - return $request; - } - - $request->getAggs()->add( - AggsFacetTerms::create( - 'keyword_facet', - 'keyword_facet' - ) - ); - - $request->getAggs()->add( - AggsFacetStats::create( - 'number_facet', - 'number_facet' - ) - ); - - [$queryFilters, $postFilters] = $this->groupFilters($criteria->filters()); - - $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()->value(), [], true)) { - continue; - } - - if ('search' === $field) { - continue; - } - - if ('category_id' === $field) { - 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->filter($nestedFilterKeyword); - } - - if (false === $numberFilter->isEmpty()) { - $nestedFilterNumber = new Nested(); - $nestedFilterNumber->setPath('search_data') - ->setQuery($numberFilter); - $queryKeywordFiltered->filter($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->filter($nestedFilterKeyword); - $queryNumberFiltered->filter($nestedFilterKeyword); - } - - if (false === $numberFilter->isEmpty()) { - $nestedFilterNumber = new Nested(); - $nestedFilterNumber->setPath('search_data') - ->setQuery($numberFilter); - - $queryKeywordFiltered->filter($nestedFilterNumber); - $queryNumberFiltered->filter($nestedFilterNumber); - } - - if (false === $queryKeywordFiltered->isEmpty()) { - $aggsKeywordFiltered->setQuery($queryKeywordFiltered); - } else { - $aggsKeywordFiltered->setNested((new Nested())->setPath('search_data')); - } - - if (false === $queryNumberFiltered->isEmpty()) { - $aggsNumberFiltered->setQuery($queryNumberFiltered); - } else { - $aggsNumberFiltered->setNested((new Nested())->setPath('search_data')); - } - - $request->getAggs() - ->add($aggsKeywordFiltered) - ->add($aggsNumberFiltered); - - return $request; - } - - /** - * @param FilterCollection $filters - * @return FilterCollection[] - */ - private function groupFilters(FilterCollection $filters): array - { - $queryFilters = new QueryFilterCollection(); - $postFilters = new PostFilterCollection(); - foreach ($filters as $filterGroup) { - /** @var FilterGroupCollection $filterGroup */ - if ($filterGroup->isEmpty()) { - continue; - } - - switch ($filterGroup->getFilterType()->value()) { - case FilterType::QUERY: - $queryFilters->add($filterGroup); - break; - case FilterType::POST: - $postFilters->add($filterGroup); - break; - } - } - - return [$queryFilters, $postFilters]; - } -} diff --git a/src/ElasticSearch/Converter/Request/Aggregation/Aggregation.php b/src/ElasticSearch/Converter/Request/Aggregation/Aggregation.php new file mode 100644 index 0000000000000000000000000000000000000000..07b0fd2cbb80da4482d7156044dff8de5c2c6f65 --- /dev/null +++ b/src/ElasticSearch/Converter/Request/Aggregation/Aggregation.php @@ -0,0 +1,53 @@ +convertToQuery(); + } + + public function convertToQuery(): void + { + $this->aggregations->add( + AggsFacetTerms::create( + 'keyword_facet', + 'keyword_facet' + ) + ); + + $this->aggregations->add( + AggsFacetStats::create( + 'number_facet', + 'number_facet' + ) + ); + + $postFilterCollection = $this->criteria->getFilters()->getFilterCollectionByType(FilterType::POST); + + $filterAggregation = new FilterAggregation($this->configuration, $postFilterCollection); + $filterAggregation->updateRequestAggregation($this->aggregations); + + $fullAggregation = new FullAggregation($this->configuration, $postFilterCollection); + $fullAggregation->updateRequestAggregation($this->aggregations); + } + + public function getAggregation(): AggsCollection + { + return $this->aggregations; + } +} diff --git a/src/ElasticSearch/Converter/Request/Aggregation/FilterAggregation.php b/src/ElasticSearch/Converter/Request/Aggregation/FilterAggregation.php new file mode 100644 index 0000000000000000000000000000000000000000..7c3567141a9a69ef7b1d41e85826076657cdde73 --- /dev/null +++ b/src/ElasticSearch/Converter/Request/Aggregation/FilterAggregation.php @@ -0,0 +1,63 @@ +filterCollection as $filterGroup) { + /** @var FilterGroupCollection $filterGroup */ + + foreach ($filterGroup as $filter) { + /** @var Filter $filter */ + + $field = $filter->field()->value(); + + $aggregation = new Aggs($this->getKey('keyword', $field)); + $aggregation->addAggs( + AggsFacetTerms::create( + 'agg_special', + 'keyword_facet' + ) + ); + + $queryFilterBuilder = new FilterQuery($this->configuration, $this->filterCollection, [$field]); + $query = $queryFilterBuilder->getQuery(); + + if (false === $query->isEmpty()) { + $aggregation->setQuery($query); + } else { + $aggregation->setNested((new Nested())->setPath('search_data')); + } + + $original->add($aggregation); + } + } + } + + private function getKey(string $type, string $name): string + { + return sprintf('%s_facet_%s', $type, $name); + } +} diff --git a/src/ElasticSearch/Converter/Request/Aggregation/FullAggregation.php b/src/ElasticSearch/Converter/Request/Aggregation/FullAggregation.php new file mode 100644 index 0000000000000000000000000000000000000000..91751222cf44fd6db0db96f9e5248339f5b626dd --- /dev/null +++ b/src/ElasticSearch/Converter/Request/Aggregation/FullAggregation.php @@ -0,0 +1,71 @@ +configuration, $this->filterCollection->getKeywordFilters()))->getQuery(); + $numberQuery = (new FilterQuery($this->configuration, $this->filterCollection->getNumberFilters()))->getQuery(); + + $aggsKeywordFiltered = new Aggs('keyword_facet_filtered'); + $aggsKeywordFiltered->addAggs( + AggsFacetTerms::create( + 'all_keyword_facet_filtered', + 'keyword_facet' + ) + ); + + $aggsNumberFiltered = new Aggs('number_facet_filtered'); + $aggsNumberFiltered->addAggs( + AggsFacetStats::create( + 'all_number_facet_filtered', + 'number_facet' + ) + ); + + if (false === $keywordQuery->getFilter()->isEmpty()) { + foreach ($keywordQuery->getFilter() as $item) { + $numberQuery->getFilter()->add($item); + } + } + + if (false === $numberQuery->getFilter()->isEmpty()) { + foreach ($numberQuery->getFilter() as $item) { + $keywordQuery->getFilter()->add($item); + } + } + + if (false === $keywordQuery->getFilter()->isEmpty()) { + $aggsKeywordFiltered->setQuery($keywordQuery); + } else { + $aggsKeywordFiltered->setNested((new Nested())->setPath('search_data')); + } + + if (false === $numberQuery->getFilter()->isEmpty()) { + $aggsNumberFiltered->setQuery($numberQuery); + } else { + $aggsNumberFiltered->setNested((new Nested())->setPath('search_data')); + } + + $original->add($aggsKeywordFiltered)->add($aggsNumberFiltered); + } +} diff --git a/src/ElasticSearch/Converter/Request/Collection/NestedFilterCollection.php b/src/ElasticSearch/Converter/Request/Collection/NestedFilterCollection.php new file mode 100644 index 0000000000000000000000000000000000000000..8dd31f3c39855d4d0c4056fc71e6f069bb55aa75 --- /dev/null +++ b/src/ElasticSearch/Converter/Request/Collection/NestedFilterCollection.php @@ -0,0 +1,11 @@ +setPagination(); + + if (false === $this->criteria->getSorting()->isEmpty()) { + $this->setSort(); + } + + if (false === $this->criteria->getSearch()->isEmpty()) { + $this->setSearch(); + } + + if (false === $this->criteria->getFilters()->isEmpty()) { + $this->setFilter(); + } + + if (false === $this->criteria->getSearch()->isEmpty() || false === $this->criteria->getFilters()->isEmpty()) { + $this->setAggregations(); + } + } + + public function setPagination(): void + { + $request = clone $this->request; + + $request->setPagination(new Pagination( + $this->criteria->getPagination()->limit, + $this->criteria->getPagination()->offset + )); + + $this->request = $request; + } + + public function setSort(): void + { + $request = clone $this->request; + + foreach ($this->criteria->getSorting() as $sort) { + $request->getSort()->add($sort); + } + + $this->request = $request; + } + + public function setSearch(): void + { + $request = clone $this->request; + + foreach ($this->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)); + } + } + + $this->request = $request; + } + + public function setFilter(): void + { + $queryFilterCollection = $this->criteria->getFilters()->getQueryFilterCollection(); + if (false === $queryFilterCollection->isEmpty()) { + $this->setQueryFilter($queryFilterCollection); + } + + $postFilterCollection = $this->criteria->getFilters()->getPostFilterCollection(); + if (false === $postFilterCollection->isEmpty()) { + $this->setPostFilter($postFilterCollection); + } + } + + private function setQueryFilter(QueryFilterCollection $filterCollection): void + { + $request = clone $this->request; + + $filterQuery = new FilterQuery($this->configuration, $filterCollection); + $request->getQuery()->modify($filterQuery->getQuery()); + + $this->request = $request; + } + + private function setPostFilter(PostFilterCollection $filterCollection): void + { + $request = clone $this->request; + + $filterQuery = new FilterQuery($this->configuration, $filterCollection); + $request->getPostFilter()->modify($filterQuery->getQuery()); + + $this->request = $request; + } + + public function setAggregations(): void + { + $request = clone $this->request; + + $aggregation = new Aggregation($this->configuration, $this->criteria); + $request->setAggs($aggregation->getAggregation()); + + $this->request = $request; + } +} diff --git a/src/ElasticSearch/Converter/Request/CriteriaToRequest.php b/src/ElasticSearch/Converter/Request/CriteriaToRequest.php new file mode 100644 index 0000000000000000000000000000000000000000..a3cdfcd14c2cceb4c79a340366c692195a40c4e3 --- /dev/null +++ b/src/ElasticSearch/Converter/Request/CriteriaToRequest.php @@ -0,0 +1,25 @@ +configuration, $criteria); + $builder->build(); + + return $builder->getRequest(); + } +} diff --git a/src/ElasticSearch/Converter/Request/Filter/AbstractFilterQuery.php b/src/ElasticSearch/Converter/Request/Filter/AbstractFilterQuery.php new file mode 100644 index 0000000000000000000000000000000000000000..4b5d5adfa555b04bebf3a1d14382abba0e0c0761 --- /dev/null +++ b/src/ElasticSearch/Converter/Request/Filter/AbstractFilterQuery.php @@ -0,0 +1,31 @@ +query = new Query(); + } + + protected function setFilterByLogic(Query $query, LogicOperator $logicOperator, Esable $filter): void + { + match ($logicOperator) { + LogicOperator::AND => $query->getFilter()->add($filter), + LogicOperator::OR => $query->getShould()->add($filter), + LogicOperator::NOT => $query->getMustNot()->add($filter), + }; + } + + abstract public function getQuery(FilterGroupCollection $filterGroupCollection, array $exclude): Query|Nested; +} diff --git a/src/ElasticSearch/Converter/Request/Filter/NestedFilter.php b/src/ElasticSearch/Converter/Request/Filter/NestedFilter.php new file mode 100644 index 0000000000000000000000000000000000000000..9670b94e441f722718a704e5777139f9fe2d2673 --- /dev/null +++ b/src/ElasticSearch/Converter/Request/Filter/NestedFilter.php @@ -0,0 +1,63 @@ +getKeywordFilters($exclude); + foreach ($keywordFiltersGroup as $keywordFilter) { + /** @var Filter $keywordFilter */ + $esableFilter = new KeywordFilterType($keywordFilter); + + $this->setFilterByLogic($query, $filterGroupCollection->getLogicOperator(), $this->getNested($esableFilter, self::NESTED_KEYWORD_PATH)); + } + + $rangeFilterGroup = $filterGroupCollection->getRangeFilters($exclude); + $rangesFilter = RangeFilterType::getFiltersByOneProperty($rangeFilterGroup); + foreach ($rangesFilter as $filterGroup) { + /** @var FilterGroupCollection $filterGroup */ + + $esableFilter = new RangeFilterType($filterGroup); + $this->setFilterByLogic($query, $filterGroupCollection->getLogicOperator(), $this->getNested($esableFilter, self::NESTED_RANGE_PATH)); + } + + return (new Nested()) + ->setPath('search_data') + ->setQuery($query); + } + + private function getNested(RangeFilterType|KeywordFilterType $filter, string $path): Nested + { + $cloneFilter = clone $filter; + $nested = new Nested(); + $query = new Query(); + + $query->getFilter()->add(new Terms($path . '.facet_code', $cloneFilter->getField())); + + $cloneFilter->setField($path . '.facet_value'); + $query->getFilter()->add($cloneFilter->getEsable()); + + $nested + ->setPath($path) + ->setQuery($query); + + return $nested; + } +} diff --git a/src/ElasticSearch/Converter/Request/Filter/PropertyFilter.php b/src/ElasticSearch/Converter/Request/Filter/PropertyFilter.php new file mode 100644 index 0000000000000000000000000000000000000000..f3afd3e0047be7e02d5b432a473902d124d81816 --- /dev/null +++ b/src/ElasticSearch/Converter/Request/Filter/PropertyFilter.php @@ -0,0 +1,38 @@ +getKeywordFilters($exclude); + foreach ($keywordFiltersGroup as $keywordFilter) { + /** @var Filter $keywordFilter */ + $esableFilter = new KeywordFilterType($keywordFilter); + + $this->setFilterByLogic($query, $filterGroupCollection->getLogicOperator(), $esableFilter->getEsable()); + } + + $rangeFilterGroup = $filterGroupCollection->getRangeFilters($exclude); + $rangesFilter = RangeFilterType::getFiltersByOneProperty($rangeFilterGroup); + foreach ($rangesFilter as $filterGroup) { + /** @var FilterGroupCollection $filterGroup */ + + $esableFilter = new RangeFilterType($filterGroup); + $this->setFilterByLogic($query, $filterGroupCollection->getLogicOperator(), $esableFilter->getEsable()); + } + + return $query; + } +} diff --git a/src/ElasticSearch/Converter/Request/Filter/Type/AbstractFilterType.php b/src/ElasticSearch/Converter/Request/Filter/Type/AbstractFilterType.php new file mode 100644 index 0000000000000000000000000000000000000000..c292b8b18c8bf0ab7380b86a7a8a9e56b137645e --- /dev/null +++ b/src/ElasticSearch/Converter/Request/Filter/Type/AbstractFilterType.php @@ -0,0 +1,21 @@ +field; + } + + public function setField(string $field): self + { + $this->field = $field; + return $this; + } +} diff --git a/src/ElasticSearch/Converter/Request/Filter/Type/KeywordFilterType.php b/src/ElasticSearch/Converter/Request/Filter/Type/KeywordFilterType.php new file mode 100644 index 0000000000000000000000000000000000000000..28d3ef4fb497431ed812e0805d372e1ec24b8433 --- /dev/null +++ b/src/ElasticSearch/Converter/Request/Filter/Type/KeywordFilterType.php @@ -0,0 +1,23 @@ +field = $this->filter->field()->value(); + } + + public function getEsable(): Esable + { + return new Terms($this->field, $this->filter->value()->value()); + } +} diff --git a/src/ElasticSearch/Converter/Request/Filter/Type/RangeFilterType.php b/src/ElasticSearch/Converter/Request/Filter/Type/RangeFilterType.php new file mode 100644 index 0000000000000000000000000000000000000000..2d303710ef415379c649c84d354c1917b68d9af9 --- /dev/null +++ b/src/ElasticSearch/Converter/Request/Filter/Type/RangeFilterType.php @@ -0,0 +1,52 @@ +field = $this->filterGroupCollection->first()->field()->value(); + } + + public function getEsable(): Esable + { + $ranges = []; + + foreach ($this->filterGroupCollection as $filter) { + /** @var Filter $filter */ + + $value = $filter->value()->value(); + $ranges[$filter->operator()->value] = $value; + } + + return new Stats($this->field, $ranges); + } + + public static function getFiltersByOneProperty(FilterGroupCollection $filterGroupCollection): FilterCollection + { + $rangeFilters = new FilterCollection(); + + $properties = []; + foreach ($filterGroupCollection as $filter) { + /** @var Filter $filter */ + + $properties[$filter->field()->value()][] = $filter; + } + + foreach ($properties as $propertyFilters) { + $rangeFilters->add(new FilterGroupCollection($propertyFilters)); + } + + return $rangeFilters; + } +} diff --git a/src/ElasticSearch/Converter/Request/FilterQuery.php b/src/ElasticSearch/Converter/Request/FilterQuery.php new file mode 100644 index 0000000000000000000000000000000000000000..6d70b64cbb1ea023b2c2ef54290c82f2a72678d6 --- /dev/null +++ b/src/ElasticSearch/Converter/Request/FilterQuery.php @@ -0,0 +1,123 @@ +query = new Query(); + $this->convertToQuery(); + } + + private function convertToQuery(): void + { + [$propertyFilterCollection, $nestedFilterCollection] = $this->separatePropertyTypes($this->filterCollection); + + 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 + { + foreach ($filterCollection as $filterGroup) { + /** @var FilterGroupCollection $filterGroup */ + + $this->setQuery($filterGroup, $filterQuery); + } + } + + private function setQuery(FilterGroupCollection $filterGroup, AbstractFilterQuery $filterQuery): void + { + $filters = $filterQuery->getQuery($filterGroup, $this->exclude); + if ($filters instanceof Query) { + if ($filters->isEmpty()) { + return; + } + + foreach ($filters->getFilter() as $filter) { + $this->query->getFilter()->add($filter); + } + + foreach ($filters->getShould() as $filter) { + $this->query->getShould()->add($filter); + } + + foreach ($filters->getMustNot() as $filter) { + $this->query->getMustNot()->add($filter); + } + + $this->query = $filters; + } elseif ($filters instanceof Nested) { + if ($filters->getQuery()->isEmpty()) { + return; + } + + $this->query->getFilter()->add($filters); + } + } + + public function getQuery(): Query + { + return $this->query; + } + + private function separatePropertyTypes(FilterCollection $filterCollection): array + { + $propertyFilter = new PropertyFilterCollection(); + $nestedFilter = new NestedFilterCollection(); + + 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]; + } +} diff --git a/src/ElasticSearch/Converter/Request/RequestBuilder.php b/src/ElasticSearch/Converter/Request/RequestBuilder.php new file mode 100644 index 0000000000000000000000000000000000000000..08646d6c5bf5ce001c0ea9b94425952af66d5523 --- /dev/null +++ b/src/ElasticSearch/Converter/Request/RequestBuilder.php @@ -0,0 +1,27 @@ +request; + } + + abstract public function setPagination(): void; + abstract public function setSort(): void; + abstract public function setSearch(): void; + abstract public function setFilter(): void; + abstract public function setAggregations(): void; + abstract public function build(): void; +} diff --git a/src/ElasticSearch/Converter/EsResponseToResult.php b/src/ElasticSearch/Converter/Result/EsResponseToResult.php similarity index 84% rename from src/ElasticSearch/Converter/EsResponseToResult.php rename to src/ElasticSearch/Converter/Result/EsResponseToResult.php index 6d734f109b386324d3a4484d11e2e77ca397e38e..4666a1a7a69728087e142be2812ffd42373dd7e3 100644 --- a/src/ElasticSearch/Converter/EsResponseToResult.php +++ b/src/ElasticSearch/Converter/Result/EsResponseToResult.php @@ -1,16 +1,15 @@ products->add($facetItem); diff --git a/src/ElasticSearch/Criteria/Criteria.php b/src/ElasticSearch/Criteria/Criteria.php new file mode 100644 index 0000000000000000000000000000000000000000..ad59270a2d270a9c4f5e1ab6c2067d673ea8874f --- /dev/null +++ b/src/ElasticSearch/Criteria/Criteria.php @@ -0,0 +1,51 @@ +search = new SearchCollection(); + $this->filters = new FilterCollection(); + $this->sorting = new OrderCollection(); + $this->pagination = new Pagination(); + } + + public function getSearch(): SearchCollection + { + return $this->search; + } + + public function getFilters(): FilterCollection + { + return $this->filters; + } + + public function getSorting(): OrderCollection + { + return $this->sorting; + } + + public function getPagination(): Pagination + { + return $this->pagination; + } + + public function __clone(): void + { + $this->search = clone $this->search; + $this->filters = clone $this->filters; + $this->sorting = clone $this->sorting; + $this->pagination = clone $this->pagination; + } +} diff --git a/src/ElasticSearch/Criteria/Filter/Collection/FilterCollection.php b/src/ElasticSearch/Criteria/Filter/Collection/FilterCollection.php new file mode 100644 index 0000000000000000000000000000000000000000..5c240ee8bac29daaa84501083d786e3ae3339b36 --- /dev/null +++ b/src/ElasticSearch/Criteria/Filter/Collection/FilterCollection.php @@ -0,0 +1,172 @@ +type = LogicOperator::AND; + } + + /** + * @inheritDoc + */ + public function getType(): string + { + return FilterGroupCollection::class; + } + + /** + * Установка типа логической операции + * + * @param LogicOperator $type + * + * @return $this + */ + public function setLogicalType(LogicOperator $type): self + { + $this->type = $type; + + return $this; + } + + /** + * Получение типа логической операции + * + * @return LogicOperator + */ + public function getLogicalType(): LogicOperator + { + return $this->type; + } + + public function getFilterCollectionByType(FilterType $type): PostFilterCollection|QueryFilterCollection + { + $collection = match ($type) { + FilterType::POST => new PostFilterCollection(), + FilterType::QUERY => new QueryFilterCollection(), + }; + + $collection->data = array_filter( + $this->toArray(), + static fn (FilterGroupCollection $group) => $group->getFilterType() === $type + ); + + return $collection; + } + + public function getQueryFilterCollection(): QueryFilterCollection + { + $collection = new QueryFilterCollection(); + + $collection->data = array_filter( + $this->toArray(), + static fn (FilterGroupCollection $group) => $group->getFilterType() === FilterType::QUERY + ); + + return $collection; + } + + public function getPostFilterCollection(): PostFilterCollection + { + $collection = new PostFilterCollection(); + + $collection->data = array_filter( + $this->toArray(), + static fn (FilterGroupCollection $group) => $group->getFilterType() === FilterType::POST + ); + + return $collection; + } + + public function getKeywordFilters(array $excludeFilter = []): FilterCollection + { + $filterCollection = new FilterCollection(); + + foreach ($this->data as $filterGroup) { + /** @var FilterGroupCollection $filterGroup */ + + $keywordFilterGroup = new FilterGroupCollection(); + + foreach ($filterGroup->data as $filter) { + /** @var Filter $filter */ + + $field = $filter->field()->value(); + + if (in_array($field, $excludeFilter, true) + || in_array($filter->operator(), [ + FilterOperator::LT, + FilterOperator::LTE, + FilterOperator::GT, + FilterOperator::GTE + ], true) + ) { + continue; + } + + $keywordFilterGroup->add($filter); + } + + if (false === $keywordFilterGroup->isEmpty()) { + $keywordFilterGroup->setLogicOperator($filterGroup->getLogicOperator()); + $filterCollection->add($keywordFilterGroup); + } + } + + return $filterCollection; + } + + public function getNumberFilters(array $excludeFilter = []): FilterCollection + { + $filterCollection = new FilterCollection(); + + foreach ($this as $filterGroup) { + /** @var FilterGroupCollection $filterGroup */ + + $numberFilterGroup = new FilterGroupCollection(); + + foreach ($filterGroup as $filter) { + /** @var Filter $filter */ + + $field = $filter->field()->value(); + + if (in_array($field, $excludeFilter, true)) { + continue; + } + + if (in_array($filter->operator(), [ + FilterOperator::LT, + FilterOperator::LTE, + FilterOperator::GT, + FilterOperator::GTE + ], true)) { + $numberFilterGroup->add($filter); + } + } + + if (false === $numberFilterGroup->isEmpty()) { + $numberFilterGroup->setLogicOperator($filterGroup->getLogicOperator()); + $filterCollection->add($numberFilterGroup); + } + } + + return $filterCollection; + } +} diff --git a/src/ElasticSearch/Criteria/Filter/Collection/FilterGroupCollection.php b/src/ElasticSearch/Criteria/Filter/Collection/FilterGroupCollection.php new file mode 100644 index 0000000000000000000000000000000000000000..c5b17c4100dde286667b464e653b0e89652bfc9d --- /dev/null +++ b/src/ElasticSearch/Criteria/Filter/Collection/FilterGroupCollection.php @@ -0,0 +1,121 @@ +logicOperator = LogicOperator::AND; + $this->filterType = FilterType::POST; + } + + /** + * @inheritDoc + */ + public function getType(): string + { + return Filter::class; + } + + /** + * Установка типа логической операции + * + * @param LogicOperator $type + * + * @return $this + */ + public function setLogicOperator(LogicOperator $type): self + { + $this->logicOperator = $type; + + return $this; + } + + /** + * Получение типа логической операции + * + * @return LogicOperator + */ + public function getLogicOperator(): LogicOperator + { + return $this->logicOperator; + } + + /** + * Установка типа фильтрации + * + * @param FilterType $type + * + * @return $this + */ + public function setFilterType(FilterType $type): self + { + $this->filterType = $type; + + return $this; + } + + /** + * Получение типа фильтрации + * + * @return FilterType + */ + public function getFilterType(): FilterType + { + return $this->filterType; + } + + public function getKeywordFilters(array $excludeFilter = []): FilterGroupCollection + { + return $this->getFilters(false, $excludeFilter); + } + + public function getRangeFilters(array $excludeFilter = []): FilterGroupCollection + { + return $this->getFilters(true, $excludeFilter); + } + + private function getFilters(bool $range = false, array $excludeFilter = []): FilterGroupCollection + { + $filterGroup = new FilterGroupCollection(); + $filterGroup->setLogicOperator($this->getLogicOperator()); + + foreach ($this->data as $filter) { + /** @var Filter $filter */ + + $field = $filter->field()->value(); + + if (false === in_array($field, $excludeFilter, true) + && $range === in_array($filter->operator(), [ + FilterOperator::LT, + FilterOperator::LTE, + FilterOperator::GT, + FilterOperator::GTE + ], true) + ) { + $filterGroup->add($filter); + } + } + + return $filterGroup; + } +} diff --git a/src/ElasticSearch/Criteria/Filter/Collection/PostFilterCollection.php b/src/ElasticSearch/Criteria/Filter/Collection/PostFilterCollection.php new file mode 100644 index 0000000000000000000000000000000000000000..4fa6a2d3fb9b654add64b07e88d56cecc3ffec42 --- /dev/null +++ b/src/ElasticSearch/Criteria/Filter/Collection/PostFilterCollection.php @@ -0,0 +1,7 @@ +value; + } +} diff --git a/src/ElasticSearch/Criteria/Filter/Filter.php b/src/ElasticSearch/Criteria/Filter/Filter.php new file mode 100644 index 0000000000000000000000000000000000000000..0b3ac4bac8f4a99f1c47394afc7ce8bc6022b4a4 --- /dev/null +++ b/src/ElasticSearch/Criteria/Filter/Filter.php @@ -0,0 +1,28 @@ +field; + } + + public function operator(): FilterOperator + { + return $this->operator; + } + + public function value(): FilterValue + { + return $this->value; + } +} diff --git a/src/ElasticSearch/Criteria/Filter/FilterOperator.php b/src/ElasticSearch/Criteria/Filter/FilterOperator.php new file mode 100644 index 0000000000000000000000000000000000000000..1ce9b870b5ea32ef5119813f56e58425c8b49f23 --- /dev/null +++ b/src/ElasticSearch/Criteria/Filter/FilterOperator.php @@ -0,0 +1,15 @@ +value; + } +} diff --git a/src/ElasticSearch/Criteria/Filter/Value/FilterNumber.php b/src/ElasticSearch/Criteria/Filter/Value/FilterNumber.php new file mode 100644 index 0000000000000000000000000000000000000000..a4bd1bc35378268cdea923e50beb4657135f0ec0 --- /dev/null +++ b/src/ElasticSearch/Criteria/Filter/Value/FilterNumber.php @@ -0,0 +1,21 @@ +value; + } +} diff --git a/src/ElasticSearch/Criteria/Match/QueryMatch.php b/src/ElasticSearch/Criteria/Match/QueryMatch.php new file mode 100644 index 0000000000000000000000000000000000000000..49fe4b45a4746f7dc661f98f54db2fc22ff4c992 --- /dev/null +++ b/src/ElasticSearch/Criteria/Match/QueryMatch.php @@ -0,0 +1,25 @@ +key => [ + 'query' => $this->value + ] + ]; + } +} diff --git a/src/ElasticSearch/Criteria/Match/QueryMatchCollection.php b/src/ElasticSearch/Criteria/Match/QueryMatchCollection.php new file mode 100644 index 0000000000000000000000000000000000000000..830f011a20127c81c0b5a1349736d5c68a663ba0 --- /dev/null +++ b/src/ElasticSearch/Criteria/Match/QueryMatchCollection.php @@ -0,0 +1,31 @@ +toArray() as $match) { + /** @var QueryMatch $match */ + $matches = array_merge($match->es()); + } + + return $matches; + } +} diff --git a/src/ElasticSearch/Criteria/Order/Order.php b/src/ElasticSearch/Criteria/Order/Order.php new file mode 100644 index 0000000000000000000000000000000000000000..1fb7bf78afb2777bd1e979d24a1e259cd157ddeb --- /dev/null +++ b/src/ElasticSearch/Criteria/Order/Order.php @@ -0,0 +1,31 @@ +property; + } + + public function getDirection(): OrderDirection + { + return $this->direction; + } + + public function getAdditionalParams(): array + { + return $this->additionalParams; + } +} diff --git a/src/ElasticSearch/Order/OrderCollection.php b/src/ElasticSearch/Criteria/Order/OrderCollection.php similarity index 90% rename from src/ElasticSearch/Order/OrderCollection.php rename to src/ElasticSearch/Criteria/Order/OrderCollection.php index 3be74b6470200ec5d65a67b8cc227113681bdefc..dae33d3ba679fa03f70aca84de8daf71b6fbb68e 100644 --- a/src/ElasticSearch/Order/OrderCollection.php +++ b/src/ElasticSearch/Criteria/Order/OrderCollection.php @@ -1,6 +1,6 @@ getType()) { + PropertyType::KEYWORD => new KeywordPropertyOrder($property, $direction), + PropertyType::NUMBER => new NumberPropertyOrder($property, $direction), + default => new BaseOrder($property, $direction), + }; + } +} diff --git a/src/ElasticSearch/Criteria/Order/Type/BaseOrder.php b/src/ElasticSearch/Criteria/Order/Type/BaseOrder.php new file mode 100644 index 0000000000000000000000000000000000000000..c65d37eeb06bce0d839563f2836d6ef9a430444d --- /dev/null +++ b/src/ElasticSearch/Criteria/Order/Type/BaseOrder.php @@ -0,0 +1,16 @@ +property->getKey() => $this->direction->value], + $this->additionalParams + ); + } +} diff --git a/src/ElasticSearch/Order/OrderKeywordProperty.php b/src/ElasticSearch/Criteria/Order/Type/KeywordPropertyOrder.php similarity index 53% rename from src/ElasticSearch/Order/OrderKeywordProperty.php rename to src/ElasticSearch/Criteria/Order/Type/KeywordPropertyOrder.php index c490062a5df27cb0e272404e39d2bc37e2aca209..d6d06c0b90b81b905afda0d52bb1e3d5cf23b141 100644 --- a/src/ElasticSearch/Order/OrderKeywordProperty.php +++ b/src/ElasticSearch/Criteria/Order/Type/KeywordPropertyOrder.php @@ -1,29 +1,34 @@ $this->direction::getType(), + 'order' => $this->direction->value, 'nested' => [ 'path' => 'search_data', 'filter' => [ 'bool' => [ 'must' => [ 'term' => [ - 'search_data.keyword_facet.facet_code' => $this->by, - ] + 'search_data.keyword_facet.facet_code' => $this->property->getKey(), + ], ], ], ], ], ]; - $order = array_merge($order, $this->properties); + return [ - 'search_data.keyword_facet.facet_value' => $order, + 'search_data.keyword_facet.facet_value' => array_merge( + $order, + $this->additionalParams + ), ]; } } diff --git a/src/ElasticSearch/Order/OrderNumberProperty.php b/src/ElasticSearch/Criteria/Order/Type/NumberPropertyOrder.php similarity index 53% rename from src/ElasticSearch/Order/OrderNumberProperty.php rename to src/ElasticSearch/Criteria/Order/Type/NumberPropertyOrder.php index befc546078b4da2c34474eacaad1cd66d09747e4..f56f6b26deb15c622960e39df4a80147ac71ada1 100644 --- a/src/ElasticSearch/Order/OrderNumberProperty.php +++ b/src/ElasticSearch/Criteria/Order/Type/NumberPropertyOrder.php @@ -1,29 +1,34 @@ $this->direction::getType(), + 'order' => $this->direction->value, 'nested' => [ 'path' => 'search_data', 'filter' => [ 'bool' => [ 'must' => [ 'term' => [ - 'search_data.number_facet.facet_code' => $this->by, - ] + 'search_data.number_facet.facet_code' => $this->property->getKey(), + ], ], ], ], ], ]; - $order = array_merge($order, $this->properties); + return [ - 'search_data.number_facet.facet_value' => $order, + 'search_data.number_facet.facet_value' => array_merge( + $order, + $this->additionalParams + ), ]; } } diff --git a/src/ElasticSearch/Criteria/Pagination.php b/src/ElasticSearch/Criteria/Pagination.php new file mode 100644 index 0000000000000000000000000000000000000000..dc9a27d2df3a1361ffed1a971d61e631a27ff084 --- /dev/null +++ b/src/ElasticSearch/Criteria/Pagination.php @@ -0,0 +1,12 @@ +searchService->search($q->criteria); + + return new SearchQueryResponse($result); + } +} diff --git a/src/ElasticSearch/Criteria/Query/SearchQueryResponse.php b/src/ElasticSearch/Criteria/Query/SearchQueryResponse.php new file mode 100644 index 0000000000000000000000000000000000000000..37bdcc7711b13f9bb0b652915b2001b0fa2037ce --- /dev/null +++ b/src/ElasticSearch/Criteria/Query/SearchQueryResponse.php @@ -0,0 +1,13 @@ +property; + } + + public function getValue(): string + { + return $this->value; + } +} diff --git a/src/ElasticSearch/Criteria/Search/SearchCollection.php b/src/ElasticSearch/Criteria/Search/SearchCollection.php new file mode 100644 index 0000000000000000000000000000000000000000..e3b268fb5d8af0edb0f79f6bcca45b884a7f9ae8 --- /dev/null +++ b/src/ElasticSearch/Criteria/Search/SearchCollection.php @@ -0,0 +1,16 @@ +search->getProperty()->getKey(), + $this->search->getValue(), + ); + } + + public function toMust(Configuration $configuration): Terms|Nested + { + if (MappingValidator::isPropertyExists($configuration, $this->search->getProperty()->getKey())) { + + return new Terms($this->search->getProperty()->getKey(), $this->search->getValue()); + } else { + $path = 'search_data.keyword_facet'; + + $nested = new Nested(); + + $query = new Query(); + $query->getFilter()->add(new Terms($path . '.facet_code', $this->search->getProperty()->getKey())); + $query->getFilter()->add(new Terms($path . '.facet_value', $this->search->getValue())); + + $nested + ->setPath($path) + ->setQuery($query); + + return $nested; + } + } +} diff --git a/src/ElasticSearch/Document/Product.php b/src/ElasticSearch/Document/Product.php new file mode 100644 index 0000000000000000000000000000000000000000..120d585bca55fcbad50fb104129b5930bf75e01f --- /dev/null +++ b/src/ElasticSearch/Document/Product.php @@ -0,0 +1,13 @@ + + */ +final class ProductCollection extends AbstractCollection +{ + + public function getType(): string + { + return Product::class; + } +} diff --git a/src/ElasticSearch/Document/ProductDocument.php b/src/ElasticSearch/Document/ProductDocument.php index 87752e8f01f9320eaf03c4dca6651d4d412ef857..1b99a58921030aeb8209454e8e8566e68d09c4f4 100644 --- a/src/ElasticSearch/Document/ProductDocument.php +++ b/src/ElasticSearch/Document/ProductDocument.php @@ -4,8 +4,8 @@ namespace IQDEV\ElasticSearch\Document; use IQDEV\ElasticSearch\Config\MappingValidator; use IQDEV\ElasticSearch\Configuration; -use IQDEV\ElasticSearch\Facet\FacetCategory; -use IQDEV\ElasticSearch\Facet\FacetCollection; +use IQDEV\ElasticSearch\Facet\Collection\FacetCollection; +use IQDEV\ElasticSearch\Facet\Facet; use IQDEV\ElasticSearch\Helper\ArrayHelper; class ProductDocument implements Document @@ -17,21 +17,14 @@ class ProductDocument implements Document private array $info = []; private bool $skipEmpty = false; - private FacetCategory $categoryFacet; - - public function __construct( - FacetCategory $categoryFacet - ) - { + private Facet $categoryFacet + ) { $this->keywordFacets = new FacetCollection(); $this->numberFacets = new FacetCollection(); - - $this->categoryFacet = $categoryFacet; - } - public static function create(FacetCategory $categoryFacet): self + public static function create(Facet $categoryFacet): self { return new self($categoryFacet); } @@ -45,9 +38,9 @@ class ProductDocument implements Document } /** - * @return FacetCategory + * @return Facet */ - public function getCategoryFacet(): FacetCategory + public function getCategoryFacet(): Facet { return $this->categoryFacet; } diff --git a/src/ElasticSearch/Document/Property/Property.php b/src/ElasticSearch/Document/Property/Property.php new file mode 100644 index 0000000000000000000000000000000000000000..79cfd35091a93b4db8fe3046ae45dbf56def5c6d --- /dev/null +++ b/src/ElasticSearch/Document/Property/Property.php @@ -0,0 +1,22 @@ +key; + } + + public function getType(): PropertyType + { + return $this->type; + } +} diff --git a/src/ElasticSearch/Document/Property/PropertyType.php b/src/ElasticSearch/Document/Property/PropertyType.php new file mode 100644 index 0000000000000000000000000000000000000000..b611b3d4b39c4cc860932fe39983961aaf08e9da --- /dev/null +++ b/src/ElasticSearch/Document/Property/PropertyType.php @@ -0,0 +1,11 @@ + $facet->es(), $this->toArray()); + return array_map(static fn(Facetable $facet) => $facet->es(), $this->toArray()); } } diff --git a/src/ElasticSearch/Facet/Collection/FacetResultCollection.php b/src/ElasticSearch/Facet/Collection/FacetResultCollection.php new file mode 100644 index 0000000000000000000000000000000000000000..3d51f0d228ed441f33c89ff1092c16529a043056 --- /dev/null +++ b/src/ElasticSearch/Facet/Collection/FacetResultCollection.php @@ -0,0 +1,18 @@ +property; + } } diff --git a/src/ElasticSearch/Facet/FacetCategory.php b/src/ElasticSearch/Facet/FacetCategory.php deleted file mode 100644 index 6e286b1c37f56d3788ac89eae4a45cd76b481d3b..0000000000000000000000000000000000000000 --- a/src/ElasticSearch/Facet/FacetCategory.php +++ /dev/null @@ -1,22 +0,0 @@ -category = $category; - } - - public function es(): array - { - return [ - 'category_id' => $this->category, - ]; - } -} diff --git a/src/ElasticSearch/Facet/FacetFactory.php b/src/ElasticSearch/Facet/FacetFactory.php new file mode 100644 index 0000000000000000000000000000000000000000..005083779976c9aa17aad0f9681d7a0320c90610 --- /dev/null +++ b/src/ElasticSearch/Facet/FacetFactory.php @@ -0,0 +1,23 @@ +getType()) { + PropertyType::KEYWORD => $facet = new KeywordFacet($property, $value), + PropertyType::NUMBER => $facet = new NumberFacet($property, $value), + default => $facet = new BaseFacet($property, $value), + }; + + return $facet; + } +} diff --git a/src/ElasticSearch/Facet/FacetKeyword.php b/src/ElasticSearch/Facet/FacetKeyword.php deleted file mode 100644 index fc431625408028cb8e4497a44053348ecdafb890..0000000000000000000000000000000000000000 --- a/src/ElasticSearch/Facet/FacetKeyword.php +++ /dev/null @@ -1,27 +0,0 @@ -key = $key; - $this->value = $value; - } - - public function es(): array - { - return [ - 'facet_code' => $this->key, - 'facet_value' => $this->value, - ]; - } -} diff --git a/src/ElasticSearch/Facet/FacetNumber.php b/src/ElasticSearch/Facet/FacetNumber.php deleted file mode 100644 index 953dfcad38ec2f55607e36324f3b826d976a58fd..0000000000000000000000000000000000000000 --- a/src/ElasticSearch/Facet/FacetNumber.php +++ /dev/null @@ -1,23 +0,0 @@ -key = $key; - $this->value = $value; - } - - public function es(): array - { - return [ - 'facet_code' => $this->key, - 'facet_value' => $this->value, - ]; - } -} diff --git a/src/ElasticSearch/Facet/FacetResult.php b/src/ElasticSearch/Facet/FacetResult.php new file mode 100644 index 0000000000000000000000000000000000000000..66c608f3477ab3b09082c74f49ac8c9646e760e9 --- /dev/null +++ b/src/ElasticSearch/Facet/FacetResult.php @@ -0,0 +1,31 @@ +type = $type; + $this->code = $code; + $this->products = new FacetItemCollection(); + } + + public function getType(): FacetType + { + return $this->type; + } + + public function getCode(): string + { + return $this->code; + } +} diff --git a/src/ElasticSearch/Facet/FacetType.php b/src/ElasticSearch/Facet/FacetType.php new file mode 100644 index 0000000000000000000000000000000000000000..9a8f9dd0b5cf39125b6805a7165259a05950e1ef --- /dev/null +++ b/src/ElasticSearch/Facet/FacetType.php @@ -0,0 +1,9 @@ +label; + } + + public function getValue(): ?string + { + return $this->value; + } + + public function getCount(): int + { + return $this->count; + } + + public function isActive(): bool + { + return $this->count > 0; + } + + public function isSelected(): bool + { + return $this->selected; + } +} diff --git a/src/ElasticSearch/Facet/Item/FacetItemCollection.php b/src/ElasticSearch/Facet/Item/FacetItemCollection.php new file mode 100644 index 0000000000000000000000000000000000000000..9e3a0d0d4ce7e01ce8a1d3f861432e931258e7c6 --- /dev/null +++ b/src/ElasticSearch/Facet/Item/FacetItemCollection.php @@ -0,0 +1,14 @@ +value = $value; + $instance->label = $label; + $instance->count = $count; + $instance->selected = $selected; + + return $instance; + } +} diff --git a/src/ElasticSearch/Facet/Item/FacetItemRange.php b/src/ElasticSearch/Facet/Item/FacetItemRange.php new file mode 100644 index 0000000000000000000000000000000000000000..7289941d120e43fbaa68b98d6ec09469f367b417 --- /dev/null +++ b/src/ElasticSearch/Facet/Item/FacetItemRange.php @@ -0,0 +1,55 @@ +label = $label; + $instance->count = $count; + $instance->selected = $selected; + + $instance->data = $data; + $instance->selectedData = $selectedData; + + return $instance; + } + + public function getFullRange(): array + { + return [ + 'min' => $this->data->min, + 'max' => $this->data->max + ]; + } + + public function getSelectedRange(): array + { + return [ + 'min' => $this->selectedData->min, + 'max' => $this->selectedData->max + ]; + } + + public function getData(): FacetItemRangeDTO + { + return $this->data; + } + + public function getSelectedData(): FacetItemRangeDTO + { + return $this->selectedData; + } +} diff --git a/src/ElasticSearch/Facet/Item/FacetItemRangeDTO.php b/src/ElasticSearch/Facet/Item/FacetItemRangeDTO.php new file mode 100644 index 0000000000000000000000000000000000000000..a3fd7fea23d749705f981be525cb40587c131d49 --- /dev/null +++ b/src/ElasticSearch/Facet/Item/FacetItemRangeDTO.php @@ -0,0 +1,22 @@ +min = $min; + $instance->max = $max; + $instance->avg = $avg; + $instance->sum = $sum; + + return $instance; + } +} \ No newline at end of file diff --git a/src/ElasticSearch/Facet/Item/FacetItemSingle.php b/src/ElasticSearch/Facet/Item/FacetItemSingle.php new file mode 100644 index 0000000000000000000000000000000000000000..255858c041876c4eaff692c60837c731f9b01ed5 --- /dev/null +++ b/src/ElasticSearch/Facet/Item/FacetItemSingle.php @@ -0,0 +1,18 @@ +value = $value; + $instance->count = $count; + $instance->label = $label; + + return $instance; + } +} diff --git a/src/ElasticSearch/Facet/Type/BaseFacet.php b/src/ElasticSearch/Facet/Type/BaseFacet.php new file mode 100644 index 0000000000000000000000000000000000000000..690f0ed8a10be3c820404e2709348829ad9e8bfa --- /dev/null +++ b/src/ElasticSearch/Facet/Type/BaseFacet.php @@ -0,0 +1,18 @@ +property->getKey() => $this->value, + ]; + } +} diff --git a/src/ElasticSearch/Facet/Type/KeywordFacet.php b/src/ElasticSearch/Facet/Type/KeywordFacet.php new file mode 100644 index 0000000000000000000000000000000000000000..b525e51530dce6c38dccde88177be4ed1529516b --- /dev/null +++ b/src/ElasticSearch/Facet/Type/KeywordFacet.php @@ -0,0 +1,23 @@ +value) ? + array_map(static fn($value) => (string) $value, $this->value) : + (string) $this->value; + + return [ + 'facet_code' => $this->property->getKey(), + 'facet_value' => $value + ]; + } +} diff --git a/src/ElasticSearch/Facet/Type/NumberFacet.php b/src/ElasticSearch/Facet/Type/NumberFacet.php new file mode 100644 index 0000000000000000000000000000000000000000..43e4c8e5e27f087fe348754328334e0ad60496b0 --- /dev/null +++ b/src/ElasticSearch/Facet/Type/NumberFacet.php @@ -0,0 +1,19 @@ + $this->property->getKey(), + 'facet_value' => (float) $this->value, + ]; + } +} diff --git a/src/ElasticSearch/Filter/PostFilterCollection.php b/src/ElasticSearch/Filter/PostFilterCollection.php deleted file mode 100644 index 315d43aff5c2d3a81f784822cbec161dabc527d8..0000000000000000000000000000000000000000 --- a/src/ElasticSearch/Filter/PostFilterCollection.php +++ /dev/null @@ -1,9 +0,0 @@ -name = $name; - $this->body = $body; - $this->id = $id; } public function es(): array diff --git a/src/ElasticSearch/Indexer/BaseIndexProvider.php b/src/ElasticSearch/Indexer/BaseIndexProvider.php index 2a5aee2d36bfec77b67c5f7ce9e94938f9b31138..e070f66e3eb49154b8b790be3592e181a74343f0 100644 --- a/src/ElasticSearch/Indexer/BaseIndexProvider.php +++ b/src/ElasticSearch/Indexer/BaseIndexProvider.php @@ -4,34 +4,39 @@ namespace IQDEV\ElasticSearch\Indexer; use IQDEV\ElasticSearch\Configuration; use IQDEV\ElasticSearch\Document\ProductDocument; -use IQDEV\ElasticSearch\Facet\FacetCategory; -use IQDEV\ElasticSearch\Facet\FacetKeyword; -use IQDEV\ElasticSearch\Facet\FacetNumber; +use IQDEV\ElasticSearch\Document\Property\Property; +use IQDEV\ElasticSearch\Document\Property\PropertyType; +use IQDEV\ElasticSearch\Facet\FacetFactory; class BaseIndexProvider implements IndexProvider { - private array $products; private ?int $size = null; private ?int $limit = null; - private Configuration $configuration; - public function __construct($products, $configuration) - { - $this->configuration = $configuration; - $this->products = $products; + public function __construct( + private array $products, + private Configuration $configuration + ) { } public function get(): \Generator { foreach ($this->products as $product) { - $document = new ProductDocument(new FacetCategory($product['category'])); + $document = new ProductDocument( + FacetFactory::createFromProperty(new Property('category_id', PropertyType::BASE), $product['category']) + ); + $document->setAdditionData($product['data'] ?? []); foreach ($product['properties'] as $type => $values) { - foreach ($values as $key => $prop) { + foreach ($values as $key => $value) { if ($type === 'number') { - $document->getNumberFacets()->add(new FacetNumber($key, $prop)); + $document->getNumberFacets()->add( + FacetFactory::createFromProperty(new Property($key, PropertyType::NUMBER), $value) + ); } else { - $document->getKeywordFacets()->add(new FacetKeyword($key, $prop)); + $document->getKeywordFacets()->add( + FacetFactory::createFromProperty(new Property($key, PropertyType::KEYWORD), $value) + ); } } } diff --git a/src/ElasticSearch/Indexer/BulkIndex.php b/src/ElasticSearch/Indexer/BulkIndex.php index 94134a2aaa3748427bdc8937be891a8c725178a3..3578b264285d95a091b7a173f93d82eda6f2f5a4 100644 --- a/src/ElasticSearch/Indexer/BulkIndex.php +++ b/src/ElasticSearch/Indexer/BulkIndex.php @@ -6,19 +6,11 @@ use IQDEV\ElasticSearch\Esable; final class BulkIndex implements Index { - private string $name; - private Esable $body; - private ?string $id; - public function __construct( - string $name, - Esable $body, - ?string $id = null - ) - { - $this->name = $name; - $this->body = $body; - $this->id = $id; + private string $name, + private Esable $body, + private ?string $id = null + ) { } public function es(): array diff --git a/src/ElasticSearch/Indexer/DeleteIndex.php b/src/ElasticSearch/Indexer/DeleteIndex.php index df4b049369c593c0c935c31d8c14bde09c258d2d..fe395016e537bc56eca6d315ac3beaa0121931ba 100644 --- a/src/ElasticSearch/Indexer/DeleteIndex.php +++ b/src/ElasticSearch/Indexer/DeleteIndex.php @@ -4,16 +4,10 @@ namespace IQDEV\ElasticSearch\Indexer; final class DeleteIndex implements Index { - private string $name; - private ?string $id; - public function __construct( - string $name, - ?string $id = null - ) - { - $this->name = $name; - $this->id = $id; + private string $name, + private ?string $id = null + ) { } public function es(): array diff --git a/src/ElasticSearch/Indexer/EsHelperEndpoint.php b/src/ElasticSearch/Indexer/EsHelperEndpoint.php index bc37f33e2eb94a05b2e30aaf2ee4c35bc617ad9c..2977127efffb28ea91dcf05db5b1327ec86afb7d 100644 --- a/src/ElasticSearch/Indexer/EsHelperEndpoint.php +++ b/src/ElasticSearch/Indexer/EsHelperEndpoint.php @@ -16,20 +16,11 @@ final class EsHelperEndpoint { use EndpointTrait; - private Client $esClient; - private Configuration $configuration; - - private LoggerInterface $logger; - public function __construct( - Client $esClient, - Configuration $configuration, - LoggerInterface $logger - ) - { - $this->esClient = $esClient; - $this->configuration = $configuration; - $this->logger = $logger; + private Client $esClient, + private Configuration $configuration, + private LoggerInterface $logger + ) { } public function isIndexExists(): bool diff --git a/src/ElasticSearch/Indexer/Index.php b/src/ElasticSearch/Indexer/Index.php index f6138cca24f21d831bc30007c89d0d31eabb3698..b7e20bb2932c727dfcdc13253ea5dc67fca07cb7 100644 --- a/src/ElasticSearch/Indexer/Index.php +++ b/src/ElasticSearch/Indexer/Index.php @@ -6,5 +6,4 @@ use IQDEV\ElasticSearch\Esable; interface Index extends Esable { - -} \ No newline at end of file +} diff --git a/src/ElasticSearch/Indexer/UpdateIndex.php b/src/ElasticSearch/Indexer/UpdateIndex.php index 50572927b359261fefe27b1f59609299ec3ff8dd..72cb88558c6b9945f5941a02cfaaceff0d4f9142 100644 --- a/src/ElasticSearch/Indexer/UpdateIndex.php +++ b/src/ElasticSearch/Indexer/UpdateIndex.php @@ -6,19 +6,11 @@ use IQDEV\ElasticSearch\Esable; final class UpdateIndex implements Index { - private string $name; - private Esable $body; - private ?string $id; - public function __construct( - string $name, - Esable $body, - ?string $id = null - ) - { - $this->name = $name; - $this->body = $body; - $this->id = $id; + private string $name, + private Esable $body, + private ?string $id = null + ) { } public function es(): array diff --git a/src/ElasticSearch/Order/Order.php b/src/ElasticSearch/Order/Order.php deleted file mode 100644 index b23f06735c8212a89baa0e77025f07876bed0893..0000000000000000000000000000000000000000 --- a/src/ElasticSearch/Order/Order.php +++ /dev/null @@ -1,24 +0,0 @@ -by = $by; - $this->direction = $direction; - $this->properties = $properties; - } - - public function es(): array - { - return array_merge([$this->by => $this->direction::getType()], $this->properties); - } -} diff --git a/src/ElasticSearch/Order/OrderAscType.php b/src/ElasticSearch/Order/OrderAscType.php deleted file mode 100644 index 69b8f08ae438dd256953c7da4a322cdbf718795c..0000000000000000000000000000000000000000 --- a/src/ElasticSearch/Order/OrderAscType.php +++ /dev/null @@ -1,8 +0,0 @@ -products = new ProductCollection(); + $this->facets = new FacetResultCollection(); + } + + public function setTotal(int $total): void + { + $this->total = $total; + } + + public function getTotal(): int + { + return $this->total; + } + + public function getProducts(): ProductCollection + { + return $this->products; + } + + public function getFacets(): FacetResultCollection + { + return $this->facets; + } +} diff --git a/src/ElasticSearch/Search/Aggs/Aggs.php b/src/ElasticSearch/Search/Aggs/Aggs.php index e17f74e587053f148b862f178f4d30f15b6771bc..27096617431587518593c9a526d143a14afefcf1 100644 --- a/src/ElasticSearch/Search/Aggs/Aggs.php +++ b/src/ElasticSearch/Search/Aggs/Aggs.php @@ -13,11 +13,10 @@ final class Aggs implements Esable private ?Nested $nested = null; private ?Terms $terms = null; private ?Stats $stats = null; - private string $key; - public function __construct(string $key) - { - $this->key = $key; + public function __construct( + private string $key + ) { } public function addAggs(Aggs $aggs): self diff --git a/src/ElasticSearch/Search/Aggs/Stats.php b/src/ElasticSearch/Search/Aggs/Stats.php index 344eaf52bfbe09bcce93036f6696dfd4209abcfd..aca7ac642162322dff8c38a63df10be938487c24 100644 --- a/src/ElasticSearch/Search/Aggs/Stats.php +++ b/src/ElasticSearch/Search/Aggs/Stats.php @@ -6,11 +6,9 @@ use IQDEV\ElasticSearch\Esable; final class Stats implements Esable { - private string $field; - - public function __construct(string $field) - { - $this->field = $field; + public function __construct( + private string $field + ) { } public function es(): array diff --git a/src/ElasticSearch/Search/Aggs/Terms.php b/src/ElasticSearch/Search/Aggs/Terms.php index 20d53b781086a77d516336bd13b1283be55a698a..3397bd09db8598b6dc59e078ecba492df131b569 100644 --- a/src/ElasticSearch/Search/Aggs/Terms.php +++ b/src/ElasticSearch/Search/Aggs/Terms.php @@ -7,11 +7,10 @@ use IQDEV\ElasticSearch\Esable; final class Terms implements Esable { private array $options = []; - private string $field; - public function __construct(string $field) - { - $this->field = $field; + public function __construct( + private string $field + ) { } public function setSize(int $size): self diff --git a/src/ElasticSearch/Search/BoolQuery/FilterKeywordFacet.php b/src/ElasticSearch/Search/BoolQuery/FilterKeywordFacet.php index 3e20d970ccd3a43d7cc43e87fd5539ea8760c9fb..b781ea7c31568e7bccec6135c3254a320c7b198a 100644 --- a/src/ElasticSearch/Search/BoolQuery/FilterKeywordFacet.php +++ b/src/ElasticSearch/Search/BoolQuery/FilterKeywordFacet.php @@ -7,15 +7,14 @@ use IQDEV\ElasticSearch\Search\Nested; final class FilterKeywordFacet implements Esable { - public string $key; - - /** @var string|string[] */ - public $value; - - public function __construct(string $key, $value) - { - $this->key = $key; - $this->value = $value; + /** + * @param string $key + * @param string|array $value + */ + public function __construct( + public string $key, + public string|array $value + ) { } public function es(): array @@ -25,9 +24,8 @@ final class FilterKeywordFacet implements Esable $nested = new Nested(); $query = new Query(); - $query - ->filter(new Terms($path . '.facet_code', $this->key)) - ->filter(new Terms($path . '.facet_value', $this->value)); + $query->getFilter()->add(new Terms($path . '.facet_code', $this->key)); + $query->getFilter()->add(new Terms($path . '.facet_value', $this->value)); $nested ->setPath($path) diff --git a/src/ElasticSearch/Search/BoolQuery/FilterNumberFacet.php b/src/ElasticSearch/Search/BoolQuery/FilterNumberFacet.php index b150931864b06697d0c5f07daecd906849409dbb..3a2ab3aee1608a152fd3bd3837b617e4ad2822e0 100644 --- a/src/ElasticSearch/Search/BoolQuery/FilterNumberFacet.php +++ b/src/ElasticSearch/Search/BoolQuery/FilterNumberFacet.php @@ -3,19 +3,16 @@ namespace IQDEV\ElasticSearch\Search\BoolQuery; use IQDEV\ElasticSearch\Esable; +use IQDEV\ElasticSearch\Criteria\Filter\FilterOperator; use IQDEV\ElasticSearch\Search\Nested; -use IQDEV\Search\Filter\FilterOperator; final class FilterNumberFacet implements Esable { - public string $key; - public array $conditions; - - public function __construct(string $key, array $conditions) - { - $this->key = $key; - $this->conditions = $conditions; + public function __construct( + public string $key, + public array $conditions + ) { } public function es(): array @@ -26,32 +23,22 @@ final class FilterNumberFacet implements Esable $query = new Query(); $query - ->filter(new Stats($path.'.facet_code', $this->key)); + ->getFilter()->add(new Stats($path.'.facet_code', $this->key)); $conditions = []; foreach ($this->conditions as $operator => $value) { - switch ($operator) { - case FilterOperator::GTE: - $key = 'gte'; - break; - case FilterOperator::LTE: - $key = 'lte'; - break; - case FilterOperator::GT: - $key = 'gt'; - break; - case FilterOperator::LT: - $key = 'lt'; - break; - default: - $key = null; - break; - } + $key = in_array(FilterOperator::from($operator), [ + FilterOperator::GTE, + FilterOperator::LTE, + FilterOperator::GT, + FilterOperator::LT, + ]) ? $operator : null; + if (isset($key)) { $conditions[$key] = $value; } } - $query->filter(new Stats($path.'.facet_value', $conditions)); + $query->getFilter()->add(new Stats($path.'.facet_value', $conditions)); $nested ->setPath($path) diff --git a/src/ElasticSearch/Search/BoolQuery/Query.php b/src/ElasticSearch/Search/BoolQuery/Query.php index e027710fd38f4e1db58e547336ef24e91ed6d15f..79047bbb18b96ccbd0c332ac69c3fb2ea733ca7e 100644 --- a/src/ElasticSearch/Search/BoolQuery/Query.php +++ b/src/ElasticSearch/Search/BoolQuery/Query.php @@ -32,43 +32,34 @@ final class Query implements Esable * @param Terms|Nested $item * @return $this */ - public function match($item): self + public function getMatch(): BoolQueryCollection { - $this->match->add($item); - - return $this; + return $this->match; } - /** - * @param Terms|Nested $item - * @return $this - */ - public function must($item): self + public function getMust(): BoolQueryCollection { - $this->must->add($item); - - return $this; + return $this->must; } - public function filter(Esable $item): self + public function getFilter(): BoolQueryCollection { - $this->filter->add($item); - - return $this; + return $this->filter; } - public function should(Esable $item): self + public function setFilter(BoolQueryCollection $filter): BoolQueryCollection { - $this->should->add($item); - - return $this; + return $this->filter; } - public function mustNot(Esable $item): self + public function getShould(): BoolQueryCollection { - $this->mustNot->add($item); + return $this->should; + } - return $this; + public function getMustNot(): BoolQueryCollection + { + return $this->mustNot; } public function isEmpty(): bool @@ -127,4 +118,34 @@ final class Query implements Esable ], ]; } + + public function modify(Query $another): self + { + foreach ($another->getMust() as $item) { + $this->getMust()->add($item); + } + foreach ($another->getFilter() as $item) { + $this->getFilter()->add($item); + } + foreach ($another->getShould() as $item) { + $this->getShould()->add($item); + } + foreach ($another->getMustNot() as $item) { + $this->getMustNot()->add($item); + } + foreach ($another->getMatch() as $item) { + $this->getMatch()->add($item); + } + + return $this; + } + + public function __clone(): void + { + $this->must = clone $this->must; + $this->should = clone $this->should; + $this->filter = clone $this->filter; + $this->mustNot = clone $this->mustNot; + $this->match = clone $this->match; + } } diff --git a/src/ElasticSearch/Search/BoolQuery/Stats.php b/src/ElasticSearch/Search/BoolQuery/Stats.php index c0e54f75ed348836a5abccdb1b3ac18091041e08..5e64aca5ff7cbb4e6e2d28c5ead395006c3c8bd4 100644 --- a/src/ElasticSearch/Search/BoolQuery/Stats.php +++ b/src/ElasticSearch/Search/BoolQuery/Stats.php @@ -6,19 +6,14 @@ use IQDEV\ElasticSearch\Esable; final class Stats implements Esable { - private string $key; /** - * @var string|float|string[]|float[] + * @param string $key + * @param string|float|array $value */ - private $value; - - /** - * @param string|float|string[]|float[] $value - */ - public function __construct(string $key, $value) - { - $this->key = $key; - $this->value = $value; + public function __construct( + private string $key, + private string|float|array $value + ) { } public function es(): array diff --git a/src/ElasticSearch/Search/BoolQuery/Terms.php b/src/ElasticSearch/Search/BoolQuery/Terms.php index 8f66de974aa688219cbb9ec0beeddb56372228e4..0b135e54465c6c9818fb8eb8e91e6642fcd3bb17 100644 --- a/src/ElasticSearch/Search/BoolQuery/Terms.php +++ b/src/ElasticSearch/Search/BoolQuery/Terms.php @@ -6,19 +6,14 @@ use IQDEV\ElasticSearch\Esable; final class Terms implements Esable { - private string $key; /** - * @var string|float|string[]|float[] + * @param string $key + * @param string|float|array $value */ - private $value; - - /** - * @param string|float|string[]|float[] $value - */ - public function __construct(string $key, $value) - { - $this->key = $key; - $this->value = $value; + public function __construct( + private string $key, + private string|float|array $value + ) { } public function es(): array diff --git a/src/ElasticSearch/Search/Pagination.php b/src/ElasticSearch/Search/Pagination.php index 56832d47152e6e2d3fc9b78c3b1fe236403dfc61..5c2db67d4c0eb17c302133b96e975dc476921237 100644 --- a/src/ElasticSearch/Search/Pagination.php +++ b/src/ElasticSearch/Search/Pagination.php @@ -6,13 +6,10 @@ use IQDEV\ElasticSearch\Esable; class Pagination implements Esable { - private ?int $size; - private ?int $from; - - public function __construct(?int $size = null, ?int $from = null) - { - $this->size = $size; - $this->from = $from; + public function __construct( + private ?int $size = null, + private ?int $from = null + ) { } public function es(): array diff --git a/src/ElasticSearch/Search/Request.php b/src/ElasticSearch/Search/Request.php index 99eb6a0ed299a36c23e5e0e644b23a91849d6e2e..14e7596c6c2004b564e6d3d930b1b5a36ae48ba3 100644 --- a/src/ElasticSearch/Search/Request.php +++ b/src/ElasticSearch/Search/Request.php @@ -3,7 +3,8 @@ namespace IQDEV\ElasticSearch\Search; use IQDEV\ElasticSearch\Esable; -use IQDEV\ElasticSearch\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; @@ -14,7 +15,7 @@ final class Request implements Esable private ?AggsCollection $aggs = null; private ?Pagination $pagination = null; private ?OrderCollection $sort = null; - private array $match = []; + private ?QueryMatchCollection $matchCollection = null; private ?array $source = null; public function setPagination(?Pagination $pagination): self @@ -33,6 +34,13 @@ final class Request implements Esable return $this->query; } + public function setQuery(Query $query): self + { + $this->query = $query; + + return $this; + } + public function getPostFilter(): Query { if (null === $this->postFilter) { @@ -42,6 +50,13 @@ final class Request implements Esable return $this->postFilter; } + public function setPostFilter(Query $query): self + { + $this->postFilter = $query; + + return $this; + } + public function getAggs(): AggsCollection { if (null === $this->aggs) { @@ -51,16 +66,25 @@ final class Request implements Esable return $this->aggs; } - public function getPagination(): ?Pagination + public function setAggs(AggsCollection $aggs): self { - return $this->pagination; + $this->aggs = $aggs; + + return $this; } - public function addMatch(string $key, array $param): self + public function getQueryMatch(): QueryMatchCollection { - $this->match[$key] = $param; + if (null === $this->matchCollection) { + $this->matchCollection = new QueryMatchCollection(); + } - return $this; + return $this->matchCollection; + } + + public function getPagination(): ?Pagination + { + return $this->pagination; } public function setSource(array $s): self @@ -95,10 +119,8 @@ final class Request implements Esable $request['query'] = $this->query->es()['query']; } - if (false === empty($this->match)) { - foreach ($this->match as $key => $value) { - $request['query']['match'][$key] = $value; - } + if ($this->matchCollection && false === $this->matchCollection->isEmpty()) { + $request['query']['match'] = $this->matchCollection->es(); } if ($this->aggs) { diff --git a/src/ElasticSearch/SearchService.php b/src/ElasticSearch/SearchService.php index a1319b93712877c1e406f7866dc0ed49344a5352..356eb067c7ead5444cc7769188ee7fef0c742b4b 100644 --- a/src/ElasticSearch/SearchService.php +++ b/src/ElasticSearch/SearchService.php @@ -5,24 +5,20 @@ namespace IQDEV\ElasticSearch; use Elastic\Elasticsearch\Client; use Elastic\Elasticsearch\Exception\ClientResponseException; use Elastic\Elasticsearch\Exception\ServerResponseException; -use IQDEV\ElasticSearch\Converter\CriteriaToEsRequest; -use IQDEV\ElasticSearch\Converter\EsResponseToResult; -use IQDEV\Search\Criteria; -use IQDEV\Search\Result; +use IQDEV\ElasticSearch\Converter\Request\CriteriaToRequest; +use IQDEV\ElasticSearch\Converter\Result\EsResponseToResult; +use IQDEV\ElasticSearch\Criteria\Criteria; -class SearchService implements \IQDEV\Search\SearchService +class SearchService implements Searchable { - private Client $esClient; - private Configuration $configuration; - private CriteriaToEsRequest $criteriaToEsRequest; + private CriteriaToRequest $criteriaToRequest; private EsResponseToResult $esResponseToResult; - public function __construct(Client $esClient, Configuration $configuration) - { - $this->esClient = $esClient; - $this->configuration = $configuration; - - $this->criteriaToEsRequest = new CriteriaToEsRequest(); + public function __construct( + private Client $esClient, + private Configuration $configuration + ) { + $this->criteriaToRequest = new CriteriaToRequest($this->configuration); $this->esResponseToResult = new EsResponseToResult(); } @@ -32,7 +28,7 @@ class SearchService implements \IQDEV\Search\SearchService */ public function search(Criteria $criteria): Result { - $request = $this->criteriaToEsRequest->fromCriteria($criteria); + $request = $this->criteriaToRequest->fromCriteria($criteria); $response = $this->esClient->search([ 'index' => $this->configuration->getIndexName(), diff --git a/src/ElasticSearch/Searchable.php b/src/ElasticSearch/Searchable.php new file mode 100644 index 0000000000000000000000000000000000000000..f88a798f0e33ee7b69f532ff4f30bada6603df3e --- /dev/null +++ b/src/ElasticSearch/Searchable.php @@ -0,0 +1,15 @@ +filters()->add( - (new FilterGroupCollection([ - new Filter( - new Field('category_id'), - new FilterOperator(FilterOperator::EQ), - new FilterKeyword('t-short') - ) - ])) - ->setFilterType(FilterType::query()) + $criteria->getSearch()->add( + new Search( + new Property('category_id'), + 't-short', + ), ); $q = new SearchQuery($criteria); @@ -146,22 +142,17 @@ class AggsTest extends AbstractTestCase public function testEmptyKeywordFilter() { $criteria = new Criteria(); - - $criteria->filters()->add( - (new FilterGroupCollection([ - new Filter( - new Field('category_id'), - new FilterOperator(FilterOperator::EQ), - new FilterKeyword('t-short') - ) - ])) - ->setFilterType(FilterType::query()) + $criteria->getSearch()->add( + new Search( + new Property('category_id'), + 't-short', + ), ); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('white') ) ])); @@ -275,22 +266,16 @@ class AggsTest extends AbstractTestCase public function testRangeFilter() { $criteria = new Criteria(); - - $criteria->filters()->add( - (new FilterGroupCollection([ - new Filter( - new Field('category_id'), - new FilterOperator(FilterOperator::EQ), - new FilterKeyword('t-short') - ) - ])) - ->setFilterType(FilterType::query()) + $criteria->getSearch()->add( + new Search( + new Property('category_id'), + 't-short', + ), ); - - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::LTE), + FilterOperator::LTE, new FilterNumber(104.50) ) ])); @@ -403,30 +388,25 @@ class AggsTest extends AbstractTestCase public function testCombineFilter() { $criteria = new Criteria(); - - $criteria->filters()->add( - (new FilterGroupCollection([ - new Filter( - new Field('category_id'), - new FilterOperator(FilterOperator::EQ), - new FilterKeyword('t-short') - ) - ])) - ->setFilterType(FilterType::query()) + $criteria->getSearch()->add( + new Search( + new Property('category_id'), + 't-short', + ), ); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('black') ) ])); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::LTE), + FilterOperator::LTE, new FilterNumber(104) ) ])); @@ -538,30 +518,25 @@ class AggsTest extends AbstractTestCase public function testCombineFilterTwo() { $criteria = new Criteria(); - - $criteria->filters()->add( - (new FilterGroupCollection([ - new Filter( - new Field('category_id'), - new FilterOperator(FilterOperator::EQ), - new FilterKeyword('t-short') - ) - ])) - ->setFilterType(FilterType::query()) + $criteria->getSearch()->add( + new Search( + new Property('category_id'), + 't-short', + ), ); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('red') ) ])); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::LTE), + FilterOperator::LTE, new FilterNumber(105) ) ])); @@ -675,38 +650,33 @@ class AggsTest extends AbstractTestCase public function testKeywordFilter() { $criteria = new Criteria(); - - $criteria->filters()->add( - (new FilterGroupCollection([ - new Filter( - new Field('category_id'), - new FilterOperator(FilterOperator::EQ), - new FilterKeyword('t-short') - ) - ])) - ->setFilterType(FilterType::query()) + $criteria->getSearch()->add( + new Search( + new Property('category_id'), + 't-short', + ), ); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('white') ) ])); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('nike') ) ])); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::GT), + FilterOperator::GT, new FilterNumber(100) ) ])); @@ -820,40 +790,35 @@ class AggsTest extends AbstractTestCase public function testKeywordFilterTwo() { $criteria = new Criteria(); - - $criteria->filters()->add( - (new FilterGroupCollection([ - new Filter( - new Field('category_id'), - new FilterOperator(FilterOperator::EQ), - new FilterKeyword('t-short') - ) - ])) - ->setFilterType(FilterType::query()) + $criteria->getSearch()->add( + new Search( + new Property('category_id'), + 't-short', + ), ); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('white') ) ])); - $criteria->filters()->add( + $criteria->getFilters()->add( (new FilterGroupCollection([ new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('nike') ), new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('reebok') ) ])) - ->setLogicalType(LogicOperator::or()) + ->setLogicOperator(LogicOperator::OR) ); diff --git a/tests/FIlter/CommonRangeKeywordsTest.php b/tests/Filter/CommonRangeKeywordsTest.php similarity index 71% rename from tests/FIlter/CommonRangeKeywordsTest.php rename to tests/Filter/CommonRangeKeywordsTest.php index 2ced2c2e97123dcfb1d7b5ce105c4ea468947b22..681dd4100c5015ae4af5dbe3b78154c33686e5d9 100644 --- a/tests/FIlter/CommonRangeKeywordsTest.php +++ b/tests/Filter/CommonRangeKeywordsTest.php @@ -1,18 +1,18 @@ filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('red') ) ])); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::GT), + FilterOperator::GT, new FilterNumber(102) ) ])); @@ -65,18 +65,18 @@ class CommonRangeKeywordsTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('red') ) ])); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::LT), + FilterOperator::LT, new FilterNumber(102) ) ])); @@ -105,23 +105,23 @@ class CommonRangeKeywordsTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('red') ) ])); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::GTE), + FilterOperator::GTE, new FilterNumber(101) ), new Filter( new Field('price'), - new FilterOperator(FilterOperator::LTE), + FilterOperator::LTE, new FilterNumber(104) ), ])); diff --git a/tests/FIlter/IndexesTest.php b/tests/Filter/IndexesTest.php similarity index 95% rename from tests/FIlter/IndexesTest.php rename to tests/Filter/IndexesTest.php index b5aaa98c677a743793d517f07862a9b4c305cf09..9745f9e7d9dfc2d5de64fede77183f624d449705 100644 --- a/tests/FIlter/IndexesTest.php +++ b/tests/Filter/IndexesTest.php @@ -4,14 +4,14 @@ namespace IQDEV\ElasticSearchTests\Filter; use Elastic\Elasticsearch\Client; 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; use IQDEV\ElasticSearchTests\Factory\ClientFactory; use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Helpers\TestIndexProvider; -use Psr\Log\Test\TestLogger; +use Psr\Log\NullLogger; class IndexesTest extends AbstractTestCase { @@ -40,7 +40,7 @@ class IndexesTest extends AbstractTestCase $this->indexRunner = new IndexRunner( $this->esClient, $this->configuration, - new TestLogger() + new NullLogger() ); } diff --git a/tests/FIlter/KeywordsTest.php b/tests/Filter/KeywordsTest.php similarity index 71% rename from tests/FIlter/KeywordsTest.php rename to tests/Filter/KeywordsTest.php index 51acdf6439db9efcb44b2185821597160eeade5f..3f6064b43cb9b30918b1c9c1c675cd51f976ecb3 100644 --- a/tests/FIlter/KeywordsTest.php +++ b/tests/Filter/KeywordsTest.php @@ -2,17 +2,18 @@ namespace IQDEV\ElasticSearchTests\Filter; +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\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Service\SearchClient; -use IQDEV\Search\Criteria; -use IQDEV\Search\Filter\Field; -use IQDEV\Search\Filter\Filter; -use IQDEV\Search\Filter\FilterGroupCollection; -use IQDEV\Search\Filter\FilterKeyword; -use IQDEV\Search\Filter\FilterOperator; -use IQDEV\Search\Filter\FilterType; -use IQDEV\Search\Query\SearchQuery; class KeywordsTest extends AbstractTestCase { @@ -25,10 +26,10 @@ class KeywordsTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('') ) ])); @@ -55,10 +56,10 @@ class KeywordsTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('red') ) ])); @@ -87,22 +88,17 @@ class KeywordsTest extends AbstractTestCase public function testExistByFilterAndCategory(): void { $criteria = new Criteria(); - - $criteria->filters()->add( - (new FilterGroupCollection([ - new Filter( - new Field('category_id'), - new FilterOperator(FilterOperator::EQ), - new FilterKeyword('shoes') - ) - ])) - ->setFilterType(FilterType::query()) + $criteria->getSearch()->add( + new Search( + new Property('category_id'), + 'shoes', + ), ); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('red') ) ])); @@ -131,15 +127,15 @@ class KeywordsTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('red') ), new Filter( new Field('size'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('xxl') ) ])); @@ -166,15 +162,15 @@ class KeywordsTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('red') ), new Filter( new Field('size'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('xl') ) ])); @@ -203,26 +199,22 @@ class KeywordsTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add( - (new FilterGroupCollection([ - new Filter( - new Field('category_id'), - new FilterOperator(FilterOperator::EQ), - new FilterKeyword('prices') - ) - ])) - ->setFilterType(FilterType::query()) + $criteria->getSearch()->add( + new Search( + new Property('category_id'), + 'prices', + ), ); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('red') ), new Filter( new Field('size'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('xl') ) ])); diff --git a/tests/FIlter/QueryAndPostFilterTest.php b/tests/Filter/QueryAndPostFilterTest.php similarity index 90% rename from tests/FIlter/QueryAndPostFilterTest.php rename to tests/Filter/QueryAndPostFilterTest.php index dcf6fffb2faa9e66555dc7e7dd411625da909532..8ad528d3dc15745785881c553b2a537ea4454f6c 100644 --- a/tests/FIlter/QueryAndPostFilterTest.php +++ b/tests/Filter/QueryAndPostFilterTest.php @@ -2,19 +2,19 @@ namespace IQDEV\ElasticSearchTests\Filter; +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; -use IQDEV\Search\Criteria; -use IQDEV\Search\Filter\Field; -use IQDEV\Search\Filter\Filter; -use IQDEV\Search\Filter\FilterGroupCollection; -use IQDEV\Search\Filter\FilterKeyword; -use IQDEV\Search\Filter\FilterNumber; -use IQDEV\Search\Filter\FilterOperator; -use IQDEV\Search\Filter\FilterType; -use IQDEV\Search\Filter\LogicOperator; -use IQDEV\Search\Query\SearchQuery; class QueryAndPostFilterTest extends AbstractTestCase { @@ -28,12 +28,12 @@ class QueryAndPostFilterTest extends AbstractTestCase $filterCollectionBrand = new FilterGroupCollection([ new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('not') ) ]); - $filterCollectionBrand->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionBrand); + $filterCollectionBrand->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionBrand); $q = new SearchQuery($criteria); @@ -59,12 +59,12 @@ class QueryAndPostFilterTest extends AbstractTestCase $filterCollectionBrand = new FilterGroupCollection([ new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('adidas') ) ]); - $filterCollectionBrand->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionBrand); + $filterCollectionBrand->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionBrand); $q = new SearchQuery($criteria); @@ -177,28 +177,28 @@ class QueryAndPostFilterTest extends AbstractTestCase $filterCollectionBrand = new FilterGroupCollection([ new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('adidas') ), new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('nike') ), ]); $filterCollectionBrand - ->setLogicalType(LogicOperator::or()) - ->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionBrand); + ->setLogicOperator(LogicOperator::OR) + ->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionBrand); $filterCollectionBrand = new FilterGroupCollection([ new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('nike') ), ]); - $criteria->filters()->add($filterCollectionBrand); + $criteria->getFilters()->add($filterCollectionBrand); $q = new SearchQuery($criteria); @@ -342,23 +342,23 @@ class QueryAndPostFilterTest extends AbstractTestCase $filterCollectionBrand = new FilterGroupCollection([ new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('nike') ), ]); $filterCollectionBrand - ->setLogicalType(LogicOperator::or()) - ->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionBrand); + ->setLogicOperator(LogicOperator::OR) + ->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionBrand); $filterCollectionColor = new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('white') ), ]); - $criteria->filters()->add($filterCollectionColor); + $criteria->getFilters()->add($filterCollectionColor); $q = new SearchQuery($criteria); @@ -482,38 +482,38 @@ class QueryAndPostFilterTest extends AbstractTestCase $filterCollectionBrand = new FilterGroupCollection([ new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('nike') ), new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('rebook') ), ]); $filterCollectionBrand - ->setLogicalType(LogicOperator::or()) - ->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionBrand); + ->setLogicOperator(LogicOperator::OR) + ->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionBrand); $filterCollectionColor = new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('white') ), ]); - $filterCollectionColor->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionColor); + $filterCollectionColor->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionColor); $filterCollectionBrand = new FilterGroupCollection([ new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('nike') ), ]); - $criteria->filters()->add($filterCollectionBrand); + $criteria->getFilters()->add($filterCollectionBrand); $q = new SearchQuery($criteria); @@ -625,39 +625,38 @@ class QueryAndPostFilterTest extends AbstractTestCase $filterCollectionBrand = new FilterGroupCollection([ new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('nike') ), new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('rebook') ), ]); $filterCollectionBrand - ->setLogicalType(LogicOperator::or()) - ->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionBrand); + ->setLogicOperator(LogicOperator::OR) + ->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionBrand); $filterCollectionBrand = new FilterGroupCollection([ new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('nike') ), ]); - $criteria->filters()->add($filterCollectionBrand); + $criteria->getFilters()->add($filterCollectionBrand); $filterCollectionColor = new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('red') ), ]); - $criteria->filters()->add($filterCollectionColor); - + $criteria->getFilters()->add($filterCollectionColor); $q = new SearchQuery($criteria); $handler = SearchClient::getInstance(); @@ -798,12 +797,12 @@ class QueryAndPostFilterTest extends AbstractTestCase $filterCollectionPrice = new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::GTE), + FilterOperator::GTE, new FilterNumber(108) ) ]); - $filterCollectionPrice->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionPrice); + $filterCollectionPrice->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionPrice); $q = new SearchQuery($criteria); @@ -829,12 +828,12 @@ class QueryAndPostFilterTest extends AbstractTestCase $filterCollectionPrice = new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::GTE), + FilterOperator::GTE, new FilterNumber(105) ) ]); - $filterCollectionPrice->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionPrice); + $filterCollectionPrice->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionPrice); $q = new SearchQuery($criteria); @@ -948,17 +947,17 @@ class QueryAndPostFilterTest extends AbstractTestCase $filterCollection = new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::GTE), + FilterOperator::GTE, new FilterNumber(104) ), new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('nike') ), ]); - $filterCollection->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollection); + $filterCollection->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollection); $q = new SearchQuery($criteria); $handler = SearchClient::getInstance(); @@ -1070,26 +1069,26 @@ class QueryAndPostFilterTest extends AbstractTestCase $filterCollection = new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::GTE), + FilterOperator::GTE, new FilterNumber(104) ), new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('nike') ), ]); - $filterCollection->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollection); + $filterCollection->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollection); $filterCollectionColor = new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('red') ), ]); - $criteria->filters()->add($filterCollectionColor); + $criteria->getFilters()->add($filterCollectionColor); $q = new SearchQuery($criteria); $handler = SearchClient::getInstance(); @@ -1200,48 +1199,48 @@ class QueryAndPostFilterTest extends AbstractTestCase $filterCollectionPrice = new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::LTE), + FilterOperator::LTE, new FilterNumber(104) ), ]); - $filterCollectionPrice->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionPrice); + $filterCollectionPrice->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionPrice); $filterCollectionBrand = new FilterGroupCollection([ new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('nike') ), new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('adidas') ), ]); $filterCollectionBrand - ->setLogicalType(LogicOperator::or()) - ->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionBrand); + ->setLogicOperator(LogicOperator::OR) + ->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionBrand); $filterCollectionColor = new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('green') ), ]); - $criteria->filters()->add($filterCollectionColor); + $criteria->getFilters()->add($filterCollectionColor); $filterCollectionBrand = new FilterGroupCollection([ new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('nike') ), ]); - $criteria->filters()->add($filterCollectionBrand); + $criteria->getFilters()->add($filterCollectionBrand); $q = new SearchQuery($criteria); @@ -1371,39 +1370,39 @@ class QueryAndPostFilterTest extends AbstractTestCase $filterCollectionPrice = new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::LTE), + FilterOperator::LTE, new FilterNumber(104) ), ]); - $filterCollectionPrice->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionPrice); + $filterCollectionPrice->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionPrice); $filterCollectionBrand = new FilterGroupCollection([ new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('nike') ), new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('adidas') ), ]); $filterCollectionBrand - ->setLogicalType(LogicOperator::or()) - ->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionBrand); + ->setLogicOperator(LogicOperator::OR) + ->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionBrand); $filterCollectionPrice = new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::GTE), + FilterOperator::GTE, new FilterNumber(102) ), ]); - $criteria->filters()->add($filterCollectionPrice); + $criteria->getFilters()->add($filterCollectionPrice); $q = new SearchQuery($criteria); @@ -1534,48 +1533,48 @@ class QueryAndPostFilterTest extends AbstractTestCase $filterCollectionPrice = new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::LTE), + FilterOperator::LTE, new FilterNumber(104) ), ]); - $filterCollectionPrice->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionPrice); + $filterCollectionPrice->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionPrice); $filterCollectionBrand = new FilterGroupCollection([ new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('nike') ), new Filter( new Field('brand'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('adidas') ), ]); $filterCollectionBrand - ->setLogicalType(LogicOperator::or()) - ->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionBrand); + ->setLogicOperator(LogicOperator::OR) + ->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionBrand); $filterCollectionPrice = new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::GTE), + FilterOperator::GTE, new FilterNumber(101) ), ]); - $criteria->filters()->add($filterCollectionPrice); + $criteria->getFilters()->add($filterCollectionPrice); $filterCollectionColor = new FilterGroupCollection([ new Filter( new Field('color'), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword('green') ), ]); - $criteria->filters()->add($filterCollectionColor); + $criteria->getFilters()->add($filterCollectionColor); $q = new SearchQuery($criteria); diff --git a/tests/FIlter/QueryTest.php b/tests/Filter/QueryTest.php similarity index 86% rename from tests/FIlter/QueryTest.php rename to tests/Filter/QueryTest.php index df79ee2efa0e7442b0a0b33283db5e83f8d4a8da..9c903aa7bd8aa0127d68b64d40403cb1e3da70fa 100644 --- a/tests/FIlter/QueryTest.php +++ b/tests/Filter/QueryTest.php @@ -2,19 +2,22 @@ namespace IQDEV\ElasticSearchTests\Filter; -use IQDEV\ElasticSearch\Converter\CriteriaToEsRequest; +use IQDEV\ElasticSearch\Config\BaseConfiguration; +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\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Service\SearchClient; -use IQDEV\Search\Criteria; -use IQDEV\Search\Filter\Field; -use IQDEV\Search\Filter\Filter; -use IQDEV\Search\Filter\FilterGroupCollection; -use IQDEV\Search\Filter\FilterKeyword; -use IQDEV\Search\Filter\FilterNumber; -use IQDEV\Search\Filter\FilterOperator; -use IQDEV\Search\Filter\FilterType; -use IQDEV\Search\Query\SearchQuery; /** * Тестирование агрегирующих функций @@ -23,11 +26,14 @@ class QueryTest extends AbstractTestCase { public function testFilterChangeFromPostToQuery() { - $filter = [ + $search = [ 'category' => [ 'key' => 'category_id', 'value' => 'shoes', ], + ]; + + $filter = [ 'brand' => [ 'key' => 'brand', 'value' => 'nike', @@ -40,22 +46,21 @@ class QueryTest extends AbstractTestCase ]; $criteria = new Criteria(); + $criteria->getSearch()->add( + new Search( + new Property($search['category']['key']), + $search['category']['value'], + ), + ); - - $filterCollectionCategory = new FilterGroupCollection([ - new Filter( - new Field($filter['category']['key']), - new FilterOperator(FilterOperator::EQ), - new FilterKeyword($filter['category']['value']) - ) - ]); - $filterCollectionCategory->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionCategory); + $filterCollectionCategory = new FilterGroupCollection(); + $filterCollectionCategory->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionCategory); $filterCollectionBrand = new FilterGroupCollection([ new Filter( new Field($filter['brand']['key']), - new FilterOperator(FilterOperator::EQ), + FilterOperator::EQ, new FilterKeyword($filter['brand']['value']) ) ]); @@ -63,37 +68,36 @@ class QueryTest extends AbstractTestCase $filterCollectionPrice = new FilterGroupCollection([ new Filter( new Field($filter['price']['key']), - new FilterOperator(FilterOperator::LT), + FilterOperator::LT, new FilterNumber($filter['price']['min']) ), new Filter( new Field($filter['price']['key']), - new FilterOperator(FilterOperator::GT), + FilterOperator::GT, new FilterNumber($filter['price']['max']) ), ]); // Формирование фильтра для post $criteriaPost = clone $criteria; - $criteriaPost->filters()->add(clone $filterCollectionPrice); - $criteriaPost->filters()->add(clone $filterCollectionBrand); + $criteriaPost->getFilters()->add(clone $filterCollectionPrice); + $criteriaPost->getFilters()->add(clone $filterCollectionBrand); // Формирование фильтра для query $criteriaQuery = clone $criteria; - $filterTypeQuery = FilterType::query(); + $filterTypeQuery = FilterType::QUERY; $filterCollectionPrice->setFilterType($filterTypeQuery); $filterCollectionBrand->setFilterType($filterTypeQuery); - $criteriaQuery->filters()->add(clone $filterCollectionPrice); - $criteriaQuery->filters()->add(clone $filterCollectionBrand); + $criteriaQuery->getFilters()->add(clone $filterCollectionPrice); + $criteriaQuery->getFilters()->add(clone $filterCollectionBrand); // Получение классов с данными для запроса в es - $criteriaToEsRequest = new CriteriaToEsRequest(); - $requestPost = $criteriaToEsRequest->fromCriteria($criteriaPost); - $requestQuery = $criteriaToEsRequest->fromCriteria($criteriaQuery); - + $criteriaToRequest = new CriteriaToRequest(new BaseConfiguration()); + $requestPost = $criteriaToRequest->fromCriteria($criteriaPost); + $requestQuery = $criteriaToRequest->fromCriteria($criteriaQuery); $expectedFilter = [ [ @@ -104,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'], + ] ] ] ] @@ -136,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'] ] ] ] @@ -162,7 +166,7 @@ class QueryTest extends AbstractTestCase ] ] ] - ] + ], ]; $expected = [ "query" => [ @@ -170,7 +174,7 @@ class QueryTest extends AbstractTestCase "must" => [ [ "term" => [ - "category_id" => $filter['category']['value'] + "category_id" => $search['category']['value'] ] ], ] @@ -178,7 +182,6 @@ class QueryTest extends AbstractTestCase ], ]; - $this->assertArray( array_merge($expected, [ "query" => [ @@ -222,31 +225,31 @@ class QueryTest extends AbstractTestCase $filterCollectionPrice = new FilterGroupCollection([ new Filter( new Field($filter['price']['key']), - new FilterOperator(FilterOperator::LT), + FilterOperator::LT, new FilterNumber($filter['price']['min']) ), new Filter( new Field($filter['price']['key']), - new FilterOperator(FilterOperator::GT), + FilterOperator::GT, new FilterNumber($filter['price']['max']) ), ]); - $criteria->filters()->add($filterCollectionPrice); + $criteria->getFilters()->add($filterCollectionPrice); $filterCollectionQueryPrice = new FilterGroupCollection([ new Filter( new Field($filter['price']['key']), - new FilterOperator(FilterOperator::LT), + FilterOperator::LT, new FilterNumber($filter['price']['lower']) ), ]); - $filterCollectionQueryPrice->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionQueryPrice); + $filterCollectionQueryPrice->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionQueryPrice); - $criteriaToEsRequest = new CriteriaToEsRequest(); - $request = $criteriaToEsRequest->fromCriteria($criteria); + $criteriaToRequest = new CriteriaToRequest(new BaseConfiguration()); + $request = $criteriaToRequest->fromCriteria($criteria); $expected = [ @@ -352,22 +355,22 @@ class QueryTest extends AbstractTestCase $filterCollectionPrice = new FilterGroupCollection([ new Filter( new Field($filter['price']['key']), - new FilterOperator(FilterOperator::GTE), + FilterOperator::GTE, new FilterNumber($filter['price']['min']) ) ]); - $criteria->filters()->add($filterCollectionPrice); + $criteria->getFilters()->add($filterCollectionPrice); $filterCollectionQueryPrice = new FilterGroupCollection([ new Filter( new Field($filter['price']['key']), - new FilterOperator(FilterOperator::GTE), + FilterOperator::GTE, new FilterNumber($filter['price']['lower']) ), ]); - $filterCollectionQueryPrice->setFilterType(FilterType::query()); - $criteria->filters()->add($filterCollectionQueryPrice); + $filterCollectionQueryPrice->setFilterType(FilterType::QUERY); + $criteria->getFilters()->add($filterCollectionQueryPrice); $q = new SearchQuery($criteria); diff --git a/tests/FIlter/RangeTest.php b/tests/Filter/RangeTest.php similarity index 81% rename from tests/FIlter/RangeTest.php rename to tests/Filter/RangeTest.php index b9f6726439c3ef77184c23ac0867f166a2d76055..3d8f0afb68698a28398907b6c3d376b029d77059 100644 --- a/tests/FIlter/RangeTest.php +++ b/tests/Filter/RangeTest.php @@ -2,16 +2,16 @@ namespace IQDEV\ElasticSearchTests\Filter; +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; -use IQDEV\Search\Criteria; -use IQDEV\Search\Filter\Field; -use IQDEV\Search\Filter\Filter; -use IQDEV\Search\Filter\FilterGroupCollection; -use IQDEV\Search\Filter\FilterNumber; -use IQDEV\Search\Filter\FilterOperator; -use IQDEV\Search\Query\SearchQuery; class RangeTest extends AbstractTestCase { @@ -24,10 +24,10 @@ class RangeTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::GTE), + FilterOperator::GTE, new FilterNumber(103) ), ])); @@ -60,10 +60,10 @@ class RangeTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::GT), + FilterOperator::GT, new FilterNumber(103.01) ), ])); @@ -95,10 +95,10 @@ class RangeTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::GT), + FilterOperator::GT, new FilterNumber(102.99) ), ])); @@ -131,10 +131,10 @@ class RangeTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::LTE), + FilterOperator::LTE, new FilterNumber(102) ), ])); @@ -165,10 +165,10 @@ class RangeTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::LT), + FilterOperator::LT, new FilterNumber(102.99) ), ])); @@ -199,10 +199,10 @@ class RangeTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::LT), + FilterOperator::LT, new FilterNumber(101.99) ), ])); @@ -232,15 +232,15 @@ class RangeTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::GTE), + FilterOperator::GTE, new FilterNumber(101) ), new Filter( new Field('price'), - new FilterOperator(FilterOperator::LTE), + FilterOperator::LTE, new FilterNumber(102) ), ])); @@ -270,15 +270,15 @@ class RangeTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::GTE), + FilterOperator::GTE, new FilterNumber(101.01) ), new Filter( new Field('price'), - new FilterOperator(FilterOperator::LTE), + FilterOperator::LTE, new FilterNumber(102) ), ])); @@ -307,15 +307,15 @@ class RangeTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::GTE), + FilterOperator::GTE, new FilterNumber(101) ), new Filter( new Field('price'), - new FilterOperator(FilterOperator::LTE), + FilterOperator::LTE, new FilterNumber(101.99) ), ])); @@ -344,15 +344,15 @@ class RangeTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add(new FilterGroupCollection([ + $criteria->getFilters()->add(new FilterGroupCollection([ new Filter( new Field('price'), - new FilterOperator(FilterOperator::GTE), + FilterOperator::GTE, new FilterNumber(101.99) ), new Filter( new Field('price'), - new FilterOperator(FilterOperator::LTE), + FilterOperator::LTE, new FilterNumber(101.99) ), ])); diff --git a/tests/FIlter/SearchItemsTest.php b/tests/Filter/SearchItemsTest.php similarity index 64% rename from tests/FIlter/SearchItemsTest.php rename to tests/Filter/SearchItemsTest.php index 7f53c9173351c4b1dcb10f0e57e5e8cd038f7ba4..2b20a542a47e968ab9f60418fed24d74a48b9347 100644 --- a/tests/FIlter/SearchItemsTest.php +++ b/tests/Filter/SearchItemsTest.php @@ -2,17 +2,14 @@ namespace IQDEV\ElasticSearchTests\Filter; +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\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Service\SearchClient; -use IQDEV\Search\Criteria; -use IQDEV\Search\Filter\Field; -use IQDEV\Search\Filter\Filter; -use IQDEV\Search\Filter\FilterGroupCollection; -use IQDEV\Search\Filter\FilterKeyword; -use IQDEV\Search\Filter\FilterOperator; -use IQDEV\Search\Filter\FilterType; -use IQDEV\Search\Query\SearchQuery; class SearchItemsTest extends AbstractTestCase { @@ -24,16 +21,11 @@ class SearchItemsTest extends AbstractTestCase public function testExistByCategory(): void { $criteria = new Criteria(); - - $criteria->filters()->add( - (new FilterGroupCollection([ - new Filter( - new Field('category_id'), - new FilterOperator(FilterOperator::EQ), - new FilterKeyword('prices') - ) - ])) - ->setFilterType(FilterType::query()) + $criteria->getSearch()->add( + new Search( + new Property('category_id'), + 'prices' + ) ); $q = new SearchQuery($criteria); @@ -60,15 +52,11 @@ class SearchItemsTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add( - (new FilterGroupCollection([ - new Filter( - new Field('category_id'), - new FilterOperator(FilterOperator::EQ), - new FilterKeyword('') - ) - ])) - ->setFilterType(FilterType::query()) + $criteria->getSearch()->add( + new Search( + new Property('category_id'), + '', + ) ); $q = new SearchQuery($criteria); @@ -124,15 +112,11 @@ class SearchItemsTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add( - (new FilterGroupCollection([ - new Filter( - new Field('search'), - new FilterOperator(FilterOperator::EQ), - new FilterKeyword('Nike') - ) - ])) - ->setFilterType(FilterType::query()) + $criteria->getSearch()->add( + new Search( + new Property('full_search_content', PropertyType::TEXT), + 'Nike' + ) ); $q = new SearchQuery($criteria); @@ -161,15 +145,11 @@ class SearchItemsTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add( - (new FilterGroupCollection([ - new Filter( - new Field('search'), - new FilterOperator(FilterOperator::EQ), - new FilterKeyword('Nike Dri-FIT Strike') - ) - ])) - ->setFilterType(FilterType::query()) + $criteria->getSearch()->add( + new Search( + new Property('full_search_content', PropertyType::TEXT), + 'Nike Dri-FIT Strike', + ), ); $q = new SearchQuery($criteria); @@ -198,15 +178,11 @@ class SearchItemsTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->filters()->add( - (new FilterGroupCollection([ - new Filter( - new Field('search'), - new FilterOperator(FilterOperator::EQ), - new FilterKeyword('Товар с ценой') - ) - ])) - ->setFilterType(FilterType::query()) + $criteria->getSearch()->add( + new Search( + new Property('full_search_content', PropertyType::TEXT), + 'Товар с ценой', + ), ); $q = new SearchQuery($criteria); @@ -214,7 +190,6 @@ class SearchItemsTest extends AbstractTestCase $handler = SearchClient::getInstance(); $result = $handler->handle($q)->result; - $expected = [ 'hits' => [ 'p1', @@ -223,4 +198,4 @@ class SearchItemsTest extends AbstractTestCase $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result)); } -} \ No newline at end of file +} diff --git a/tests/FIlter/SortTest.php b/tests/Filter/SortTest.php similarity index 78% rename from tests/FIlter/SortTest.php rename to tests/Filter/SortTest.php index a7a28d9f43ebe856774824af911efa08b5f758b3..653f7ba7ac4741ce2259e565c4c7bc31ffa2f1af 100644 --- a/tests/FIlter/SortTest.php +++ b/tests/Filter/SortTest.php @@ -2,16 +2,15 @@ namespace IQDEV\ElasticSearchTests\Filter; +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\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Service\SearchClient; -use IQDEV\Search\Criteria; -use IQDEV\Search\Document\Property\AttrType; -use IQDEV\Search\Document\Property\PropertyType; -use IQDEV\Search\Order\Order; -use IQDEV\Search\Order\OrderAscType; -use IQDEV\Search\Order\OrderDescType; -use IQDEV\Search\Query\SearchQuery; class SortTest extends AbstractTestCase { @@ -24,10 +23,9 @@ class SortTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->sorting()->add(new Order( - new AttrType('category_id'), - new OrderAscType(), - )); + $criteria->getSorting()->add( + OrderFactory::createByProperty(new Property('category_id'), OrderDirection::ASC) + ); $q = new SearchQuery($criteria); @@ -60,10 +58,9 @@ class SortTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->sorting()->add(new Order( - new AttrType('category_id'), - new OrderDescType(), - )); + $criteria->getSorting()->add( + OrderFactory::createByProperty(new Property('category_id'), OrderDirection::DESC) + ); $q = new SearchQuery($criteria); @@ -96,10 +93,9 @@ class SortTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->sorting()->add(new Order( - new PropertyType('color', PropertyType::TYPE_KEYWORD), - new OrderAscType(), - )); + $criteria->getSorting()->add( + OrderFactory::createByProperty(new Property('color', PropertyType::KEYWORD), OrderDirection::ASC) + ); $q = new SearchQuery($criteria); @@ -132,10 +128,9 @@ class SortTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->sorting()->add(new Order( - new PropertyType('color', PropertyType::TYPE_KEYWORD), - new OrderDescType(), - )); + $criteria->getSorting()->add( + OrderFactory::createByProperty(new Property('color', PropertyType::KEYWORD), OrderDirection::DESC) + ); $q = new SearchQuery($criteria); @@ -168,10 +163,9 @@ class SortTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->sorting()->add(new Order( - new PropertyType('price', PropertyType::TYPE_NUMBER), - new OrderAscType(), - )); + $criteria->getSorting()->add( + OrderFactory::createByProperty(new Property('price', PropertyType::NUMBER), OrderDirection::ASC) + ); $q = new SearchQuery($criteria); @@ -204,10 +198,9 @@ class SortTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->sorting()->add(new Order( - new PropertyType('price', PropertyType::TYPE_NUMBER), - new OrderDescType(), - )); + $criteria->getSorting()->add( + OrderFactory::createByProperty(new Property('price', PropertyType::NUMBER), OrderDirection::DESC) + ); $q = new SearchQuery($criteria); @@ -240,10 +233,9 @@ class SortTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->sorting()->add(new Order( - new PropertyType('size', PropertyType::TYPE_KEYWORD), - new OrderAscType(), - )); + $criteria->getSorting()->add( + OrderFactory::createByProperty(new Property('size', PropertyType::KEYWORD), OrderDirection::ASC) + ); $q = new SearchQuery($criteria); @@ -276,10 +268,9 @@ class SortTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->sorting()->add(new Order( - new PropertyType('size', PropertyType::TYPE_KEYWORD), - new OrderDescType(), - )); + $criteria->getSorting()->add( + OrderFactory::createByProperty(new Property('size', PropertyType::KEYWORD), OrderDirection::DESC) + ); $q = new SearchQuery($criteria); diff --git a/tests/Filter/UpdatedSearchTest.php b/tests/Filter/UpdatedSearchTest.php new file mode 100644 index 0000000000000000000000000000000000000000..d3a1ccb07b7eb728b8848e5951a54dc2153ba303 --- /dev/null +++ b/tests/Filter/UpdatedSearchTest.php @@ -0,0 +1,296 @@ +getSearch()->add( + new Search( + new Property('brand'), + 'rebook', + ), + ); + + $q = new SearchQuery($criteria); + + $handler = SearchClient::getInstance(); + $result = $handler->handle($q)->result; + + $expected = [ + 'hits' => [ + 's3', + 'h3', + 'p1' + ] + ]; + + $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result)); + } + + /** + * Поиск по nested полю и обычному свойству одноврмененно + * + * @return void + */ + public function testSearchByNestedAndNonNestedProperty(): void + { + $criteria = new Criteria(); + + $criteria->getSearch()->add( + new Search( + new Property('brand'), + 'rebook', + ), + ); + + $criteria->getSearch()->add( + new Search( + new Property('category_id'), + 'prices', + ), + ); + + $q = new SearchQuery($criteria); + + $handler = SearchClient::getInstance(); + $result = $handler->handle($q)->result; + + $expected = [ + 'hits' => [ + 'p1' + ] + ]; + + $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result)); + } + + /** + * Поиск по нескольким nested полям + * + * @return void + */ + public function testSearchByDifferentNestedProperty(): void + { + $criteria = new Criteria(); + + $criteria->getSearch()->add( + new Search( + new Property('brand'), + 'rebook', + ), + ); + + $criteria->getSearch()->add( + new Search( + new Property('color'), + 'white', + ), + ); + + $q = new SearchQuery($criteria); + + $handler = SearchClient::getInstance(); + $result = $handler->handle($q)->result; + + $expected = [ + 'hits' => [ + 'h3', + 'p1' + ] + ]; + + $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result)); + } + + public function testQueryNonNested(): void + { + $criteria = new Criteria(); + + $filterCollection = new FilterGroupCollection([ + new Filter( + new Field('category_id'), + FilterOperator::CONTAINS, + new FilterKeyword('shoes'), + ) + ]); + $criteria->getFilters()->add($filterCollection); + + $q = new SearchQuery($criteria); + + $handler = SearchClient::getInstance(); + $result = $handler->handle($q)->result; + + $expected = [ + 'hits' => [ + 's1', + 's2', + 's3', + 's4', + ] + ]; + + $this->assertEqualsCanonicalizing($expected, FormatData::formatData($result)); + } + + public function testQueryNonNestedMoreLogicOr(): void + { + $criteria = new Criteria(); + + $filterCollection = new FilterGroupCollection([ + new Filter( + new Field('category_id'), + FilterOperator::CONTAINS, + new FilterKeyword('shoes'), + ), + new Filter( + new Field('category_id'), + FilterOperator::CONTAINS, + new FilterKeyword('t-short'), + ), + ]); + $filterCollection->setLogicOperator(LogicOperator::OR); + $criteria->getFilters()->add($filterCollection); + + $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)); + } + + public function testQueryNonNestedMoreLogicAnd(): void + { + $criteria = new Criteria(); + + $filterCollection = new FilterGroupCollection([ + new Filter( + new Field('category_id'), + FilterOperator::CONTAINS, + new FilterKeyword('shoes'), + ), + new Filter( + new Field('category_id'), + FilterOperator::CONTAINS, + new FilterKeyword('t-short'), + ), + ]); + $criteria->getFilters()->add($filterCollection); + + $q = new SearchQuery($criteria); + + $handler = SearchClient::getInstance(); + $result = $handler->handle($q)->result; + + $expected = [ + 'hits' => [ + ] + ]; + + $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/Helpers/FormatData.php b/tests/Helpers/FormatData.php index f042c9a1dddcb40e5642e45c755a2a227f0d9c8f..233bcced7e1cbfec7a1e0e3d4d2b8293a82acfd4 100644 --- a/tests/Helpers/FormatData.php +++ b/tests/Helpers/FormatData.php @@ -2,13 +2,11 @@ namespace IQDEV\ElasticSearchTests\Helpers; -use IQDEV\Search\Document\Product; -use IQDEV\Search\Facet\Facet; -use IQDEV\Search\Facet\Item\FacetItemList; -use IQDEV\Search\Facet\Item\FacetItemRange; -use IQDEV\Search\Facet\Type\FacetListType; -use IQDEV\Search\Facet\Type\FacetRangeType; -use IQDEV\Search\Result; +use IQDEV\ElasticSearch\Document\Product; +use IQDEV\ElasticSearch\Facet\FacetResult; +use IQDEV\ElasticSearch\Facet\Item\FacetItemList; +use IQDEV\ElasticSearch\Facet\Item\FacetItemRange; +use IQDEV\ElasticSearch\Result; class FormatData { @@ -28,11 +26,11 @@ class FormatData $aResult = ['facets' => []]; $aResult['hits'] = static::formatData($result)['hits']; foreach ($result->getFacets() as $facet) { - /** @var Facet $facet */ + /** @var FacetResult $facet */ $dataFacet = [ 'code' => $facet->getCode(), 'label' => null, // $facet->getLabel(), - 'type' => $facet->getType() instanceof FacetRangeType ? 'range' : ($facet->getType() instanceof FacetListType ? 'list' : null), + 'type' => $facet->getType()->value, 'items' => [ 'list' => [], 'range' => [] diff --git a/tests/Helpers/TestIndexProvider.php b/tests/Helpers/TestIndexProvider.php index 89761f057372389acdb74884a098905dd209bdd4..070d24c02204e6e5dca6782d8e89c6a07b3cb8e4 100644 --- a/tests/Helpers/TestIndexProvider.php +++ b/tests/Helpers/TestIndexProvider.php @@ -4,9 +4,9 @@ namespace IQDEV\ElasticSearchTests\Helpers; use IQDEV\ElasticSearch\Configuration; use IQDEV\ElasticSearch\Document\ProductDocument; -use IQDEV\ElasticSearch\Facet\FacetCategory; -use IQDEV\ElasticSearch\Facet\FacetKeyword; -use IQDEV\ElasticSearch\Facet\FacetNumber; +use IQDEV\ElasticSearch\Document\Property\Property; +use IQDEV\ElasticSearch\Document\Property\PropertyType; +use IQDEV\ElasticSearch\Facet\FacetFactory; use IQDEV\ElasticSearch\Indexer\AddIndex; use IQDEV\ElasticSearch\Indexer\DeleteIndex; use IQDEV\ElasticSearch\Indexer\IndexProvider; @@ -30,7 +30,9 @@ class TestIndexProvider implements IndexProvider public function get(): \Generator { foreach ($this->products as $product) { - $document = new ProductDocument(new FacetCategory($product['category'])); + $document = new ProductDocument( + FacetFactory::createFromProperty(new Property('category_id', PropertyType::BASE), $product['category']) + ); //todo по-хорошему нужны базовые классы, которые будут описывать свойства // и формировать структуру для последующей обработки @@ -46,11 +48,15 @@ class TestIndexProvider implements IndexProvider $document->setAdditionData($data); if (isset($product['properties'])) { - foreach ($product['properties'] as $key => $prop) { + foreach ($product['properties'] as $key => $value) { if ($key === 'price') { - $document->getNumberFacets()->add(new FacetNumber($key, $prop)); + $document->getNumberFacets()->add( + FacetFactory::createFromProperty(new Property($key, PropertyType::NUMBER), $value) + ); } else { - $document->getKeywordFacets()->add(new FacetKeyword($key, $prop)); + $document->getKeywordFacets()->add( + FacetFactory::createFromProperty(new Property($key, PropertyType::KEYWORD), $value) + ); } } } diff --git a/tests/Seed/DefaultSeed.php b/tests/Seed/DefaultSeed.php index 8ab1eeacdd7cfaee6f7e7e1b346d28ee7645f836..cb867ed06fcf7152e82811d8cb4220c8f8e8d7b0 100644 --- a/tests/Seed/DefaultSeed.php +++ b/tests/Seed/DefaultSeed.php @@ -7,7 +7,7 @@ use IQDEV\ElasticSearch\Configuration; use IQDEV\ElasticSearch\Indexer\IndexRunner; use IQDEV\ElasticSearchTests\Factory\ClientFactory; use IQDEV\ElasticSearchTests\Helpers\TestIndexProvider; -use Psr\Log\Test\TestLogger; +use Psr\Log\NullLogger; class DefaultSeed { @@ -22,7 +22,7 @@ class DefaultSeed $this->indexRunner = new IndexRunner( ClientFactory::create(), $this->configuration, - new TestLogger() + new NullLogger() ); } @@ -33,49 +33,57 @@ class DefaultSeed 'id' => 's1', 'name' => 'Кроссовки NMD_R1 Boba Fett Spectoo', 'category' => 'shoes', - 'properties' => ['brand' => 'adidas', 'color' => 'green', 'size' => 46,'price' => 100] + 'properties' => ['brand' => 'adidas', 'color' => 'green', 'size' => 46,'price' => 100], + 'year' => 2014, ], [ 'id' => 's2', 'name' => 'КРОССОВКИ ULTRABOOST 5.0 DNA', 'category' => 'shoes', - 'properties' => ['brand' => 'adidas', 'color' => 'red', 'size' => 47,'price' => 101] + 'properties' => ['brand' => 'adidas', 'color' => 'red', 'size' => 47,'price' => 101], + 'year' => 2023, ], [ 'id' => 's3', 'name' => 'Кроссовки Reebok Royal Techque', 'category' => 'shoes', - 'properties' => ['brand' => 'rebook', 'color' => 'blue', 'size' => 47,'price' => 102] + 'properties' => ['brand' => 'rebook', 'color' => 'blue', 'size' => 47,'price' => 102], + 'year' => 1980, ], [ 'id' => 's4', 'name' => 'Nike Air Zoom Pegasus 39', 'category' => 'shoes', - 'properties' => ['brand' => 'nike', 'color' => 'green', 'size' => 43,'price' => 103] + 'properties' => ['brand' => 'nike', 'color' => 'green', 'size' => 43,'price' => 103], + 'year' => 2014, ], [ 'id' => 'h1', 'name' => 'Nike Dri-FIT Strike', 'category' => 't-short', - 'properties' => ['brand' => 'nike', 'color' => 'red', 'size' => 'xl','price' => 104] + 'properties' => ['brand' => 'nike', 'color' => 'red', 'size' => 'xl','price' => 104], + 'year' => 2010, ], [ 'id' => 'h2', 'name' => 'Nike Dri-FIT Rise 365', 'category' => 't-short', - 'properties' => ['brand' => 'nike', 'color' => 'white', 'size' => 'xxl','price' => 105] + 'properties' => ['brand' => 'nike', 'color' => 'white', 'size' => 'xxl','price' => 105], + 'year' => 2000, ], [ 'id' => 'h3', 'name' => 'Компрессионная Футболка ACTIVCHILL Graphic Move', 'category' => 't-short', - 'properties' => ['brand' => 'rebook', 'color' => 'white', 'size' => 'xl','price' => 106] + 'properties' => ['brand' => 'rebook', 'color' => 'white', 'size' => 'xl','price' => 106], + 'year' => 1990, ], [ 'id' => 'p1', 'name' => 'Товар с ценой', 'category' => 'prices', - 'properties' => ['brand' => 'rebook', 'color' => 'white', 'size' => 'xl','price' => 107] + 'properties' => ['brand' => 'rebook', 'color' => 'white', 'size' => 'xl','price' => 107], + 'year' => 2015, ], ]); diff --git a/tests/Service/SearchClient.php b/tests/Service/SearchClient.php index bb3d57a2ee96f38a0cf018f972aa015ca586408f..adfdde92ad7f22a85bb7814b4fd49d47dd9caa61 100644 --- a/tests/Service/SearchClient.php +++ b/tests/Service/SearchClient.php @@ -2,10 +2,10 @@ namespace IQDEV\ElasticSearchTests\Service; -use IQDEV\ElasticSearch\SearchService; use IQDEV\ElasticSearch\Config\BaseConfiguration as Configuration; +use IQDEV\ElasticSearch\Criteria\Query\SearchQueryHandler; +use IQDEV\ElasticSearch\SearchService; use IQDEV\ElasticSearchTests\Factory\ClientFactory; -use IQDEV\Search\Query\SearchQueryHandler; class SearchClient {