Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
No results found
Show changes
Showing
with 2888 additions and 1054 deletions
......@@ -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
......
......@@ -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) {
......
......@@ -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,13 +28,13 @@ 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(),
'body' => $request->es(),
]);
return $this->esResponseToResult->fromResponse($response);
return $this->esResponseToResult->fromResponse($response, $this->configuration);
}
}
<?php
namespace IQDEV\ElasticSearch;
use IQDEV\ElasticSearch\Criteria\Criteria;
interface Searchable
{
/**
* @param Criteria $criteria
*
* @return Result
*/
public function search(Criteria $criteria): Result;
}
......@@ -7,10 +7,17 @@ use PHPUnit\Framework\TestCase;
abstract class AbstractTestCase extends TestCase
{
/**
* Частичное сравнение массивов
* @param array $expected
* @param array $actual массив который должен иметь структуру и значения $expected
* @param string $message
* @return void
*/
protected function assertArray(array $expected, array $actual, string $message = '')
{
$expectedKeys = Arr::convertingOneDimensional($expected);
$actualKeys = Arr::convertingOneDimensional($actual);
$expectedKeys = Arr::dot($expected);
$actualKeys = Arr::dot($actual);
foreach ($expectedKeys as $key => $value) {
$this->assertArrayHasKey($key, $actualKeys, $message);
if (isset($actualKeys[$key])) {
......
<?php
include_once __DIR__ . '/../bootstrap.php';
$oSeeder = new \IQDEV\ElasticSearchTests\Seed\DefaultSeed();
$oSeeder->start();
\ No newline at end of file
<?php
namespace IQDEV\ElasticSearchTests\Config;
use IQDEV\ElasticSearch\Config\BaseConfiguration;
class ChangingStateConfiguration extends BaseConfiguration
{
public function getIndexName(): string
{
return $_ENV['IQ_ES_PRODUCT_SEARCH_INDEX'] . '_changing-state';
}
}
\ No newline at end of file
<?php
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;
class QueryAndPostFilterTest extends AbstractTestCase
{
/**
* query по не сущ бренду
*/
public function testQueryNonExistentBrand()
{
$criteria = new Criteria();
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('not')
)
]);
$filterCollectionBrand->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollectionBrand);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => []
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
}
/**
* query по сущ бренду
* @return void
*/
public function testQueryExistingBrand()
{
$criteria = new Criteria();
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('adidas')
)
]);
$filterCollectionBrand->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollectionBrand);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
's1',
's2',
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
}
/**
* query по сущ бренду и post_filter по бренду
* @return void
*/
public function testQueryExistingBrandAndPostFilterExistingBrand()
{
$criteria = new Criteria();
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('adidas')
),
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('nike')
),
]);
$filterCollectionBrand
->setLogicalType(LogicOperator::or())
->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollectionBrand);
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('nike')
),
]);
$criteria->filters()->add($filterCollectionBrand);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
's4',
'h1',
'h2',
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
}
/**
* query по сущ бренду и post_filter по цвету
* @return void
*/
public function testQueryExistingBrandAndPostFilterExistingColor()
{
$criteria = new Criteria();
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('nike')
),
]);
$filterCollectionBrand
->setLogicalType(LogicOperator::or())
->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollectionBrand);
$filterCollectionColor = new FilterGroupCollection([
new Filter(
new Field('color'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('white')
),
]);
$criteria->filters()->add($filterCollectionColor);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
'h2',
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
}
/**
* query по сущ бренду и цвету и post_filter по бренду
* @return void
*/
public function testQueryExistingBrandAndColorAndPostFilterExistingColor()
{
$criteria = new Criteria();
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('nike')
),
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('rebook')
),
]);
$filterCollectionBrand
->setLogicalType(LogicOperator::or())
->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollectionBrand);
$filterCollectionColor = new FilterGroupCollection([
new Filter(
new Field('color'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('white')
),
]);
$filterCollectionColor->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollectionColor);
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('nike')
),
]);
$criteria->filters()->add($filterCollectionBrand);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
'h2',
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
}
/**
* query по сущ бренду и post_filter по бренду и цвету
* @return void
*/
public function testQueryExistingBrandAndColorAndPostFilterExistingBrandAndColor()
{
$criteria = new Criteria();
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('nike')
),
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('rebook')
),
]);
$filterCollectionBrand
->setLogicalType(LogicOperator::or())
->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollectionBrand);
$filterCollectionColor = new FilterGroupCollection([
new Filter(
new Field('color'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('white')
),
new Filter(
new Field('color'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('blue')
),
]);
$filterCollectionColor
->setLogicalType(LogicOperator::or())
->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollectionColor);
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('nike')
),
]);
$criteria->filters()->add($filterCollectionBrand);
$filterCollectionColor = new FilterGroupCollection([
new Filter(
new Field('color'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('white')
),
]);
$criteria->filters()->add($filterCollectionColor);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
'h2',
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
}
/**
* query по не сущ цене
* @return void
*/
public function testQueryNonExistentPrice()
{
$criteria = new Criteria();
$filterCollectionPrice = new FilterGroupCollection([
new Filter(
new Field('price'),
new FilterOperator(FilterOperator::GTE),
new FilterNumber(108)
)
]);
$filterCollectionPrice->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollectionPrice);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => []
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
}
/**
* query по сущ цене
* @return void
*/
public function testQueryExistingPrice()
{
$criteria = new Criteria();
$filterCollectionPrice = new FilterGroupCollection([
new Filter(
new Field('price'),
new FilterOperator(FilterOperator::GTE),
new FilterNumber(105)
)
]);
$filterCollectionPrice->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollectionPrice);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
'h2',
'h3',
'p1',
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
}
/**
* query по сущ цене и бренду
* @return void
*/
public function testQueryExistingPriceAndBrand()
{
$criteria = new Criteria();
$filterCollection = new FilterGroupCollection([
new Filter(
new Field('price'),
new FilterOperator(FilterOperator::GTE),
new FilterNumber(104)
),
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('nike')
),
]);
$filterCollection->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollection);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
'h1',
'h2',
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
}
/**
* query по сущ цене и бренду и post_filter по цвету
* @return void
*/
public function testQueryExistingPriceAndBrandAndPostFilterColor()
{
$criteria = new Criteria();
$filterCollection = new FilterGroupCollection([
new Filter(
new Field('price'),
new FilterOperator(FilterOperator::GTE),
new FilterNumber(104)
),
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('nike')
),
]);
$filterCollection->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollection);
$filterCollectionColor = new FilterGroupCollection([
new Filter(
new Field('color'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('red')
),
]);
$criteria->filters()->add($filterCollectionColor);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
'h1',
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
}
/**
* query по сущ цене и бренду и post_filter по цвету и бренду
* @return void
*/
public function testQueryExistingPriceAndBrandAndPostFilterColorAndBrand()
{
$criteria = new Criteria();
$filterCollectionPrice = new FilterGroupCollection([
new Filter(
new Field('price'),
new FilterOperator(FilterOperator::LTE),
new FilterNumber(104)
),
]);
$filterCollectionPrice->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollectionPrice);
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('nike')
),
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('adidas')
),
]);
$filterCollectionBrand
->setLogicalType(LogicOperator::or())
->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollectionBrand);
$filterCollectionColor = new FilterGroupCollection([
new Filter(
new Field('color'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('green')
),
]);
$criteria->filters()->add($filterCollectionColor);
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('nike')
),
]);
$criteria->filters()->add($filterCollectionBrand);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
's4',
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
}
/**
* query по сущ цене и бренду и post_filter по цене
* @return void
*/
public function testQueryExistingPriceAndBrandAndPostFilterPrice()
{
$criteria = new Criteria();
$filterCollectionPrice = new FilterGroupCollection([
new Filter(
new Field('price'),
new FilterOperator(FilterOperator::LTE),
new FilterNumber(104)
),
]);
$filterCollectionPrice->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollectionPrice);
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('nike')
),
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('adidas')
),
]);
$filterCollectionBrand
->setLogicalType(LogicOperator::or())
->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollectionBrand);
$filterCollectionPrice = new FilterGroupCollection([
new Filter(
new Field('price'),
new FilterOperator(FilterOperator::GTE),
new FilterNumber(102)
),
]);
$criteria->filters()->add($filterCollectionPrice);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
's4',
'h1',
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
}
/**
* query по сущ цене и бренду и post_filter по цвету и цене
* @return void
*/
public function testQueryExistingPriceAndBrandAndPostFilterPriceAndColor()
{
$criteria = new Criteria();
$filterCollectionPrice = new FilterGroupCollection([
new Filter(
new Field('price'),
new FilterOperator(FilterOperator::LTE),
new FilterNumber(104)
),
]);
$filterCollectionPrice->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollectionPrice);
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('nike')
),
new Filter(
new Field('brand'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('adidas')
),
]);
$filterCollectionBrand
->setLogicalType(LogicOperator::or())
->setFilterType(FilterType::query());
$criteria->filters()->add($filterCollectionBrand);
$filterCollectionPrice = new FilterGroupCollection([
new Filter(
new Field('price'),
new FilterOperator(FilterOperator::GTE),
new FilterNumber(102)
),
]);
$criteria->filters()->add($filterCollectionPrice);
$filterCollectionColor = new FilterGroupCollection([
new Filter(
new Field('color'),
new FilterOperator(FilterOperator::EQ),
new FilterKeyword('green')
),
]);
$criteria->filters()->add($filterCollectionColor);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
's4',
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatData($result));
}
}
<?php
namespace IQDEV\ElasticSearchTests\Filter;
use IQDEV\ElasticSearch\Criteria\Aggs\Aggs;
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\ElasticSearch\Document\Property\Property;
use IQDEV\ElasticSearchTests\AbstractTestCase;
use IQDEV\ElasticSearchTests\Helpers\FormatData;
use IQDEV\ElasticSearchTests\Service\SearchClient;
/**
* Тестирование агрегирующих функций для прямых свойств документов
*/
class AggsPropsTest extends AbstractTestCase
{
public function testCategoryAggs()
{
$criteria = new Criteria();
$criteria->getAggs()->add(
new Aggs(
new Property('new')
)
);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
'h1',
'h2',
'h3',
'p1',
's1',
's2',
's3',
's4',
],
'facets' => [
0 => [
'code' => 'new',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 0,
'count' => 3,
'active' => true
],
1 => [
'label' => null,
'value' => 1,
'count' => 5,
'active' => true
]
],
'range' => []
]
],
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result));
}
public function testCategoryAggsWFilters()
{
$criteria = new Criteria();
$criteria->getAggs()->add(
new Aggs(
new Property('new')
)
);
$criteria->getAggs()->add(
new Aggs(
new Property('rating')
)
);
$filterCollectionPrice = new FilterGroupCollection([
new Filter(
new Field('price'),
FilterOperator::GTE,
new FilterNumber(105)
)
]);
$criteria->getFilters()->add($filterCollectionPrice);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
'h2',
'h3',
'p1'
],
'facets' => [
0 => [
'code' => 'brand',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'adidas',
'count' => 0,
'active' => false
],
1 => [
'label' => null,
'value' => 'nike',
'count' => 1,
'active' => true
],
3 => [
'label' => null,
'value' => 'rebook',
'count' => 2,
'active' => true
]
],
'range' => []
]
],
1 => [
'code' => 'color',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'blue',
'count' => 0,
'active' => false
],
1 => [
'label' => null,
'value' => 'green',
'count' => 0,
'active' => false
],
2 => [
'label' => null,
'value' => 'red',
'count' => 0,
'active' => false
],
3 => [
'label' => null,
'value' => 'white',
'count' => 3,
'active' => true
]
],
'range' => []
]
],
2 => [
'code' => 'size',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
"label" => null,
"value" => "43",
"count" => 0,
"active" => false
],
1 => [
"label" => null,
"value" => "46",
"count" => 0,
"active" => false
],
2 => [
"label" => null,
"value" => "47",
"count" => 0,
"active" => false
],
3 => [
"label" => null,
"value" => "xl",
"count" => 2,
"active" => true
],
4 => [
"label" => null,
"value" => "xxl",
"count" => 1,
"active" => true
],
],
'range' => []
]
],
3 => [
'code' => 'price',
'label' => null,
'type' => 'range',
'items' => [
'list' => [],
'range' => [
0 => [
'label' => null,
'count' => 3,
'active' => true,
'fullRange' => [
'min' => 100.0,
'max' => 107.0
],
'activeRange' => [
'min' => 105.0,
'max' => 107.0
]
]
]
],
],
4 => [
'code' => 'new',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => "0",
'count' => 1,
'active' => true
],
1 => [
'label' => null,
'value' => "1",
'count' => 2,
'active' => true
]
],
'range' => []
]
],
5 => [
'code' => 'rating',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => "3",
'count' => 3,
'active' => true
],
],
'range' => []
]
],
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result));
}
}
......@@ -2,19 +2,20 @@
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\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\Filter\LogicOperator;
use IQDEV\Search\Query\SearchQuery;
/**
* Тестирование агрегирующих функций
......@@ -24,16 +25,11 @@ class AggsTest extends AbstractTestCase
public function testEmptyFilterByCategory()
{
$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',
),
);
$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)
);
......
<?php
namespace IQDEV\ElasticSearchTests\FIlter;
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\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\Query\SearchQuery;
class CommonRangeKeywordsTest extends AbstractTestCase
{
......@@ -25,18 +25,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::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)
),
]));
......
<?php
namespace IQDEV\ElasticSearchTests\Filter;
use Elastic\Elasticsearch\Client;
use IQDEV\ElasticSearch\Configuration;
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\NullLogger;
class IndexesTest extends AbstractTestCase
{
private array $product = [
'id' => 'test',
'name' => 'Test товар',
'category' => 'indexes',
'properties' => [
'prop1' => 'value1',
'prop2' => 'value2',
'prop3' => 'value3',
]
];
private IndexRunner $indexRunner;
private Client $esClient;
private Configuration $configuration;
public function __construct(?string $name = null, array $data = [], $dataName = '')
{
parent::__construct($name, $data, $dataName);
$this->configuration = new ChangingStateConfiguration();
$this->esClient = ClientFactory::create();
$this->indexRunner = new IndexRunner(
$this->esClient,
$this->configuration,
new NullLogger()
);
}
public function testUpdate()
{
$indexProvider = new TestIndexProvider($this->configuration, [$this->product]);
$this->indexRunner->run($indexProvider);
$updateData = [
'id' => $this->product['id'],
'category' => $this->product['category'],
'type' => 'update',
'name' => 'Обновленный элемент'
];
$indexProvider = new TestIndexProvider($this->configuration, [$updateData]);
$this->indexRunner->run($indexProvider);
$response = $this->esClient->search([
'index' => $this->configuration->getIndexName(),
'body' => [
'query' => [
'match' => [
'_id' => $this->product['id']
],
]
]
]);
$esResponseToResult = new EsResponseToResult();
$result = $esResponseToResult->fromResponse($response, $this->configuration);
unset($updateData['type']);
$expected = [
'products' => [
array_merge($this->product, $updateData)
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataProducts($result));
}
}
......@@ -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')
)
]));
......
<?php
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;
class QueryAndPostFilterTest extends AbstractTestCase
{
/**
* query по не сущ бренду
*/
public function testQueryNonExistentBrand()
{
$criteria = new Criteria();
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('not')
)
]);
$filterCollectionBrand->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollectionBrand);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [],
'facets' => []
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result));
}
/**
* query по сущ бренду
* @return void
*/
public function testQueryExistingBrand()
{
$criteria = new Criteria();
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('adidas')
)
]);
$filterCollectionBrand->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollectionBrand);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
's1',
's2',
],
'facets' => [
0 => [
'code' => 'brand',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'adidas',
'count' => 2,
'active' => true,
]
],
'range' => [],
]
],
1 => [
'code' => 'color',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'green',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => 'red',
'count' => 1,
'active' => true,
]
],
'range' => [],
]
],
2 => [
'code' => 'size',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => '46',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => '47',
'count' => 1,
'active' => true,
]
],
'range' => [],
]
],
3 => [
'code' => 'price',
'label' => null,
'type' => 'range',
'items' => [
'list' => [],
'range' => [
0 => [
'label' => null,
'count' => 2,
'active' => true,
'fullRange' => [
'min' => 100.0,
'max' => 101.0,
],
'activeRange' => [
'min' => 100.0,
'max' => 101.0,
]
]
]
]
]
],
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result));
}
/**
* query по сущ бренду и post_filter по бренду
* @return void
*/
public function testQueryExistingBrandAndPostFilterExistingBrand()
{
$criteria = new Criteria();
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('adidas')
),
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('nike')
),
]);
$filterCollectionBrand
->setLogicOperator(LogicOperator::OR)
->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollectionBrand);
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('nike')
),
]);
$criteria->getFilters()->add($filterCollectionBrand);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
's4',
'h1',
'h2',
],
'facets' => [
0 => [
'code' => 'brand',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'adidas',
'count' => 2,
'active' => true,
],
1 => [
'label' => null,
'value' => 'nike',
'count' => 3,
'active' => true,
]
],
'range' => [],
]
],
1 => [
'code' => 'color',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'green',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => 'red',
'count' => 1,
'active' => true,
],
2 => [
'label' => null,
'value' => 'white',
'count' => 1,
'active' => true,
]
],
'range' => [],
]
],
2 => [
'code' => 'size',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => '43',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => '46',
'count' => 0,
'active' => false,
],
2 => [
'label' => null,
'value' => '47',
'count' => 0,
'active' => false,
],
3 => [
'label' => null,
'value' => 'xl',
'count' => 1,
'active' => true,
],
4 => [
'label' => null,
'value' => 'xxl',
'count' => 1,
'active' => true,
]
],
'range' => [],
],
],
3 => [
'code' => 'price',
'label' => null,
'type' => 'range',
'items' => [
'list' => [],
'range' => [
0 => [
'label' => null,
'count' => 3,
'active' => true,
'fullRange' => [
'min' => 100.0,
'max' => 105.0,
],
'activeRange' => [
'min' => 103.0,
'max' => 105.0,
]
]
]
]
]
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result));
}
/**
* query по сущ бренду и post_filter по цвету
* @return void
*/
public function testQueryExistingBrandAndPostFilterExistingColor()
{
$criteria = new Criteria();
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('nike')
),
]);
$filterCollectionBrand
->setLogicOperator(LogicOperator::OR)
->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollectionBrand);
$filterCollectionColor = new FilterGroupCollection([
new Filter(
new Field('color'),
FilterOperator::EQ,
new FilterKeyword('white')
),
]);
$criteria->getFilters()->add($filterCollectionColor);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
'h2',
],
'facets' => [
0 => [
'code' => 'brand',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'nike',
'count' => 1,
'active' => true,
]
],
'range' => [],
]
],
1 => [
'code' => 'color',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'green',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => 'red',
'count' => 1,
'active' => true,
],
2 => [
'label' => null,
'value' => 'white',
'count' => 1,
'active' => true,
]
],
'range' => [],
]
],
2 => [
'code' => 'size',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => '43',
'count' => 0,
'active' => false,
],
1 => [
'label' => null,
'value' => 'xl',
'count' => 0,
'active' => false,
],
2 => [
'label' => null,
'value' => 'xxl',
'count' => 1,
'active' => true,
]
],
'range' => [],
]
],
3 => [
'code' => 'price',
'label' => null,
'type' => 'range',
'items' => [
'list' => [],
'range' => [
0 => [
'label' => null,
'count' => 1,
'active' => true,
'fullRange' => [
'min' => 103.0,
'max' => 105.0,
],
'activeRange' => [
'min' => 105.0,
'max' => 105.0,
]
]
]
]
]
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result));
}
/**
* query по сущ бренду и цвету и post_filter по бренду
* @return void
*/
public function testQueryExistingBrandAndColorAndPostFilterExistingColor()
{
$criteria = new Criteria();
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('nike')
),
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('rebook')
),
]);
$filterCollectionBrand
->setLogicOperator(LogicOperator::OR)
->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollectionBrand);
$filterCollectionColor = new FilterGroupCollection([
new Filter(
new Field('color'),
FilterOperator::EQ,
new FilterKeyword('white')
),
]);
$filterCollectionColor->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollectionColor);
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('nike')
),
]);
$criteria->getFilters()->add($filterCollectionBrand);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
'h2',
],
'facets' => [
0 => [
'code' => 'brand',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'nike',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => 'rebook',
'count' => 2,
'active' => true,
]
],
'range' => []
]
],
1 => [
'code' => 'color',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'white',
'count' => 1,
'active' => true,
]
],
'range' => []
]
],
2 => [
'code' => 'size',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'xl',
'count' => 0,
'active' => false,
],
1 => [
'label' => null,
'value' => 'xxl',
'count' => 1,
'active' => true,
]
],
'range' => []
]
],
3 => [
'code' => 'price',
'label' => null,
'type' => 'range',
'items' => [
'list' => [],
'range' => [
0 => [
'label' => null,
'count' => 1,
'active' => true,
'fullRange' => [
'min' => 105.0,
'max' => 107.0,
],
'activeRange' => [
'min' => 105.0,
'max' => 105.0,
]
]
]
]
]
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result));
}
/**
* query по сущ бренду и post_filter по бренду и цвету
* @return void
*/
public function testQueryExistingBrandAndPostFilterExistingBrandAndColor()
{
$criteria = new Criteria();
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('nike')
),
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('rebook')
),
]);
$filterCollectionBrand
->setLogicOperator(LogicOperator::OR)
->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollectionBrand);
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('nike')
),
]);
$criteria->getFilters()->add($filterCollectionBrand);
$filterCollectionColor = new FilterGroupCollection([
new Filter(
new Field('color'),
FilterOperator::EQ,
new FilterKeyword('red')
),
]);
$criteria->getFilters()->add($filterCollectionColor);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
'h1',
],
'facets' => [
0 => [
'code' => 'brand',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'nike',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => 'rebook',
'count' => 0,
'active' => false,
]
],
'range' => []
]
],
1 => [
'code' => 'color',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'blue',
'count' => 0,
'active' => false,
],
1 => [
'label' => null,
'value' => 'green',
'count' => 1,
'active' => true,
],
2 => [
'label' => null,
'value' => 'red',
'count' => 1,
'active' => true,
],
3 => [
'label' => null,
'value' => 'white',
'count' => 1,
'active' => true,
]
],
'range' => []
]
],
2 => [
'code' => 'size',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => '43',
'count' => 0,
'active' => false,
],
1 => [
'label' => null,
'value' => '47',
'count' => 0,
'active' => false,
],
2 => [
'label' => null,
'value' => 'xl',
'count' => 1,
'active' => true,
],
3 => [
'label' => null,
'value' => 'xxl',
'count' => 0,
'active' => false,
]
],
'range' => []
]
],
3 => [
'code' => 'price',
'label' => null,
'type' => 'range',
'items' => [
'list' => [],
'range' => [
0 => [
'label' => null,
'count' => 1,
'active' => true,
'fullRange' => [
'min' => 102.0,
'max' => 107.0,
],
'activeRange' => [
'min' => 104.0,
'max' => 104.0,
]
]
]
]
]
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result));
}
/**
* query по не сущ цене
* @return void
*/
public function testQueryNonExistentPrice()
{
$criteria = new Criteria();
$filterCollectionPrice = new FilterGroupCollection([
new Filter(
new Field('price'),
FilterOperator::GTE,
new FilterNumber(108)
)
]);
$filterCollectionPrice->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollectionPrice);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [],
'facets' => [],
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result));
}
/**
* query по сущ цене
* @return void
*/
public function testQueryExistingPrice()
{
$criteria = new Criteria();
$filterCollectionPrice = new FilterGroupCollection([
new Filter(
new Field('price'),
FilterOperator::GTE,
new FilterNumber(105)
)
]);
$filterCollectionPrice->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollectionPrice);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
'h2',
'h3',
'p1',
],
'facets' => [
0 => [
'code' => 'brand',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'nike',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => 'rebook',
'count' => 2,
'active' => true,
]
],
'range' => [],
]
],
1 => [
'code' => 'color',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'white',
'count' => 3,
'active' => true,
]
],
'range' => []
]
],
2 => [
'code' => 'size',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'xl',
'count' => 2,
'active' => true,
],
1 => [
'label' => null,
'value' => 'xxl',
'count' => 1,
'active' => true,
]
],
'range' => []
]
],
3 => [
'code' => 'price',
'label' => null,
'type' => 'range',
'items' => [
'list' => [],
'range' => [
0 => [
'label' => null,
'count' => 3,
'active' => true,
'fullRange' => [
'min' => 105.0,
'max' => 107.0,
],
'activeRange' => [
'min' => 105.0,
'max' => 107.0,
]
]
]
]
]
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result));
}
/**
* query по сущ цене и бренду
* @return void
*/
public function testQueryExistingPriceAndBrand()
{
$criteria = new Criteria();
$filterCollection = new FilterGroupCollection([
new Filter(
new Field('price'),
FilterOperator::GTE,
new FilterNumber(104)
),
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('nike')
),
]);
$filterCollection->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollection);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
'h1',
'h2',
],
'facets' => [
0 => [
'code' => 'brand',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'nike',
'count' => 2,
'active' => true,
]
],
'range' => []
]
],
1 => [
'code' => 'color',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'red',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => 'white',
'count' => 1,
'active' => true,
]
],
'range' => []
]
],
2 => [
'code' => 'size',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'xl',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => 'xxl',
'count' => 1,
'active' => true,
]
],
'range' => []
]
],
3 => [
'code' => 'price',
'label' => null,
'type' => 'range',
'items' => [
'list' => [],
'range' => [
0 => [
'label' => null,
'count' => 2,
'active' => true,
'fullRange' => [
'min' => 104.0,
'max' => 105.0,
],
'activeRange' => [
'min' => 104.0,
'max' => 105.0,
]
]
]
]
]
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result));
}
/**
* query по сущ цене и бренду и post_filter по цвету
* @return void
*/
public function testQueryExistingPriceAndBrandAndPostFilterColor()
{
$criteria = new Criteria();
$filterCollection = new FilterGroupCollection([
new Filter(
new Field('price'),
FilterOperator::GTE,
new FilterNumber(104)
),
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('nike')
),
]);
$filterCollection->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollection);
$filterCollectionColor = new FilterGroupCollection([
new Filter(
new Field('color'),
FilterOperator::EQ,
new FilterKeyword('red')
),
]);
$criteria->getFilters()->add($filterCollectionColor);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
'h1',
],
'facets' => [
0 => [
'code' => 'brand',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'nike',
'count' => 1,
'active' => true,
]
],
'range' => []
]
],
1 => [
'code' => 'color',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'red',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => 'white',
'count' => 1,
'active' => true,
]
],
'range' => []
]
],
2 => [
'code' => 'size',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'xl',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => 'xxl',
'count' => 0,
'active' => false,
]
],
'range' => []
]
],
3 => [
'code' => 'price',
'label' => null,
'type' => 'range',
'items' => [
'list' => [],
'range' => [
0 => [
'label' => null,
'count' => 1,
'active' => true,
'fullRange' => [
'min' => 104.0,
'max' => 105.0,
],
'activeRange' => [
'min' => 104.0,
'max' => 104.0,
]
]
]
]
]
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result));
}
/**
* query по сущ цене и бренду и post_filter по цвету и бренду
* @return void
*/
public function testQueryExistingPriceAndBrandAndPostFilterColorAndBrand()
{
$criteria = new Criteria();
$filterCollectionPrice = new FilterGroupCollection([
new Filter(
new Field('price'),
FilterOperator::LTE,
new FilterNumber(104)
),
]);
$filterCollectionPrice->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollectionPrice);
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('nike')
),
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('adidas')
),
]);
$filterCollectionBrand
->setLogicOperator(LogicOperator::OR)
->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollectionBrand);
$filterCollectionColor = new FilterGroupCollection([
new Filter(
new Field('color'),
FilterOperator::EQ,
new FilterKeyword('green')
),
]);
$criteria->getFilters()->add($filterCollectionColor);
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('nike')
),
]);
$criteria->getFilters()->add($filterCollectionBrand);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
's4',
],
'facets' => [
0 => [
'code' => 'brand',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'adidas',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => 'nike',
'count' => 1,
'active' => true,
]
],
'range' => []
]
],
1 => [
'code' => 'color',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'green',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => 'red',
'count' => 1,
'active' => true,
]
],
'range' => []
]
],
2 => [
'code' => 'size',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => '43',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => '46',
'count' => 0,
'active' => false,
],
2 => [
'label' => null,
'value' => '47',
'count' => 0,
'active' => false,
],
3 => [
'label' => null,
'value' => 'xl',
'count' => 0,
'active' => false,
]
],
'range' => []
]
],
3 => [
'code' => 'price',
'label' => null,
'type' => 'range',
'items' => [
'list' => [],
'range' => [
0 => [
'label' => null,
'count' => 1,
'active' => true,
'fullRange' => [
'min' => 100.0,
'max' => 104.0,
],
'activeRange' => [
'min' => 103.0,
'max' => 103.0,
]
]
]
]
]
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result));
}
/**
* query по сущ цене и бренду и post_filter по цене
* @return void
*/
public function testQueryExistingPriceAndBrandAndPostFilterPrice()
{
$criteria = new Criteria();
$filterCollectionPrice = new FilterGroupCollection([
new Filter(
new Field('price'),
FilterOperator::LTE,
new FilterNumber(104)
),
]);
$filterCollectionPrice->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollectionPrice);
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('nike')
),
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('adidas')
),
]);
$filterCollectionBrand
->setLogicOperator(LogicOperator::OR)
->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollectionBrand);
$filterCollectionPrice = new FilterGroupCollection([
new Filter(
new Field('price'),
FilterOperator::GTE,
new FilterNumber(102)
),
]);
$criteria->getFilters()->add($filterCollectionPrice);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
's4',
'h1',
],
'facets' => [
0 => [
'code' => 'brand',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'adidas',
'count' => 0,
'active' => false,
],
1 => [
'label' => null,
'value' => 'nike',
'count' => 2,
'active' => true,
]
],
'range' => []
]
],
1 => [
'code' => 'color',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'green',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => 'red',
'count' => 1,
'active' => true,
]
],
'range' => []
]
],
2 => [
'code' => 'size',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => '43',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => '46',
'count' => 0,
'active' => false,
],
2 => [
'label' => null,
'value' => '47',
'count' => 0,
'active' => false,
],
3 => [
'label' => null,
'value' => 'xl',
'count' => 1,
'active' => true,
]
],
'range' => [],
]
],
3 => [
'code' => 'price',
'label' => null,
'type' => 'range',
'items' => [
'list' => [],
'range' => [
0 => [
'label' => null,
'count' => 2,
'active' => true,
'fullRange' => [
'min' => 100.0,
'max' => 104.0,
],
'activeRange' => [
'min' => 103.0,
'max' => 104.0,
]
]
]
]
]
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result));
}
/**
* query по сущ цене и бренду и post_filter по цвету и цене
* @return void
*/
public function testQueryExistingPriceAndBrandAndPostFilterPriceAndColor()
{
$criteria = new Criteria();
$filterCollectionPrice = new FilterGroupCollection([
new Filter(
new Field('price'),
FilterOperator::LTE,
new FilterNumber(104)
),
]);
$filterCollectionPrice->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollectionPrice);
$filterCollectionBrand = new FilterGroupCollection([
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('nike')
),
new Filter(
new Field('brand'),
FilterOperator::EQ,
new FilterKeyword('adidas')
),
]);
$filterCollectionBrand
->setLogicOperator(LogicOperator::OR)
->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollectionBrand);
$filterCollectionPrice = new FilterGroupCollection([
new Filter(
new Field('price'),
FilterOperator::GTE,
new FilterNumber(101)
),
]);
$criteria->getFilters()->add($filterCollectionPrice);
$filterCollectionColor = new FilterGroupCollection([
new Filter(
new Field('color'),
FilterOperator::EQ,
new FilterKeyword('green')
),
]);
$criteria->getFilters()->add($filterCollectionColor);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
's4',
],
'facets' => [
0 => [
'code' => 'brand',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'adidas',
'count' => 0,
'active' => false,
],
1 => [
'label' => null,
'value' => 'nike',
'count' => 1,
'active' => true,
]
],
'range' => []
]
],
1 => [
'code' => 'color',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => 'green',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => 'red',
'count' => 2,
'active' => true,
]
],
'range' => []
]
],
2 => [
'code' => 'size',
'label' => null,
'type' => 'list',
'items' => [
'list' => [
0 => [
'label' => null,
'value' => '43',
'count' => 1,
'active' => true,
],
1 => [
'label' => null,
'value' => '46',
'count' => 0,
'active' => false,
],
2 => [
'label' => null,
'value' => '47',
'count' => 0,
'active' => false,
],
3 => [
'label' => null,
'value' => 'xl',
'count' => 0,
'active' => false,
]
],
'range' => []
]
],
3 => [
'code' => 'price',
'label' => null,
'type' => 'range',
'items' => [
'list' => [],
'range' => [
0 => [
'label' => null,
'count' => 1,
'active' => true,
'fullRange' => [
'min' => 100.0,
'max' => 104.0,
],
'activeRange' => [
'min' => 103.0,
'max' => 103.0,
],
]
]
]
]
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result));
}
}
......@@ -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);
......@@ -487,4 +490,147 @@ class QueryTest extends AbstractTestCase
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result));
}
}
\ No newline at end of file
public function testGlobalFilterMinPrice()
{
$filter = [
'price' => [
'key' => 'price',
'lower' => 103,
]
];
$criteria = new Criteria();
$filterCollectionQueryPrice = new FilterGroupCollection([
new Filter(
new Field($filter['price']['key']),
FilterOperator::GTE,
new FilterNumber($filter['price']['lower'])
),
]);
$filterCollectionQueryPrice->setFilterType(FilterType::QUERY);
$criteria->getFilters()->add($filterCollectionQueryPrice);
$q = new SearchQuery($criteria);
$handler = SearchClient::getInstance();
$result = $handler->handle($q)->result;
$expected = [
'hits' => [
's4',
'h1',
'h2',
'h3',
'p1',
],
"facets" => [
0 => [
"code" => "brand",
"label" => null,
"type" => "list",
"items" => [
"list" => [
0 => [
"label" => null,
"value" => "nike",
"count" => 3,
"active" => true,
],
1 => [
"label" => null,
"value" => "rebook",
"count" => 2,
"active" => true,
]
],
"range" => [],
],
],
1 => [
"code" => "color",
"label" => null,
"type" => "list",
"items" => [
"list" => [
0 => [
"label" => null,
"value" => "green",
"count" => 1,
"active" => true,
],
1 => [
"label" => null,
"value" => "red",
"count" => 1,
"active" => true,
],
2 => [
"label" => null,
"value" => "white",
"count" => 3,
"active" => true,
],
],
"range" => [],
],
],
2 => [
"code" => "size",
"label" => null,
"type" => "list",
"items" => [
"list" => [
0 => [
"label" => null,
"count" => 1,
"value" => "43",
"active" => true,
],
1 => [
"label" => null,
"value" => "xl",
"count" => 3,
"active" => true,
],
2 => [
"label" => null,
"value" => "xxl",
"count" => 1,
"active" => true,
],
],
"range" => [],
],
],
3 => [
"code" => "price",
"label" => null,
"type" => "range",
"items" => [
"list" => [],
"range" => [
0 => [
"label" => null,
"count" => 5,
"active" => true,
"fullRange" => [
"min" => 103.0,
"max" => 107.0,
],
"activeRange" => [
"min" => 103.0,
"max" => 107.0,
]
]
]
]
]
]
];
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result));
}
}
......@@ -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));
}
}
......@@ -4,21 +4,24 @@ namespace IQDEV\ElasticSearchTests\Helpers;
class Arr
{
public static function convertingOneDimensional(array $expected, $startKey = null): array
/**
* Flatten a multi-dimensional associative array with dots.
* @param array $array
* @param $prepend
* @return array
*/
public static function dot(array $array, $prepend = ''): array
{
$keys = [];
foreach ($expected as $key => $item) {
if ($startKey !== null) {
$key = $startKey.'.'.$key;
}
$results = [];
if (is_array($item)) {
$keys = array_merge($keys, static::convertingOneDimensional($item, $key));
continue;
foreach ($array as $key => $value) {
if (is_array($value) && ! empty($value)) {
$results = array_merge($results, static::dot($value, $prepend.$key.'.'));
} else {
$results[$prepend.$key] = $value;
}
$keys[$key] = $item;
}
return $keys;
return $results;
}
}
\ No newline at end of file