Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
namespace IQDEV\ElasticSearch\Converter;
use Elastic\Elasticsearch\Response\Elasticsearch;
use IQDEV\Search\Document\Product;
use IQDEV\Search\Facet\Facet;
use IQDEV\Search\Facet\Item\FacetItemList;
use IQDEV\Search\Facet\Item\FacetItemRange;
use IQDEV\Search\Facet\Item\FacetItemRangeDTO;
use IQDEV\Search\Facet\Type\FacetListType;
use IQDEV\Search\Facet\Type\FacetRangeType;
use IQDEV\Search\Result;
final class EsResponseToResult
{
public function fromResponse(Elasticsearch $response): Result
{
$catalogSearchResult = new Result();
$data = $response->asArray();
if (isset($data['hits']['hits'])) {
foreach ($data['hits']['hits'] as $hit) {
if (isset($hit['_source'])) {
try {
$product = $this->productFromArray($hit['_source']);
$catalogSearchResult->getProducts()->add($product);
} catch (\Throwable $ex) {
continue;
}
}
}
$catalogSearchResult->setTotal((int)$data['hits']['total']['value']);
}
if (isset($data['aggregations']['keyword_facet']['agg_keyword_facet_code']['buckets'])) {
$buckets = $data['aggregations']['keyword_facet']['agg_keyword_facet_code']['buckets'];
$bucketsFiltered = [];
if (isset($data['aggregations']['keyword_facet_filtered']['all_keyword_facet_filtered']['agg_keyword_facet_code']['buckets'])) {
foreach ($data['aggregations']['keyword_facet_filtered']['all_keyword_facet_filtered']['agg_keyword_facet_code']['buckets'] as $bucket) {
$bucketsFiltered[$bucket['key']] = [];
foreach ($bucket['agg_keyword_facet_value']['buckets'] as $values) {
$bucketsFiltered[$bucket['key']][$values['key']] = $values;
}
}
}
foreach ($buckets as $bucket) {
$code = $bucket['key'];
if (isset($data['aggregations']["keyword_facet_$code"]['agg_special']['agg_keyword_facet_code']['buckets'])) {
$bucketsFiltered[$code] = [];
foreach ($data['aggregations']["keyword_facet_$code"]['agg_special']['agg_keyword_facet_code']['buckets'] as $filteredBucket) {
if ($filteredBucket['key'] === $code) {
foreach ($filteredBucket['agg_keyword_facet_value']['buckets'] as $values) {
$bucketsFiltered[$code][$values['key']] = $values;
}
}
}
}
}
$bucketsFiltered = array_filter($bucketsFiltered);
foreach ($buckets as $bucket) {
$code = $bucket['key'];
$valueBucket = $bucket['agg_keyword_facet_value']['buckets'];
$facet = new Facet(new FacetListType(), $code);
foreach ($valueBucket as $value) {
$count = 0;
if (isset($bucketsFiltered[$code][$value['key']])) {
$count = $bucketsFiltered[$code][$value['key']]['doc_count'];
}
$facet->products->add(
FacetItemList::create(
$value['key'],
$count,
isset($bucketsFiltered[$code][$value['key']])
)
);
}
$catalogSearchResult->getFacets()->add($facet);
}
}
if (isset($data['aggregations']['number_facet']['agg_number_facet_code']['buckets'])) {
$buckets = $data['aggregations']['number_facet']['agg_number_facet_code']['buckets'];
$bucketsFiltered = [];
if (isset($data['aggregations']['number_facet_filtered']['all_number_facet_filtered']['agg_number_facet_code']['buckets'])) {
foreach ($data['aggregations']['number_facet_filtered']['all_number_facet_filtered']['agg_number_facet_code']['buckets'] as $bucket) {
$bucketsFiltered[$bucket['key']] = $bucket['agg_number_facet_value'];
}
}
foreach ($buckets as $bucket) {
$code = $bucket['key'];
$workBucket = $bucket['agg_number_facet_value'];
$selectedBuket = !empty($bucketsFiltered[$code]) ? $bucketsFiltered[$code] : null;
$facet = new Facet(new FacetRangeType(), $code);
$facetItem = FacetItemRange::create(
FacetItemRangeDTO::create(
$workBucket['min'],
$workBucket['max'],
$workBucket['avg'],
$workBucket['sum']
),
$selectedBuket !== null ? FacetItemRangeDTO::create(
$selectedBuket['min'],
$selectedBuket['max'],
$selectedBuket['avg'],
$selectedBuket['sum']
) : FacetItemRangeDTO::create(),
$selectedBuket ? $selectedBuket['count'] : 0,
$selectedBuket !== null
);
$facet->products->add($facetItem);
$catalogSearchResult->getFacets()->add($facet);
}
}
return $catalogSearchResult;
}
private function productFromArray(array $data): Product
{
if (!isset($data['data']['id'])) {
throw new \RuntimeException('id is not set');
}
$id = $data['data']['id'];
$title = $data['data']['title'] ?? '';
$info = $data;