diff --git a/composer.json b/composer.json index 236261288cd93366c882e917a708eebfab3e03be..1f0b16f6a1ef83cc3df19652c64ef3153980b6f4 100644 --- a/composer.json +++ b/composer.json @@ -16,9 +16,8 @@ "php" ], "require": { - "php": ">=7.4", + "php": ">=8.1", "ramsey/collection": "^1.2", - "iqdev/search-dc": "1.2.*", "elasticsearch/elasticsearch": "^8.5", "vlucas/phpdotenv": "^5.4.1" }, @@ -32,15 +31,8 @@ "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" + "phpunit/phpunit": "^9.5" }, "scripts": { "tests": "php ./vendor/bin/phpunit --testdox --verbose" diff --git a/src/ElasticSearch/Converter/CriteriaToEsRequest.php b/src/ElasticSearch/Converter/CriteriaToEsRequest.php index 0150585d3a4716c04af9e0e5628b4376d778f8a3..c168286fdbcb111ab0c2f6e87ede3dcd7f6eeafb 100644 --- a/src/ElasticSearch/Converter/CriteriaToEsRequest.php +++ b/src/ElasticSearch/Converter/CriteriaToEsRequest.php @@ -4,8 +4,6 @@ namespace IQDEV\ElasticSearch\Converter; use IQDEV\ElasticSearch\Filter\PostFilterCollection; use IQDEV\ElasticSearch\Filter\QueryFilterCollection; -use IQDEV\ElasticSearch\Order\OrderAscType; -use IQDEV\ElasticSearch\Order\OrderDescType; use IQDEV\ElasticSearch\Order\OrderField; use IQDEV\ElasticSearch\Order\OrderKeywordProperty; use IQDEV\ElasticSearch\Order\OrderNumberProperty; @@ -19,20 +17,18 @@ use IQDEV\ElasticSearch\Search\BoolQuery\Terms; use IQDEV\ElasticSearch\Search\Nested; use IQDEV\ElasticSearch\Search\Pagination; use IQDEV\ElasticSearch\Search\Request; -use IQDEV\Search\Criteria; -use IQDEV\Search\Document\Property\AttrType; -use IQDEV\Search\Document\Property\PropertyType; -use IQDEV\Search\FIlter\Filter; -use IQDEV\Search\Filter\FilterCollection; -use IQDEV\Search\Filter\FilterGroupCollection; -use IQDEV\Search\Filter\FilterKeyword; -use IQDEV\Search\Filter\FilterNumber; -use IQDEV\Search\Filter\FilterOperator; -use IQDEV\Search\Filter\FilterType; -use IQDEV\Search\Filter\LogicOperator; -use IQDEV\Search\Order\Order; -use IQDEV\Search\Order\OrderAscType as SOrderAscType; -use IQDEV\Search\Order\OrderDescType as SOrderDescType; +use IQDEV\ElasticSearch\Criteria; +use IQDEV\ElasticSearch\Document\Property\AttrType; +use IQDEV\ElasticSearch\Document\Property\PropertyType; +use IQDEV\ElasticSearch\Filter\Filter; +use IQDEV\ElasticSearch\Filter\FilterCollection; +use IQDEV\ElasticSearch\Filter\FilterGroupCollection; +use IQDEV\ElasticSearch\Filter\FilterKeyword; +use IQDEV\ElasticSearch\Filter\FilterNumber; +use IQDEV\ElasticSearch\Filter\FilterOperator; +use IQDEV\ElasticSearch\Filter\FilterType; +use IQDEV\ElasticSearch\Filter\LogicOperator; +use IQDEV\ElasticSearch\Order\Order; final class CriteriaToEsRequest { @@ -66,22 +62,16 @@ final class CriteriaToEsRequest 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(); - } + $direction = $order->orderType(); if ($order->orderBy() instanceof AttrType) { - $request->getSort()->add(new OrderField($order->orderBy()->key(), $direction)); + $request->getSort()->add(new OrderField($order->orderBy(), $direction)); } elseif ($order->orderBy() instanceof PropertyType) { if ($order->orderBy()->type() === PropertyType::TYPE_KEYWORD) { - $request->getSort()->add(new OrderKeywordProperty($order->orderBy()->key(), $direction)); + $request->getSort()->add(new OrderKeywordProperty($order->orderBy(), $direction)); } elseif ($order->orderBy()->type() === PropertyType::TYPE_NUMBER) { - $request->getSort()->add(new OrderNumberProperty($order->orderBy()->key(), $direction)); + $request->getSort()->add(new OrderNumberProperty($order->orderBy(), $direction)); } } } diff --git a/src/ElasticSearch/Converter/EsResponseToResult.php b/src/ElasticSearch/Converter/EsResponseToResult.php index 6d734f109b386324d3a4484d11e2e77ca397e38e..ee1262c7bd77e22f160ebdf392311598d8679e74 100644 --- a/src/ElasticSearch/Converter/EsResponseToResult.php +++ b/src/ElasticSearch/Converter/EsResponseToResult.php @@ -3,14 +3,14 @@ namespace IQDEV\ElasticSearch\Converter; use Elastic\Elasticsearch\Response\Elasticsearch; -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\Item\FacetItemRangeDTO; -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\Facet; +use IQDEV\ElasticSearch\Facet\Item\FacetItemList; +use IQDEV\ElasticSearch\Facet\Item\FacetItemRange; +use IQDEV\ElasticSearch\Facet\Item\FacetItemRangeDTO; +use IQDEV\ElasticSearch\Facet\Type\FacetListType; +use IQDEV\ElasticSearch\Facet\Type\FacetRangeType; +use IQDEV\ElasticSearch\Result; final class EsResponseToResult { diff --git a/src/ElasticSearch/Criteria.php b/src/ElasticSearch/Criteria.php new file mode 100644 index 0000000000000000000000000000000000000000..524d590d62eef17415e9cb4f6b20626869f25042 --- /dev/null +++ b/src/ElasticSearch/Criteria.php @@ -0,0 +1,35 @@ +filters = new FilterCollection(); + $this->sorting = new OrderCollection(); + $this->pagination = new Pagination(); + } + + public function filters(): FilterCollection + { + return $this->filters; + } + + public function sorting(): OrderCollection + { + return $this->sorting; + } + + public function pagination(): Pagination + { + return $this->pagination; + } +} diff --git a/src/ElasticSearch/Document/Product.php b/src/ElasticSearch/Document/Product.php new file mode 100644 index 0000000000000000000000000000000000000000..0bac9a8adbab81ed4da36f71fdbc28c09b334d25 --- /dev/null +++ b/src/ElasticSearch/Document/Product.php @@ -0,0 +1,21 @@ +id = $id; + $this->title = $title; + $this->info = $info; + } +} diff --git a/src/ElasticSearch/Document/ProductCollection.php b/src/ElasticSearch/Document/ProductCollection.php new file mode 100644 index 0000000000000000000000000000000000000000..85db7a08ad0ee264590791fc8fb99672443bab6f --- /dev/null +++ b/src/ElasticSearch/Document/ProductCollection.php @@ -0,0 +1,17 @@ + + */ +final class ProductCollection extends AbstractCollection +{ + + public function getType(): string + { + return Product::class; + } +} diff --git a/src/ElasticSearch/Document/Property/AttrType.php b/src/ElasticSearch/Document/Property/AttrType.php new file mode 100644 index 0000000000000000000000000000000000000000..246828dcb7f377c0fd583873d5a523d482b8591f --- /dev/null +++ b/src/ElasticSearch/Document/Property/AttrType.php @@ -0,0 +1,30 @@ +key = $key; + $this->type = $type; + } + + public function key(): string + { + return $this->key; + } + + public function type(): ?string + { + return $this->type; + } + + public static function types(): array + { + return []; + } +} \ No newline at end of file diff --git a/src/ElasticSearch/Document/Property/PropertyType.php b/src/ElasticSearch/Document/Property/PropertyType.php new file mode 100644 index 0000000000000000000000000000000000000000..f533c516955c1aeec88d718fdb54486da2636d38 --- /dev/null +++ b/src/ElasticSearch/Document/Property/PropertyType.php @@ -0,0 +1,40 @@ +key = $key; + $this->type = $type; + } + + public function key(): string + { + return $this->key; + } + + public function type(): string + { + return $this->type; + } + + public static function types(): array + { + return [ + self::TYPE_NUMBER, + self::TYPE_KEYWORD, + ]; + } +} diff --git a/src/ElasticSearch/Document/Property/Type.php b/src/ElasticSearch/Document/Property/Type.php new file mode 100644 index 0000000000000000000000000000000000000000..94699448123d2e09e9242ff1f44ca406e95a1700 --- /dev/null +++ b/src/ElasticSearch/Document/Property/Type.php @@ -0,0 +1,13 @@ +type = $type; + $this->code = $code; + $this->products = new FacetItemCollection(); + } + + public function getType(): FacetType + { + return $this->type; + } + + public function getCode(): string + { + return $this->code; + } + + public function es(): array + { + return [ + 'facet_code' => $this->code, + 'facet_value' => $this->type, + ]; + } } diff --git a/src/ElasticSearch/Facet/FacetCollection.php b/src/ElasticSearch/Facet/FacetCollection.php index e84af39063ea402d0280fe121c3660c561238258..d628b75fbd8de60ec0f8fd7f25717af174e811c1 100644 --- a/src/ElasticSearch/Facet/FacetCollection.php +++ b/src/ElasticSearch/Facet/FacetCollection.php @@ -9,11 +9,11 @@ final class FacetCollection extends AbstractCollection implements Esable { public function getType(): string { - return Facet::class; + return Facetable::class; } public function es(): array { - return array_map(static fn(Facet $facet) => $facet->es(), $this->toArray()); + return array_map(static fn(Facetable $facet) => $facet->es(), $this->toArray()); } } diff --git a/src/ElasticSearch/Facet/FacetKeyword.php b/src/ElasticSearch/Facet/FacetKeyword.php index fc431625408028cb8e4497a44053348ecdafb890..11fd094ba55b78bf25dbd61fbf2a03983299d20f 100644 --- a/src/ElasticSearch/Facet/FacetKeyword.php +++ b/src/ElasticSearch/Facet/FacetKeyword.php @@ -2,16 +2,16 @@ namespace IQDEV\ElasticSearch\Facet; -final class FacetKeyword implements Facet +final class FacetKeyword implements Facetable { private string $key; - /** @var string|string[] */ - private $value; + /** @var string|array */ + private string|array $value; /** * @param string|string[] $value */ - public function __construct(string $key, $value) + public function __construct(string $key, string|array $value) { $this->key = $key; $this->value = $value; diff --git a/src/ElasticSearch/Facet/FacetNumber.php b/src/ElasticSearch/Facet/FacetNumber.php index 953dfcad38ec2f55607e36324f3b826d976a58fd..12bf9837ae1959d3f353c8d01ad7f3b665d3c496 100644 --- a/src/ElasticSearch/Facet/FacetNumber.php +++ b/src/ElasticSearch/Facet/FacetNumber.php @@ -2,7 +2,7 @@ namespace IQDEV\ElasticSearch\Facet; -final class FacetNumber implements Facet +final class FacetNumber implements Facetable { private string $key; private float $value; diff --git a/src/ElasticSearch/Facet/FacetTypeEnum.php b/src/ElasticSearch/Facet/FacetTypeEnum.php new file mode 100644 index 0000000000000000000000000000000000000000..e0491c7094168e28eb5b878ba87492a7b41b1151 --- /dev/null +++ b/src/ElasticSearch/Facet/FacetTypeEnum.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/NewFacet.php b/src/ElasticSearch/Facet/NewFacet.php new file mode 100644 index 0000000000000000000000000000000000000000..cc08955f35224bcff56fe9b4f35a4f5fae6f3fae --- /dev/null +++ b/src/ElasticSearch/Facet/NewFacet.php @@ -0,0 +1,15 @@ +value = $value; + } + + public function value(): string + { + return $this->value; + } +} diff --git a/src/ElasticSearch/Filter/Filter.php b/src/ElasticSearch/Filter/Filter.php new file mode 100644 index 0000000000000000000000000000000000000000..97b26f1fa52685aa1260221fe9e2685f561da2b3 --- /dev/null +++ b/src/ElasticSearch/Filter/Filter.php @@ -0,0 +1,36 @@ +field = $field; + $this->operator = $operator; + $this->value = $value; + } + + public function field(): Field + { + return $this->field; + } + + public function operator(): FilterOperator + { + return $this->operator; + } + + public function value(): FilterValue + { + return $this->value; + } +} diff --git a/src/ElasticSearch/Filter/FilterCollection.php b/src/ElasticSearch/Filter/FilterCollection.php new file mode 100644 index 0000000000000000000000000000000000000000..7bb1d492d17be4d1237ff7add4375a0c7f1a38b6 --- /dev/null +++ b/src/ElasticSearch/Filter/FilterCollection.php @@ -0,0 +1,55 @@ +type = new LogicOperator(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; + } +} diff --git a/src/ElasticSearch/Filter/FilterGroupCollection.php b/src/ElasticSearch/Filter/FilterGroupCollection.php new file mode 100644 index 0000000000000000000000000000000000000000..5bbce1e00950694da132e90ca872776b617aeff2 --- /dev/null +++ b/src/ElasticSearch/Filter/FilterGroupCollection.php @@ -0,0 +1,82 @@ +type = new LogicOperator(LogicOperator::AND); + $this->filterType = FilterType::post(); + } + + /** + * @inheritDoc + */ + public function getType(): string + { + return Filter::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; + } + + /** + * Установка типа фильтрации + * + * @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; + } +} diff --git a/src/ElasticSearch/Filter/FilterKeyword.php b/src/ElasticSearch/Filter/FilterKeyword.php new file mode 100644 index 0000000000000000000000000000000000000000..d3edd61bbb6bd3abd33eb81a98cb97dcb569eef0 --- /dev/null +++ b/src/ElasticSearch/Filter/FilterKeyword.php @@ -0,0 +1,25 @@ +value = $value; + } + + /** + * @return string|string[] + */ + public function value() + { + return $this->value; + } +} diff --git a/src/ElasticSearch/Filter/FilterNumber.php b/src/ElasticSearch/Filter/FilterNumber.php new file mode 100644 index 0000000000000000000000000000000000000000..7a9dc755eb7f8c77fe95ebb89fa3b916de1ed61e --- /dev/null +++ b/src/ElasticSearch/Filter/FilterNumber.php @@ -0,0 +1,23 @@ +value = $value; + } + + public function value(): float + { + return $this->value; + } +} diff --git a/src/ElasticSearch/Filter/FilterOperator.php b/src/ElasticSearch/Filter/FilterOperator.php new file mode 100644 index 0000000000000000000000000000000000000000..a7d34c4f097ad132d0c5c6798caaf0f6c2684c4d --- /dev/null +++ b/src/ElasticSearch/Filter/FilterOperator.php @@ -0,0 +1,48 @@ +'; + const LT = '<'; + const GTE = '>='; + const LTE = '<='; + const CONTAINS = 'CONTAINS'; + const NOT_CONTAINS = 'NOT_CONTAINS'; + + private string $operator; + + public function __construct(string $operator) + { + if (!in_array($operator, self::toArray(), true)) { + throw new \InvalidArgumentException(sprintf('invalid operator %s', $operator)); + } + + $this->operator = $operator; + } + + public function value(): string + { + return $this->operator; + } + + /** + * @return string[] + */ + public static function toArray(): array + { + return [ + self::EQ, + self::NE, + self::GT, + self::LT, + self::GTE, + self::LTE, + self::CONTAINS, + self::NOT_CONTAINS, + ]; + } +} diff --git a/src/ElasticSearch/Filter/FilterType.php b/src/ElasticSearch/Filter/FilterType.php new file mode 100644 index 0000000000000000000000000000000000000000..732db069451bb2d32e74a5c8e947cb7ba8fdfea4 --- /dev/null +++ b/src/ElasticSearch/Filter/FilterType.php @@ -0,0 +1,52 @@ +operator = $operator; + } + + public function value(): string + { + return $this->operator; + } + + /** + * @return string[] + */ + public static function toArray(): array + { + return [ + self::POST, + self::QUERY + ]; + } + + public static function __callStatic($method, $arguments) + { + if (in_array($method, self::toArray())) { + return new self($method); + } + } +} diff --git a/src/ElasticSearch/Filter/FilterValue.php b/src/ElasticSearch/Filter/FilterValue.php new file mode 100644 index 0000000000000000000000000000000000000000..611f15d633b9b70016f7bfafe080bb4a5b70c497 --- /dev/null +++ b/src/ElasticSearch/Filter/FilterValue.php @@ -0,0 +1,8 @@ +operator = $operator; + } + + public function value(): string + { + return $this->operator; + } + + /** + * @return string[] + */ + public static function toArray(): array + { + return [ + self::AND, + self::OR + ]; + } + + public static function __callStatic($method, $arguments) + { + $method = strtoupper($method); + if (in_array($method, self::toArray())) { + return new self($method); + } + } +} diff --git a/src/ElasticSearch/Filter/PostFilterCollection.php b/src/ElasticSearch/Filter/PostFilterCollection.php index 315d43aff5c2d3a81f784822cbec161dabc527d8..8b677a747f11cfb0b6839c3eac6100fabfaa657b 100644 --- a/src/ElasticSearch/Filter/PostFilterCollection.php +++ b/src/ElasticSearch/Filter/PostFilterCollection.php @@ -2,8 +2,6 @@ namespace IQDEV\ElasticSearch\Filter; -use IQDEV\Search\Filter\FilterCollection; - class PostFilterCollection extends FilterCollection { } \ No newline at end of file diff --git a/src/ElasticSearch/Filter/QueryFilterCollection.php b/src/ElasticSearch/Filter/QueryFilterCollection.php index ec72fe00cc7ed9107e03b668e367f33aba102c4a..aa700cca6b46ede7f23f2aba07efc2c43c9f2ccc 100644 --- a/src/ElasticSearch/Filter/QueryFilterCollection.php +++ b/src/ElasticSearch/Filter/QueryFilterCollection.php @@ -2,8 +2,6 @@ namespace IQDEV\ElasticSearch\Filter; -use IQDEV\Search\Filter\FilterCollection; - class QueryFilterCollection extends FilterCollection { } \ No newline at end of file diff --git a/src/ElasticSearch/Indexer/BaseIndexProvider.php b/src/ElasticSearch/Indexer/BaseIndexProvider.php index 2a5aee2d36bfec77b67c5f7ce9e94938f9b31138..83df733641c89b3cb155a9a053eeb064202e0a66 100644 --- a/src/ElasticSearch/Indexer/BaseIndexProvider.php +++ b/src/ElasticSearch/Indexer/BaseIndexProvider.php @@ -6,7 +6,6 @@ use IQDEV\ElasticSearch\Configuration; use IQDEV\ElasticSearch\Document\ProductDocument; use IQDEV\ElasticSearch\Facet\FacetCategory; use IQDEV\ElasticSearch\Facet\FacetKeyword; -use IQDEV\ElasticSearch\Facet\FacetNumber; class BaseIndexProvider implements IndexProvider { @@ -29,7 +28,7 @@ class BaseIndexProvider implements IndexProvider foreach ($product['properties'] as $type => $values) { foreach ($values as $key => $prop) { if ($type === 'number') { - $document->getNumberFacets()->add(new FacetNumber($key, $prop)); + $document->getNumberFacets()->add(new FacetKeyword($key, $prop)); } else { $document->getKeywordFacets()->add(new FacetKeyword($key, $prop)); } diff --git a/src/ElasticSearch/Order/Order.php b/src/ElasticSearch/Order/Order.php index b23f06735c8212a89baa0e77025f07876bed0893..82d4ac81b6b2f8888f7f26fe1af6fc56845c351a 100644 --- a/src/ElasticSearch/Order/Order.php +++ b/src/ElasticSearch/Order/Order.php @@ -3,14 +3,15 @@ namespace IQDEV\ElasticSearch\Order; use IQDEV\ElasticSearch\Esable; +use IQDEV\ElasticSearch\Document\Property\Type; -abstract class Order implements Esable +class Order implements Esable { - public string $by; + public Type $by; public OrderType $direction; public array $properties; - public function __construct(string $by, OrderType $direction, array $properties = []) + public function __construct(Type $by, OrderType $direction, array $properties = []) { $this->by = $by; $this->direction = $direction; @@ -19,6 +20,21 @@ abstract class Order implements Esable public function es(): array { - return array_merge([$this->by => $this->direction::getType()], $this->properties); + return array_merge([$this->by->key() => $this->direction::getType()], $this->properties); + } + + public function orderBy(): Type + { + return $this->by; + } + + public function orderType(): OrderType + { + return $this->direction; + } + + public function orderProperties(): array + { + return $this->properties; } } diff --git a/src/ElasticSearch/Order/OrderKeywordProperty.php b/src/ElasticSearch/Order/OrderKeywordProperty.php index c490062a5df27cb0e272404e39d2bc37e2aca209..f0ae3e1d6278a59770e189a8c61d702223c446de 100644 --- a/src/ElasticSearch/Order/OrderKeywordProperty.php +++ b/src/ElasticSearch/Order/OrderKeywordProperty.php @@ -14,7 +14,7 @@ class OrderKeywordProperty extends Order 'bool' => [ 'must' => [ 'term' => [ - 'search_data.keyword_facet.facet_code' => $this->by, + 'search_data.keyword_facet.facet_code' => $this->by->key(), ] ], ], diff --git a/src/ElasticSearch/Order/OrderNumberProperty.php b/src/ElasticSearch/Order/OrderNumberProperty.php index befc546078b4da2c34474eacaad1cd66d09747e4..b6a14016e218c29eb2dcb3f9b5d1df5c92679037 100644 --- a/src/ElasticSearch/Order/OrderNumberProperty.php +++ b/src/ElasticSearch/Order/OrderNumberProperty.php @@ -14,7 +14,7 @@ class OrderNumberProperty extends Order 'bool' => [ 'must' => [ 'term' => [ - 'search_data.number_facet.facet_code' => $this->by, + 'search_data.number_facet.facet_code' => $this->by->key(), ] ], ], diff --git a/src/ElasticSearch/Pagination.php b/src/ElasticSearch/Pagination.php new file mode 100644 index 0000000000000000000000000000000000000000..3fc99c1d73db5b8025a572321d51739b4991b20f --- /dev/null +++ b/src/ElasticSearch/Pagination.php @@ -0,0 +1,15 @@ +limit = $limit; + $this->offset = $offset; + } +} diff --git a/src/ElasticSearch/Query/SearchQuery.php b/src/ElasticSearch/Query/SearchQuery.php new file mode 100644 index 0000000000000000000000000000000000000000..f23a42f80cd193a0cd890110a7c2b1468b28085f --- /dev/null +++ b/src/ElasticSearch/Query/SearchQuery.php @@ -0,0 +1,15 @@ +criteria = $criteria; + } +} diff --git a/src/ElasticSearch/Query/SearchQueryHandler.php b/src/ElasticSearch/Query/SearchQueryHandler.php new file mode 100644 index 0000000000000000000000000000000000000000..a10506675501b634d030c71a1c34da64289ae027 --- /dev/null +++ b/src/ElasticSearch/Query/SearchQueryHandler.php @@ -0,0 +1,22 @@ +searchService = $searchService; + } + + public function handle(SearchQuery $q): SearchQueryResponse + { + $result = $this->searchService->search($q->criteria); + + return new SearchQueryResponse($result); + } +} diff --git a/src/ElasticSearch/Query/SearchQueryResponse.php b/src/ElasticSearch/Query/SearchQueryResponse.php new file mode 100644 index 0000000000000000000000000000000000000000..f1dca39d02fb047a4519749171ae06e0222c7902 --- /dev/null +++ b/src/ElasticSearch/Query/SearchQueryResponse.php @@ -0,0 +1,15 @@ +result = $result; + } +} diff --git a/src/ElasticSearch/Result.php b/src/ElasticSearch/Result.php new file mode 100644 index 0000000000000000000000000000000000000000..54bc77648c4e7334368113e0197c46ed9222fb1b --- /dev/null +++ b/src/ElasticSearch/Result.php @@ -0,0 +1,39 @@ +products = new ProductCollection(); + $this->facets = new FacetCollection(); + } + + 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(): FacetCollection + { + return $this->facets; + } +} diff --git a/src/ElasticSearch/Search/BoolQuery/FilterNumberFacet.php b/src/ElasticSearch/Search/BoolQuery/FilterNumberFacet.php index b150931864b06697d0c5f07daecd906849409dbb..2b3985b55491668c56617131d0210fddb63391be 100644 --- a/src/ElasticSearch/Search/BoolQuery/FilterNumberFacet.php +++ b/src/ElasticSearch/Search/BoolQuery/FilterNumberFacet.php @@ -4,7 +4,7 @@ namespace IQDEV\ElasticSearch\Search\BoolQuery; use IQDEV\ElasticSearch\Esable; use IQDEV\ElasticSearch\Search\Nested; -use IQDEV\Search\Filter\FilterOperator; +use IQDEV\ElasticSearch\Filter\FilterOperator; final class FilterNumberFacet implements Esable { diff --git a/src/ElasticSearch/SearchService.php b/src/ElasticSearch/SearchService.php index a1319b93712877c1e406f7866dc0ed49344a5352..fcc547601fc0676c7c47faf3d99124ab70fda694 100644 --- a/src/ElasticSearch/SearchService.php +++ b/src/ElasticSearch/SearchService.php @@ -7,10 +7,8 @@ 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; -class SearchService implements \IQDEV\Search\SearchService +class SearchService implements Searchable { private Client $esClient; private Configuration $configuration; diff --git a/src/ElasticSearch/Searchable.php b/src/ElasticSearch/Searchable.php new file mode 100644 index 0000000000000000000000000000000000000000..b47bed57fb7ea2d03d0ebdcd442c6e61b0ba2a1a --- /dev/null +++ b/src/ElasticSearch/Searchable.php @@ -0,0 +1,13 @@ +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 94% rename from tests/FIlter/KeywordsTest.php rename to tests/Filter/KeywordsTest.php index 51acdf6439db9efcb44b2185821597160eeade5f..df62a19a4d8759c5d7022a0df020af0d8fbd7d05 100644 --- a/tests/FIlter/KeywordsTest.php +++ b/tests/Filter/KeywordsTest.php @@ -5,14 +5,14 @@ namespace IQDEV\ElasticSearchTests\Filter; 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; +use IQDEV\ElasticSearch\Criteria; +use IQDEV\ElasticSearch\Filter\Field; +use IQDEV\ElasticSearch\Filter\Filter; +use IQDEV\ElasticSearch\Filter\FilterGroupCollection; +use IQDEV\ElasticSearch\Filter\FilterKeyword; +use IQDEV\ElasticSearch\Filter\FilterOperator; +use IQDEV\ElasticSearch\Filter\FilterType; +use IQDEV\ElasticSearch\Query\SearchQuery; class KeywordsTest extends AbstractTestCase { diff --git a/tests/FIlter/QueryAndPostFilterTest.php b/tests/Filter/QueryAndPostFilterTest.php similarity index 99% rename from tests/FIlter/QueryAndPostFilterTest.php rename to tests/Filter/QueryAndPostFilterTest.php index dcf6fffb2faa9e66555dc7e7dd411625da909532..9ea7ecce4751035a8ceb074f23ff947724d857d4 100644 --- a/tests/FIlter/QueryAndPostFilterTest.php +++ b/tests/Filter/QueryAndPostFilterTest.php @@ -5,16 +5,16 @@ namespace IQDEV\ElasticSearchTests\Filter; 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; +use IQDEV\ElasticSearch\Criteria; +use IQDEV\ElasticSearch\Filter\Field; +use IQDEV\ElasticSearch\Filter\Filter; +use IQDEV\ElasticSearch\Filter\FilterGroupCollection; +use IQDEV\ElasticSearch\Filter\FilterKeyword; +use IQDEV\ElasticSearch\Filter\FilterNumber; +use IQDEV\ElasticSearch\Filter\FilterOperator; +use IQDEV\ElasticSearch\Filter\FilterType; +use IQDEV\ElasticSearch\Filter\LogicOperator; +use IQDEV\ElasticSearch\Query\SearchQuery; class QueryAndPostFilterTest extends AbstractTestCase { diff --git a/tests/FIlter/QueryTest.php b/tests/Filter/QueryTest.php similarity index 97% rename from tests/FIlter/QueryTest.php rename to tests/Filter/QueryTest.php index df79ee2efa0e7442b0a0b33283db5e83f8d4a8da..2db833a1c8eb20352ef9e38e9a7c507147d0d4cc 100644 --- a/tests/FIlter/QueryTest.php +++ b/tests/Filter/QueryTest.php @@ -6,15 +6,15 @@ use IQDEV\ElasticSearch\Converter\CriteriaToEsRequest; 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; +use IQDEV\ElasticSearch\Criteria; +use IQDEV\ElasticSearch\Filter\Field; +use IQDEV\ElasticSearch\Filter\Filter; +use IQDEV\ElasticSearch\Filter\FilterGroupCollection; +use IQDEV\ElasticSearch\Filter\FilterKeyword; +use IQDEV\ElasticSearch\Filter\FilterNumber; +use IQDEV\ElasticSearch\Filter\FilterOperator; +use IQDEV\ElasticSearch\Filter\FilterType; +use IQDEV\ElasticSearch\Query\SearchQuery; /** * Тестирование агрегирующих функций diff --git a/tests/FIlter/RangeTest.php b/tests/Filter/RangeTest.php similarity index 96% rename from tests/FIlter/RangeTest.php rename to tests/Filter/RangeTest.php index b9f6726439c3ef77184c23ac0867f166a2d76055..9c9b03206e138c1d636652338578531df2eba1c5 100644 --- a/tests/FIlter/RangeTest.php +++ b/tests/Filter/RangeTest.php @@ -5,13 +5,13 @@ namespace IQDEV\ElasticSearchTests\Filter; 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; +use IQDEV\ElasticSearch\Criteria; +use IQDEV\ElasticSearch\Filter\Field; +use IQDEV\ElasticSearch\Filter\Filter; +use IQDEV\ElasticSearch\Filter\FilterGroupCollection; +use IQDEV\ElasticSearch\Filter\FilterNumber; +use IQDEV\ElasticSearch\Filter\FilterOperator; +use IQDEV\ElasticSearch\Query\SearchQuery; class RangeTest extends AbstractTestCase { diff --git a/tests/FIlter/SearchItemsTest.php b/tests/Filter/SearchItemsTest.php similarity index 94% rename from tests/FIlter/SearchItemsTest.php rename to tests/Filter/SearchItemsTest.php index 7f53c9173351c4b1dcb10f0e57e5e8cd038f7ba4..5327213aa5cda04bff6908e0ee6cc6cb9031f8e9 100644 --- a/tests/FIlter/SearchItemsTest.php +++ b/tests/Filter/SearchItemsTest.php @@ -5,14 +5,14 @@ namespace IQDEV\ElasticSearchTests\Filter; 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; +use IQDEV\ElasticSearch\Criteria; +use IQDEV\ElasticSearch\Filter\Field; +use IQDEV\ElasticSearch\Filter\Filter; +use IQDEV\ElasticSearch\Filter\FilterGroupCollection; +use IQDEV\ElasticSearch\Filter\FilterKeyword; +use IQDEV\ElasticSearch\Filter\FilterOperator; +use IQDEV\ElasticSearch\Filter\FilterType; +use IQDEV\ElasticSearch\Query\SearchQuery; class SearchItemsTest extends AbstractTestCase { diff --git a/tests/FIlter/SortTest.php b/tests/Filter/SortTest.php similarity index 91% rename from tests/FIlter/SortTest.php rename to tests/Filter/SortTest.php index a7a28d9f43ebe856774824af911efa08b5f758b3..9d4b4450de1ac3b50911d2c472a3011cfc4d0674 100644 --- a/tests/FIlter/SortTest.php +++ b/tests/Filter/SortTest.php @@ -2,16 +2,18 @@ namespace IQDEV\ElasticSearchTests\Filter; +use IQDEV\ElasticSearch\Order\OrderAscType; +use IQDEV\ElasticSearch\Order\OrderDescType; +use IQDEV\ElasticSearch\Order\OrderKeywordProperty; +use IQDEV\ElasticSearch\Order\OrderNumberProperty; 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; +use IQDEV\ElasticSearch\Criteria; +use IQDEV\ElasticSearch\Document\Property\AttrType; +use IQDEV\ElasticSearch\Document\Property\PropertyType; +use IQDEV\ElasticSearch\Order\Order; +use IQDEV\ElasticSearch\Query\SearchQuery; class SortTest extends AbstractTestCase { @@ -96,7 +98,7 @@ class SortTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->sorting()->add(new Order( + $criteria->sorting()->add(new OrderKeywordProperty( new PropertyType('color', PropertyType::TYPE_KEYWORD), new OrderAscType(), )); @@ -132,7 +134,7 @@ class SortTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->sorting()->add(new Order( + $criteria->sorting()->add(new OrderKeywordProperty( new PropertyType('color', PropertyType::TYPE_KEYWORD), new OrderDescType(), )); @@ -168,7 +170,7 @@ class SortTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->sorting()->add(new Order( + $criteria->sorting()->add(new OrderNumberProperty( new PropertyType('price', PropertyType::TYPE_NUMBER), new OrderAscType(), )); @@ -204,7 +206,7 @@ class SortTest extends AbstractTestCase { $criteria = new Criteria(); - $criteria->sorting()->add(new Order( + $criteria->sorting()->add(new OrderNumberProperty( new PropertyType('price', PropertyType::TYPE_NUMBER), new OrderDescType(), )); diff --git a/tests/Helpers/FormatData.php b/tests/Helpers/FormatData.php index f042c9a1dddcb40e5642e45c755a2a227f0d9c8f..7914eedffd0f1132beb05af3c32c3767e652e3fb 100644 --- a/tests/Helpers/FormatData.php +++ b/tests/Helpers/FormatData.php @@ -2,13 +2,13 @@ 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\Facet; +use IQDEV\ElasticSearch\Facet\Item\FacetItemList; +use IQDEV\ElasticSearch\Facet\Item\FacetItemRange; +use IQDEV\ElasticSearch\Facet\Type\FacetListType; +use IQDEV\ElasticSearch\Facet\Type\FacetRangeType; +use IQDEV\ElasticSearch\Result; class FormatData { diff --git a/tests/Seed/DefaultSeed.php b/tests/Seed/DefaultSeed.php index 8ab1eeacdd7cfaee6f7e7e1b346d28ee7645f836..fac4092c4f6612825d5397cbde55343c27008c41 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() ); } diff --git a/tests/Service/SearchClient.php b/tests/Service/SearchClient.php index bb3d57a2ee96f38a0cf018f972aa015ca586408f..ea73a5b3d250ad237df890ad3ae252baee250ab2 100644 --- a/tests/Service/SearchClient.php +++ b/tests/Service/SearchClient.php @@ -5,7 +5,7 @@ namespace IQDEV\ElasticSearchTests\Service; use IQDEV\ElasticSearch\SearchService; use IQDEV\ElasticSearch\Config\BaseConfiguration as Configuration; use IQDEV\ElasticSearchTests\Factory\ClientFactory; -use IQDEV\Search\Query\SearchQueryHandler; +use IQDEV\ElasticSearch\Query\SearchQueryHandler; class SearchClient {