Skip to content
......@@ -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);
......
......@@ -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)
),
]));
......
......@@ -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
}
......@@ -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);
......
<?php
declare(strict_types=1);
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\LogicOperator;
use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterKeyword;
use IQDEV\ElasticSearch\Criteria\Query\SearchQuery;
use IQDEV\ElasticSearch\Criteria\Search\Search;
use IQDEV\ElasticSearch\Document\Property\Property;
use IQDEV\ElasticSearchTests\AbstractTestCase;
use IQDEV\ElasticSearchTests\Helpers\FormatData;
use IQDEV\ElasticSearchTests\Service\SearchClient;
class UpdatedSearchTest extends AbstractTestCase
{
/**
* Поиск по свойству nested
*
* @return void
*/
public function testSearchByNestedProperty(): void
{
$criteria = new Criteria();
$criteria->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));
}
}
......@@ -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' => []
......
......@@ -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)
);
}
}
}
......
......@@ -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,
],
]);
......
......@@ -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
{
......