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 143 additions and 37 deletions
......@@ -11,9 +11,9 @@ use IQDEV\ElasticSearch\Converter\Request\Collection\PropertyFilterCollection;
use IQDEV\ElasticSearch\Converter\Request\Filter\AbstractFilterQuery;
use IQDEV\ElasticSearch\Converter\Request\Filter\NestedFilter;
use IQDEV\ElasticSearch\Converter\Request\Filter\PropertyFilter;
use IQDEV\ElasticSearch\Request\Filter\Collection\FilterCollection;
use IQDEV\ElasticSearch\Request\Filter\Collection\FilterGroupCollection;
use IQDEV\ElasticSearch\Request\Filter\Filter;
use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterCollection;
use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterGroupCollection;
use IQDEV\ElasticSearch\Criteria\Filter\Filter;
use IQDEV\ElasticSearch\Search\BoolQuery\Query;
use IQDEV\ElasticSearch\Search\Nested;
......@@ -34,8 +34,13 @@ class FilterQuery
{
[$propertyFilterCollection, $nestedFilterCollection] = $this->separatePropertyTypes($this->filterCollection);
$this->fillQuery($propertyFilterCollection, new PropertyFilter());
$this->fillQuery($nestedFilterCollection, new NestedFilter());
if (false === $propertyFilterCollection->isEmpty()) {
$this->fillQuery($propertyFilterCollection, new PropertyFilter());
}
if (false === $nestedFilterCollection->isEmpty()) {
$this->fillQuery($nestedFilterCollection, new NestedFilter());
}
}
private function fillQuery(FilterCollection $filterCollection, AbstractFilterQuery $filterQuery): void
......
<?php
namespace IQDEV\ElasticSearch\Converter;
namespace IQDEV\ElasticSearch\Converter\Result;
use Elastic\Elasticsearch\Response\Elasticsearch;
use IQDEV\ElasticSearch\Configuration;
use IQDEV\ElasticSearch\Document\Product;
use IQDEV\ElasticSearch\Facet\FacetType;
use IQDEV\ElasticSearch\Facet\FacetResult;
use IQDEV\ElasticSearch\Facet\FacetType;
use IQDEV\ElasticSearch\Facet\Item\FacetItemList;
use IQDEV\ElasticSearch\Facet\Item\FacetItemRange;
use IQDEV\ElasticSearch\Facet\Item\FacetItemRangeDTO;
......@@ -13,7 +14,7 @@ use IQDEV\ElasticSearch\Result;
final class EsResponseToResult
{
public function fromResponse(Elasticsearch $response): Result
public function fromResponse(Elasticsearch $response, Configuration $configuration): Result
{
$catalogSearchResult = new Result();
......@@ -41,6 +42,8 @@ final class EsResponseToResult
$this->parseNumberFacet($data, $catalogSearchResult);
}
$this->parsePropertyFacet($data, $catalogSearchResult, $configuration);
return $catalogSearchResult;
}
......@@ -93,10 +96,12 @@ final class EsResponseToResult
$facet = new FacetResult(FacetType::LIST, $code);
foreach ($valueBucket as $value) {
$count = 0;
$count = $value['doc_count'];
if (isset($bucketsFiltered[$code][$value['key']])) {
$count = $bucketsFiltered[$code][$value['key']]['doc_count'];
} elseif (isset($bucketsFiltered[$code])) {
$count = 0;
}
$facet->products->add(
......@@ -150,4 +155,30 @@ final class EsResponseToResult
$catalogSearchResult->getFacets()->add($facet);
}
}
private function parsePropertyFacet(array $data, Result $catalogSearchResult, Configuration $configuration)
{
$properties = array_keys($configuration->getMapping()['properties']);
foreach ($data['aggregations'] as $key => $aggs) {
if (!in_array($key, $properties, true)) {
continue;
}
$facet = new FacetResult(FacetType::LIST, $key);
$buckets = array_key_exists('buckets', $aggs) ? $aggs['buckets'] : $aggs[$key]['buckets'];
foreach ($buckets as $bucket) {
$code = $bucket['key'];
$count = $bucket['doc_count'];
$facet->products->add(
FacetItemList::create(
$code,
$count
)
);
}
$catalogSearchResult->getFacets()->add($facet);
}
}
}
<?php
declare(strict_types=1);
namespace IQDEV\ElasticSearch\Criteria\Aggs;
use IQDEV\ElasticSearch\Document\Property\Property;
class Aggs
{
public function __construct(
private readonly Property $property,
) {
}
public function getProperty(): Property
{
return $this->property;
}
}
<?php
namespace IQDEV\ElasticSearch\Criteria\Aggs;
use Ramsey\Collection\AbstractCollection;
class AggsCollection extends AbstractCollection
{
/**
* @inheritDoc
*/
public function getType(): string
{
return Aggs::class;
}
}
<?php
namespace IQDEV\ElasticSearch;
namespace IQDEV\ElasticSearch\Criteria;
use IQDEV\ElasticSearch\Request\Filter\Collection\FilterCollection;
use IQDEV\ElasticSearch\Request\Order\OrderCollection;
use IQDEV\ElasticSearch\Request\Search\SearchCollection;
use IQDEV\ElasticSearch\Criteria\Aggs\AggsCollection;
use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterCollection;
use IQDEV\ElasticSearch\Criteria\Order\OrderCollection;
use IQDEV\ElasticSearch\Criteria\Search\SearchCollection;
final class Criteria
{
......@@ -13,12 +14,15 @@ final class Criteria
private OrderCollection $sorting;
private Pagination $pagination;
private AggsCollection $aggregations;
public function __construct()
{
$this->search = new SearchCollection();
$this->filters = new FilterCollection();
$this->sorting = new OrderCollection();
$this->pagination = new Pagination();
$this->aggregations = new AggsCollection();
}
public function getSearch(): SearchCollection
......@@ -41,11 +45,17 @@ final class Criteria
return $this->pagination;
}
public function getAggs(): AggsCollection
{
return $this->aggregations;
}
public function __clone(): void
{
$this->search = clone $this->search;
$this->filters = clone $this->filters;
$this->sorting = clone $this->sorting;
$this->pagination = clone $this->pagination;
$this->aggregations = clone $this->aggregations;
}
}
<?php
namespace IQDEV\ElasticSearch\Request\Filter\Collection;
namespace IQDEV\ElasticSearch\Criteria\Filter\Collection;
use IQDEV\ElasticSearch\Request\Filter\Filter;
use IQDEV\ElasticSearch\Request\Filter\FilterOperator;
use IQDEV\ElasticSearch\Request\Filter\FilterType;
use IQDEV\ElasticSearch\Request\Filter\LogicOperator;
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 Ramsey\Collection\AbstractCollection;
/**
......
<?php
namespace IQDEV\ElasticSearch\Request\Filter\Collection;
namespace IQDEV\ElasticSearch\Criteria\Filter\Collection;
use IQDEV\ElasticSearch\Request\Filter\Filter;
use IQDEV\ElasticSearch\Request\Filter\FilterOperator;
use IQDEV\ElasticSearch\Request\Filter\FilterType;
use IQDEV\ElasticSearch\Request\Filter\LogicOperator;
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 Ramsey\Collection\AbstractCollection;
/**
......
<?php
namespace IQDEV\ElasticSearch\Request\Filter\Collection;
namespace IQDEV\ElasticSearch\Criteria\Filter\Collection;
class PostFilterCollection extends FilterCollection
{
......
<?php
namespace IQDEV\ElasticSearch\Request\Filter\Collection;
namespace IQDEV\ElasticSearch\Criteria\Filter\Collection;
class QueryFilterCollection extends FilterCollection
{
......
<?php
namespace IQDEV\ElasticSearch\Request\Filter;
namespace IQDEV\ElasticSearch\Criteria\Filter;
final class Field
{
......
<?php
namespace IQDEV\ElasticSearch\Request\Filter;
namespace IQDEV\ElasticSearch\Criteria\Filter;
final class Filter
{
......
<?php
namespace IQDEV\ElasticSearch\Request\Filter;
namespace IQDEV\ElasticSearch\Criteria\Filter;
enum FilterOperator: string
{
......
<?php
namespace IQDEV\ElasticSearch\Request\Filter;
namespace IQDEV\ElasticSearch\Criteria\Filter;
enum FilterType
{
......
<?php
namespace IQDEV\ElasticSearch\Request\Filter;
namespace IQDEV\ElasticSearch\Criteria\Filter;
interface FilterValue
{
......
<?php
namespace IQDEV\ElasticSearch\Request\Filter;
namespace IQDEV\ElasticSearch\Criteria\Filter;
enum LogicOperator: string
{
......
<?php
namespace IQDEV\ElasticSearch\Request\Filter\Value;
namespace IQDEV\ElasticSearch\Criteria\Filter\Value;
use IQDEV\ElasticSearch\Request\Filter\FilterValue;
use IQDEV\ElasticSearch\Criteria\Filter\FilterValue;
class FilterKeyword implements FilterValue
{
/**
* @param string|string[] $value
* @param string|string[]|bool $value
*/
public function __construct(
public string|array $value
public string|array|bool $value
) {
}
/**
* @return string|string[]
* @return string|string[]|bool
*/
public function value(): string|array
public function value(): string|array|bool
{
return $this->value;
}
......
<?php
namespace IQDEV\ElasticSearch\Request\Filter\Value;
namespace IQDEV\ElasticSearch\Criteria\Filter\Value;
use IQDEV\ElasticSearch\Request\Filter\FilterValue;
use IQDEV\ElasticSearch\Criteria\Filter\FilterValue;
class FilterNumber implements FilterValue
{
......
......@@ -2,7 +2,7 @@
declare(strict_types=1);
namespace IQDEV\ElasticSearch\Request\Match;
namespace IQDEV\ElasticSearch\Criteria\Match;
use IQDEV\ElasticSearch\Esable;
......@@ -10,7 +10,7 @@ class QueryMatch implements Esable
{
public function __construct(
private readonly string $key,
private readonly string $value,
private readonly mixed $value,
) {
}
......
......@@ -2,7 +2,7 @@
declare(strict_types=1);
namespace IQDEV\ElasticSearch\Request\Match;
namespace IQDEV\ElasticSearch\Criteria\Match;
use IQDEV\ElasticSearch\Esable;
use Ramsey\Collection\AbstractCollection;
......
<?php
namespace IQDEV\ElasticSearch\Request\Order;
namespace IQDEV\ElasticSearch\Criteria\Order;
use IQDEV\ElasticSearch\Document\Property\Property;
use IQDEV\ElasticSearch\Esable;
......