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 616 additions and 112 deletions
...@@ -5,19 +5,20 @@ namespace IQDEV\ElasticSearch; ...@@ -5,19 +5,20 @@ namespace IQDEV\ElasticSearch;
use Elastic\Elasticsearch\Client; use Elastic\Elasticsearch\Client;
use Elastic\Elasticsearch\Exception\ClientResponseException; use Elastic\Elasticsearch\Exception\ClientResponseException;
use Elastic\Elasticsearch\Exception\ServerResponseException; use Elastic\Elasticsearch\Exception\ServerResponseException;
use IQDEV\ElasticSearch\Converter\CriteriaToRequest; use IQDEV\ElasticSearch\Converter\Request\CriteriaToRequest;
use IQDEV\ElasticSearch\Converter\EsResponseToResult; use IQDEV\ElasticSearch\Converter\Result\EsResponseToResult;
use IQDEV\ElasticSearch\Criteria\Criteria;
class SearchService implements Searchable class SearchService implements Searchable
{ {
private CriteriaToRequest $criteriaToEsRequest; private CriteriaToRequest $criteriaToRequest;
private EsResponseToResult $esResponseToResult; private EsResponseToResult $esResponseToResult;
public function __construct( public function __construct(
private Client $esClient, private Client $esClient,
private Configuration $configuration private Configuration $configuration
) { ) {
$this->criteriaToEsRequest = new CriteriaToRequest($this->configuration); $this->criteriaToRequest = new CriteriaToRequest($this->configuration);
$this->esResponseToResult = new EsResponseToResult(); $this->esResponseToResult = new EsResponseToResult();
} }
...@@ -27,16 +28,13 @@ class SearchService implements Searchable ...@@ -27,16 +28,13 @@ class SearchService implements Searchable
*/ */
public function search(Criteria $criteria): Result public function search(Criteria $criteria): Result
{ {
$request = $this->criteriaToEsRequest->fromCriteria($criteria); $request = $this->criteriaToRequest->fromCriteria($criteria);
if (isset($GLOBALS['DD']) && $GLOBALS['DD'] === true) {
dd(json_encode($request->es()));
}
$response = $this->esClient->search([ $response = $this->esClient->search([
'index' => $this->configuration->getIndexName(), 'index' => $this->configuration->getIndexName(),
'body' => $request->es(), 'body' => $request->es(),
]); ]);
return $this->esResponseToResult->fromResponse($response); return $this->esResponseToResult->fromResponse($response, $this->configuration);
} }
} }
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
namespace IQDEV\ElasticSearch; namespace IQDEV\ElasticSearch;
use IQDEV\ElasticSearch\Criteria\Criteria;
interface Searchable interface Searchable
{ {
/** /**
......
<?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,17 +2,17 @@ ...@@ -2,17 +2,17 @@
namespace IQDEV\ElasticSearchTests\Filter; namespace IQDEV\ElasticSearchTests\Filter;
use IQDEV\ElasticSearch\Criteria; use IQDEV\ElasticSearch\Criteria\Criteria;
use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection;
use IQDEV\ElasticSearch\Criteria\Filter\Field;
use IQDEV\ElasticSearch\Criteria\Filter\Filter;
use IQDEV\ElasticSearch\Criteria\Filter\FilterOperator;
use IQDEV\ElasticSearch\Criteria\Filter\LogicOperator;
use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterKeyword;
use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterNumber;
use IQDEV\ElasticSearch\Criteria\Query\SearchQuery;
use IQDEV\ElasticSearch\Criteria\Search\Search;
use IQDEV\ElasticSearch\Document\Property\Property; use IQDEV\ElasticSearch\Document\Property\Property;
use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection;
use IQDEV\ElasticSearch\Request\Filter\Field;
use IQDEV\ElasticSearch\Request\Filter\Filter;
use IQDEV\ElasticSearch\Request\Filter\FilterOperator;
use IQDEV\ElasticSearch\Request\Filter\LogicOperator;
use IQDEV\ElasticSearch\Request\Filter\Value\FilterKeyword;
use IQDEV\ElasticSearch\Request\Filter\Value\FilterNumber;
use IQDEV\ElasticSearch\Request\Query\SearchQuery;
use IQDEV\ElasticSearch\Request\Search\Search;
use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\AbstractTestCase;
use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Helpers\FormatData;
use IQDEV\ElasticSearchTests\Service\SearchClient; use IQDEV\ElasticSearchTests\Service\SearchClient;
......
...@@ -2,14 +2,14 @@ ...@@ -2,14 +2,14 @@
namespace IQDEV\ElasticSearchTests\Filter; namespace IQDEV\ElasticSearchTests\Filter;
use IQDEV\ElasticSearch\Criteria; use IQDEV\ElasticSearch\Criteria\Criteria;
use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection; use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection;
use IQDEV\ElasticSearch\Request\Filter\Field; use IQDEV\ElasticSearch\Criteria\Filter\Field;
use IQDEV\ElasticSearch\Request\Filter\Filter; use IQDEV\ElasticSearch\Criteria\Filter\Filter;
use IQDEV\ElasticSearch\Request\Filter\FilterOperator; use IQDEV\ElasticSearch\Criteria\Filter\FilterOperator;
use IQDEV\ElasticSearch\Request\Filter\Value\FilterKeyword; use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterKeyword;
use IQDEV\ElasticSearch\Request\Filter\Value\FilterNumber; use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterNumber;
use IQDEV\ElasticSearch\Request\Query\SearchQuery; use IQDEV\ElasticSearch\Criteria\Query\SearchQuery;
use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\AbstractTestCase;
use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Helpers\FormatData;
use IQDEV\ElasticSearchTests\Service\SearchClient; use IQDEV\ElasticSearchTests\Service\SearchClient;
......
...@@ -3,9 +3,8 @@ ...@@ -3,9 +3,8 @@
namespace IQDEV\ElasticSearchTests\Filter; namespace IQDEV\ElasticSearchTests\Filter;
use Elastic\Elasticsearch\Client; use Elastic\Elasticsearch\Client;
use IQDEV\ElasticSearch\Config\Mapping\ProductMapping;
use IQDEV\ElasticSearch\Configuration; use IQDEV\ElasticSearch\Configuration;
use IQDEV\ElasticSearch\Converter\EsResponseToResult; use IQDEV\ElasticSearch\Converter\Result\EsResponseToResult;
use IQDEV\ElasticSearch\Indexer\IndexRunner; use IQDEV\ElasticSearch\Indexer\IndexRunner;
use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\AbstractTestCase;
use IQDEV\ElasticSearchTests\Config\ChangingStateConfiguration; use IQDEV\ElasticSearchTests\Config\ChangingStateConfiguration;
...@@ -35,7 +34,7 @@ class IndexesTest extends AbstractTestCase ...@@ -35,7 +34,7 @@ class IndexesTest extends AbstractTestCase
{ {
parent::__construct($name, $data, $dataName); parent::__construct($name, $data, $dataName);
$this->configuration = new ChangingStateConfiguration(new ProductMapping()); $this->configuration = new ChangingStateConfiguration();
$this->esClient = ClientFactory::create(); $this->esClient = ClientFactory::create();
$this->indexRunner = new IndexRunner( $this->indexRunner = new IndexRunner(
...@@ -70,7 +69,7 @@ class IndexesTest extends AbstractTestCase ...@@ -70,7 +69,7 @@ class IndexesTest extends AbstractTestCase
] ]
]); ]);
$esResponseToResult = new EsResponseToResult(); $esResponseToResult = new EsResponseToResult();
$result = $esResponseToResult->fromResponse($response); $result = $esResponseToResult->fromResponse($response, $this->configuration);
unset($updateData['type']); unset($updateData['type']);
$expected = [ $expected = [
...@@ -81,4 +80,4 @@ class IndexesTest extends AbstractTestCase ...@@ -81,4 +80,4 @@ class IndexesTest extends AbstractTestCase
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataProducts($result)); $this->assertEqualsCanonicalizing($expected, FormatData::formatDataProducts($result));
} }
} }
\ No newline at end of file
...@@ -2,15 +2,15 @@ ...@@ -2,15 +2,15 @@
namespace IQDEV\ElasticSearchTests\Filter; namespace IQDEV\ElasticSearchTests\Filter;
use IQDEV\ElasticSearch\Criteria; use IQDEV\ElasticSearch\Criteria\Criteria;
use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection;
use IQDEV\ElasticSearch\Criteria\Filter\Field;
use IQDEV\ElasticSearch\Criteria\Filter\Filter;
use IQDEV\ElasticSearch\Criteria\Filter\FilterOperator;
use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterKeyword;
use IQDEV\ElasticSearch\Criteria\Query\SearchQuery;
use IQDEV\ElasticSearch\Criteria\Search\Search;
use IQDEV\ElasticSearch\Document\Property\Property; use IQDEV\ElasticSearch\Document\Property\Property;
use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection;
use IQDEV\ElasticSearch\Request\Filter\Field;
use IQDEV\ElasticSearch\Request\Filter\Filter;
use IQDEV\ElasticSearch\Request\Filter\FilterOperator;
use IQDEV\ElasticSearch\Request\Filter\Value\FilterKeyword;
use IQDEV\ElasticSearch\Request\Query\SearchQuery;
use IQDEV\ElasticSearch\Request\Search\Search;
use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\AbstractTestCase;
use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Helpers\FormatData;
use IQDEV\ElasticSearchTests\Service\SearchClient; use IQDEV\ElasticSearchTests\Service\SearchClient;
......
...@@ -2,16 +2,16 @@ ...@@ -2,16 +2,16 @@
namespace IQDEV\ElasticSearchTests\Filter; namespace IQDEV\ElasticSearchTests\Filter;
use IQDEV\ElasticSearch\Criteria; use IQDEV\ElasticSearch\Criteria\Criteria;
use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection; use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection;
use IQDEV\ElasticSearch\Request\Filter\Field; use IQDEV\ElasticSearch\Criteria\Filter\Field;
use IQDEV\ElasticSearch\Request\Filter\Filter; use IQDEV\ElasticSearch\Criteria\Filter\Filter;
use IQDEV\ElasticSearch\Request\Filter\FilterOperator; use IQDEV\ElasticSearch\Criteria\Filter\FilterOperator;
use IQDEV\ElasticSearch\Request\Filter\FilterType; use IQDEV\ElasticSearch\Criteria\Filter\FilterType;
use IQDEV\ElasticSearch\Request\Filter\LogicOperator; use IQDEV\ElasticSearch\Criteria\Filter\LogicOperator;
use IQDEV\ElasticSearch\Request\Filter\Value\FilterKeyword; use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterKeyword;
use IQDEV\ElasticSearch\Request\Filter\Value\FilterNumber; use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterNumber;
use IQDEV\ElasticSearch\Request\Query\SearchQuery; use IQDEV\ElasticSearch\Criteria\Query\SearchQuery;
use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\AbstractTestCase;
use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Helpers\FormatData;
use IQDEV\ElasticSearchTests\Service\SearchClient; use IQDEV\ElasticSearchTests\Service\SearchClient;
......
...@@ -3,20 +3,18 @@ ...@@ -3,20 +3,18 @@
namespace IQDEV\ElasticSearchTests\Filter; namespace IQDEV\ElasticSearchTests\Filter;
use IQDEV\ElasticSearch\Config\BaseConfiguration; use IQDEV\ElasticSearch\Config\BaseConfiguration;
use IQDEV\ElasticSearch\Config\Mapping\ProductMapping; use IQDEV\ElasticSearch\Converter\Request\CriteriaToRequest;
use IQDEV\ElasticSearch\Converter\CriteriaToEsRequest; use IQDEV\ElasticSearch\Criteria\Criteria;
use IQDEV\ElasticSearch\Converter\CriteriaToRequest; use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection;
use IQDEV\ElasticSearch\Criteria; use IQDEV\ElasticSearch\Criteria\Filter\Field;
use IQDEV\ElasticSearch\Criteria\Filter\Filter;
use IQDEV\ElasticSearch\Criteria\Filter\FilterOperator;
use IQDEV\ElasticSearch\Criteria\Filter\FilterType;
use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterKeyword;
use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterNumber;
use IQDEV\ElasticSearch\Criteria\Query\SearchQuery;
use IQDEV\ElasticSearch\Criteria\Search\Search;
use IQDEV\ElasticSearch\Document\Property\Property; use IQDEV\ElasticSearch\Document\Property\Property;
use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection;
use IQDEV\ElasticSearch\Request\Filter\Field;
use IQDEV\ElasticSearch\Request\Filter\Filter;
use IQDEV\ElasticSearch\Request\Filter\FilterOperator;
use IQDEV\ElasticSearch\Request\Filter\FilterType;
use IQDEV\ElasticSearch\Request\Filter\Value\FilterKeyword;
use IQDEV\ElasticSearch\Request\Filter\Value\FilterNumber;
use IQDEV\ElasticSearch\Request\Query\SearchQuery;
use IQDEV\ElasticSearch\Request\Search\Search;
use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\AbstractTestCase;
use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Helpers\FormatData;
use IQDEV\ElasticSearchTests\Service\SearchClient; use IQDEV\ElasticSearchTests\Service\SearchClient;
...@@ -97,9 +95,9 @@ class QueryTest extends AbstractTestCase ...@@ -97,9 +95,9 @@ class QueryTest extends AbstractTestCase
// Получение классов с данными для запроса в es // Получение классов с данными для запроса в es
$criteriaToEsRequest = new CriteriaToRequest(new BaseConfiguration(new ProductMapping())); $criteriaToRequest = new CriteriaToRequest(new BaseConfiguration());
$requestPost = $criteriaToEsRequest->fromCriteria($criteriaPost); $requestPost = $criteriaToRequest->fromCriteria($criteriaPost);
$requestQuery = $criteriaToEsRequest->fromCriteria($criteriaQuery); $requestQuery = $criteriaToRequest->fromCriteria($criteriaQuery);
$expectedFilter = [ $expectedFilter = [
[ [
...@@ -110,18 +108,21 @@ class QueryTest extends AbstractTestCase ...@@ -110,18 +108,21 @@ class QueryTest extends AbstractTestCase
"filter" => [ "filter" => [
[ [
"nested" => [ "nested" => [
"path" => "search_data.keyword_facet", "path" => "search_data.number_facet",
"query" => [ "query" => [
"bool" => [ "bool" => [
"filter" => [ "filter" => [
[ [
"term" => [ "term" => [
"search_data.keyword_facet.facet_code" => $filter['brand']['key'] "search_data.number_facet.facet_code" => $filter['price']['key']
] ]
], ],
[ [
"term" => [ "range" => [
"search_data.keyword_facet.facet_value" => $filter['brand']['value'] "search_data.number_facet.facet_value" => [
"lt" => $filter['price']['min'],
"gt" => $filter['price']['max'],
]
] ]
] ]
] ]
...@@ -142,21 +143,18 @@ class QueryTest extends AbstractTestCase ...@@ -142,21 +143,18 @@ class QueryTest extends AbstractTestCase
"filter" => [ "filter" => [
[ [
"nested" => [ "nested" => [
"path" => "search_data.number_facet", "path" => "search_data.keyword_facet",
"query" => [ "query" => [
"bool" => [ "bool" => [
"filter" => [ "filter" => [
[ [
"term" => [ "term" => [
"search_data.number_facet.facet_code" => $filter['price']['key'] "search_data.keyword_facet.facet_code" => $filter['brand']['key']
] ]
], ],
[ [
"range" => [ "term" => [
"search_data.number_facet.facet_value" => [ "search_data.keyword_facet.facet_value" => $filter['brand']['value']
"lt" => $filter['price']['min'],
"gt" => $filter['price']['max'],
]
] ]
] ]
] ]
...@@ -168,7 +166,7 @@ class QueryTest extends AbstractTestCase ...@@ -168,7 +166,7 @@ class QueryTest extends AbstractTestCase
] ]
] ]
] ]
] ],
]; ];
$expected = [ $expected = [
"query" => [ "query" => [
...@@ -184,7 +182,6 @@ class QueryTest extends AbstractTestCase ...@@ -184,7 +182,6 @@ class QueryTest extends AbstractTestCase
], ],
]; ];
$this->assertArray( $this->assertArray(
array_merge($expected, [ array_merge($expected, [
"query" => [ "query" => [
...@@ -251,8 +248,8 @@ class QueryTest extends AbstractTestCase ...@@ -251,8 +248,8 @@ class QueryTest extends AbstractTestCase
$criteria->getFilters()->add($filterCollectionQueryPrice); $criteria->getFilters()->add($filterCollectionQueryPrice);
$criteriaToEsRequest = new CriteriaToRequest(new BaseConfiguration(new ProductMapping())); $criteriaToRequest = new CriteriaToRequest(new BaseConfiguration());
$request = $criteriaToEsRequest->fromCriteria($criteria); $request = $criteriaToRequest->fromCriteria($criteria);
$expected = [ $expected = [
...@@ -493,4 +490,147 @@ class QueryTest extends AbstractTestCase ...@@ -493,4 +490,147 @@ class QueryTest extends AbstractTestCase
$this->assertEqualsCanonicalizing($expected, FormatData::formatDataWFacets($result)); $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,13 +2,13 @@ ...@@ -2,13 +2,13 @@
namespace IQDEV\ElasticSearchTests\Filter; namespace IQDEV\ElasticSearchTests\Filter;
use IQDEV\ElasticSearch\Criteria; use IQDEV\ElasticSearch\Criteria\Criteria;
use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection; use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection;
use IQDEV\ElasticSearch\Request\Filter\Field; use IQDEV\ElasticSearch\Criteria\Filter\Field;
use IQDEV\ElasticSearch\Request\Filter\Filter; use IQDEV\ElasticSearch\Criteria\Filter\Filter;
use IQDEV\ElasticSearch\Request\Filter\FilterOperator; use IQDEV\ElasticSearch\Criteria\Filter\FilterOperator;
use IQDEV\ElasticSearch\Request\Filter\Value\FilterNumber; use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterNumber;
use IQDEV\ElasticSearch\Request\Query\SearchQuery; use IQDEV\ElasticSearch\Criteria\Query\SearchQuery;
use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\AbstractTestCase;
use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Helpers\FormatData;
use IQDEV\ElasticSearchTests\Service\SearchClient; use IQDEV\ElasticSearchTests\Service\SearchClient;
......
...@@ -2,11 +2,11 @@ ...@@ -2,11 +2,11 @@
namespace IQDEV\ElasticSearchTests\Filter; namespace IQDEV\ElasticSearchTests\Filter;
use IQDEV\ElasticSearch\Criteria; use IQDEV\ElasticSearch\Criteria\Criteria;
use IQDEV\ElasticSearch\Criteria\Query\SearchQuery;
use IQDEV\ElasticSearch\Criteria\Search\Search;
use IQDEV\ElasticSearch\Document\Property\Property; use IQDEV\ElasticSearch\Document\Property\Property;
use IQDEV\ElasticSearch\Document\Property\PropertyType; use IQDEV\ElasticSearch\Document\Property\PropertyType;
use IQDEV\ElasticSearch\Request\Query\SearchQuery;
use IQDEV\ElasticSearch\Request\Search\Search;
use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\AbstractTestCase;
use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Helpers\FormatData;
use IQDEV\ElasticSearchTests\Service\SearchClient; use IQDEV\ElasticSearchTests\Service\SearchClient;
......
...@@ -2,12 +2,12 @@ ...@@ -2,12 +2,12 @@
namespace IQDEV\ElasticSearchTests\Filter; namespace IQDEV\ElasticSearchTests\Filter;
use IQDEV\ElasticSearch\Criteria; use IQDEV\ElasticSearch\Criteria\Criteria;
use IQDEV\ElasticSearch\Criteria\Order\OrderDirection;
use IQDEV\ElasticSearch\Criteria\Order\OrderFactory;
use IQDEV\ElasticSearch\Criteria\Query\SearchQuery;
use IQDEV\ElasticSearch\Document\Property\Property; use IQDEV\ElasticSearch\Document\Property\Property;
use IQDEV\ElasticSearch\Document\Property\PropertyType; use IQDEV\ElasticSearch\Document\Property\PropertyType;
use IQDEV\ElasticSearch\Request\Order\OrderDirection;
use IQDEV\ElasticSearch\Request\Order\OrderFactory;
use IQDEV\ElasticSearch\Request\Query\SearchQuery;
use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\AbstractTestCase;
use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Helpers\FormatData;
use IQDEV\ElasticSearchTests\Service\SearchClient; use IQDEV\ElasticSearchTests\Service\SearchClient;
......
...@@ -4,16 +4,16 @@ declare(strict_types=1); ...@@ -4,16 +4,16 @@ declare(strict_types=1);
namespace IQDEV\ElasticSearchTests\Filter; namespace IQDEV\ElasticSearchTests\Filter;
use IQDEV\ElasticSearch\Criteria; use IQDEV\ElasticSearch\Criteria\Criteria;
use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection;
use IQDEV\ElasticSearch\Criteria\Filter\Field;
use IQDEV\ElasticSearch\Criteria\Filter\Filter;
use IQDEV\ElasticSearch\Criteria\Filter\FilterOperator;
use IQDEV\ElasticSearch\Criteria\Filter\LogicOperator;
use IQDEV\ElasticSearch\Criteria\Filter\Value\FilterKeyword;
use IQDEV\ElasticSearch\Criteria\Query\SearchQuery;
use IQDEV\ElasticSearch\Criteria\Search\Search;
use IQDEV\ElasticSearch\Document\Property\Property; use IQDEV\ElasticSearch\Document\Property\Property;
use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection;
use IQDEV\ElasticSearch\Request\Filter\Field;
use IQDEV\ElasticSearch\Request\Filter\Filter;
use IQDEV\ElasticSearch\Request\Filter\FilterOperator;
use IQDEV\ElasticSearch\Request\Filter\LogicOperator;
use IQDEV\ElasticSearch\Request\Filter\Value\FilterKeyword;
use IQDEV\ElasticSearch\Request\Query\SearchQuery;
use IQDEV\ElasticSearch\Request\Search\Search;
use IQDEV\ElasticSearchTests\AbstractTestCase; use IQDEV\ElasticSearchTests\AbstractTestCase;
use IQDEV\ElasticSearchTests\Helpers\FormatData; use IQDEV\ElasticSearchTests\Helpers\FormatData;
use IQDEV\ElasticSearchTests\Service\SearchClient; use IQDEV\ElasticSearchTests\Service\SearchClient;
...@@ -226,4 +226,71 @@ class UpdatedSearchTest extends AbstractTestCase ...@@ -226,4 +226,71 @@ class UpdatedSearchTest extends AbstractTestCase
$this->assertEqualsCanonicalizing($expected, FormatData::formatData($result)); $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));
}
} }
...@@ -61,6 +61,9 @@ class TestIndexProvider implements IndexProvider ...@@ -61,6 +61,9 @@ class TestIndexProvider implements IndexProvider
} }
} }
$document->setByConfiguration($this->configuration, 'new', $product['new']);
$document->setByConfiguration($this->configuration, 'rating', $product['rating']);
$product['type'] = $product['type'] ?? null; $product['type'] = $product['type'] ?? null;
switch ($product['type']) { switch ($product['type']) {
case 'update': case 'update':
...@@ -119,4 +122,4 @@ class TestIndexProvider implements IndexProvider ...@@ -119,4 +122,4 @@ class TestIndexProvider implements IndexProvider
{ {
return null; return null;
} }
} }
\ No newline at end of file
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
namespace IQDEV\ElasticSearchTests\Seed; namespace IQDEV\ElasticSearchTests\Seed;
use IQDEV\ElasticSearch\Config\BaseConfiguration; use IQDEV\ElasticSearch\Config\BaseConfiguration;
use IQDEV\ElasticSearch\Config\Mapping\ProductMapping;
use IQDEV\ElasticSearch\Configuration; use IQDEV\ElasticSearch\Configuration;
use IQDEV\ElasticSearch\Indexer\IndexRunner; use IQDEV\ElasticSearch\Indexer\IndexRunner;
use IQDEV\ElasticSearchTests\Factory\ClientFactory; use IQDEV\ElasticSearchTests\Factory\ClientFactory;
...@@ -18,7 +17,7 @@ class DefaultSeed ...@@ -18,7 +17,7 @@ class DefaultSeed
public function __construct() public function __construct()
{ {
$this->configuration = new BaseConfiguration(new ProductMapping()); $this->configuration = new BaseConfiguration();
$this->indexRunner = new IndexRunner( $this->indexRunner = new IndexRunner(
ClientFactory::create(), ClientFactory::create(),
...@@ -36,6 +35,8 @@ class DefaultSeed ...@@ -36,6 +35,8 @@ class DefaultSeed
'category' => 'shoes', 'category' => 'shoes',
'properties' => ['brand' => 'adidas', 'color' => 'green', 'size' => 46,'price' => 100], 'properties' => ['brand' => 'adidas', 'color' => 'green', 'size' => 46,'price' => 100],
'year' => 2014, 'year' => 2014,
'new' => false,
'rating' => 3,
], ],
[ [
'id' => 's2', 'id' => 's2',
...@@ -43,6 +44,8 @@ class DefaultSeed ...@@ -43,6 +44,8 @@ class DefaultSeed
'category' => 'shoes', 'category' => 'shoes',
'properties' => ['brand' => 'adidas', 'color' => 'red', 'size' => 47,'price' => 101], 'properties' => ['brand' => 'adidas', 'color' => 'red', 'size' => 47,'price' => 101],
'year' => 2023, 'year' => 2023,
'new' => true,
'rating' => 3,
], ],
[ [
'id' => 's3', 'id' => 's3',
...@@ -50,6 +53,8 @@ class DefaultSeed ...@@ -50,6 +53,8 @@ class DefaultSeed
'category' => 'shoes', 'category' => 'shoes',
'properties' => ['brand' => 'rebook', 'color' => 'blue', 'size' => 47,'price' => 102], 'properties' => ['brand' => 'rebook', 'color' => 'blue', 'size' => 47,'price' => 102],
'year' => 1980, 'year' => 1980,
'new' => false,
'rating' => 3,
], ],
[ [
'id' => 's4', 'id' => 's4',
...@@ -57,6 +62,8 @@ class DefaultSeed ...@@ -57,6 +62,8 @@ class DefaultSeed
'category' => 'shoes', 'category' => 'shoes',
'properties' => ['brand' => 'nike', 'color' => 'green', 'size' => 43,'price' => 103], 'properties' => ['brand' => 'nike', 'color' => 'green', 'size' => 43,'price' => 103],
'year' => 2014, 'year' => 2014,
'new' => true,
'rating' => 5,
], ],
[ [
'id' => 'h1', 'id' => 'h1',
...@@ -64,6 +71,8 @@ class DefaultSeed ...@@ -64,6 +71,8 @@ class DefaultSeed
'category' => 't-short', 'category' => 't-short',
'properties' => ['brand' => 'nike', 'color' => 'red', 'size' => 'xl','price' => 104], 'properties' => ['brand' => 'nike', 'color' => 'red', 'size' => 'xl','price' => 104],
'year' => 2010, 'year' => 2010,
'new' => true,
'rating' => 4,
], ],
[ [
'id' => 'h2', 'id' => 'h2',
...@@ -71,6 +80,8 @@ class DefaultSeed ...@@ -71,6 +80,8 @@ class DefaultSeed
'category' => 't-short', 'category' => 't-short',
'properties' => ['brand' => 'nike', 'color' => 'white', 'size' => 'xxl','price' => 105], 'properties' => ['brand' => 'nike', 'color' => 'white', 'size' => 'xxl','price' => 105],
'year' => 2000, 'year' => 2000,
'new' => true,
'rating' => 3,
], ],
[ [
'id' => 'h3', 'id' => 'h3',
...@@ -78,6 +89,8 @@ class DefaultSeed ...@@ -78,6 +89,8 @@ class DefaultSeed
'category' => 't-short', 'category' => 't-short',
'properties' => ['brand' => 'rebook', 'color' => 'white', 'size' => 'xl','price' => 106], 'properties' => ['brand' => 'rebook', 'color' => 'white', 'size' => 'xl','price' => 106],
'year' => 1990, 'year' => 1990,
'new' => true,
'rating' => 3,
], ],
[ [
'id' => 'p1', 'id' => 'p1',
...@@ -85,9 +98,11 @@ class DefaultSeed ...@@ -85,9 +98,11 @@ class DefaultSeed
'category' => 'prices', 'category' => 'prices',
'properties' => ['brand' => 'rebook', 'color' => 'white', 'size' => 'xl','price' => 107], 'properties' => ['brand' => 'rebook', 'color' => 'white', 'size' => 'xl','price' => 107],
'year' => 2015, 'year' => 2015,
'new' => false,
'rating' => 3,
], ],
]); ]);
$this->indexRunner->run($provider); $this->indexRunner->run($provider);
} }
} }
\ No newline at end of file
...@@ -3,8 +3,7 @@ ...@@ -3,8 +3,7 @@
namespace IQDEV\ElasticSearchTests\Service; namespace IQDEV\ElasticSearchTests\Service;
use IQDEV\ElasticSearch\Config\BaseConfiguration as Configuration; use IQDEV\ElasticSearch\Config\BaseConfiguration as Configuration;
use IQDEV\ElasticSearch\Config\Mapping\ProductMapping; use IQDEV\ElasticSearch\Criteria\Query\SearchQueryHandler;
use IQDEV\ElasticSearch\Request\Query\SearchQueryHandler;
use IQDEV\ElasticSearch\SearchService; use IQDEV\ElasticSearch\SearchService;
use IQDEV\ElasticSearchTests\Factory\ClientFactory; use IQDEV\ElasticSearchTests\Factory\ClientFactory;
...@@ -20,7 +19,7 @@ class SearchClient ...@@ -20,7 +19,7 @@ class SearchClient
static::$oInstance = new SearchQueryHandler( static::$oInstance = new SearchQueryHandler(
new SearchService( new SearchService(
ClientFactory::create(), ClientFactory::create(),
new Configuration(new ProductMapping()), new Configuration(),
) )
); );
} }
......