38 private $mappedQueries;
43 private $mappedFilters;
48 private $aggregations;
53 private $objectManager;
58 private $rootQueryName;
74 array $aggregations = [],
78 $this->queries = $queries;
79 $this->aggregations = $aggregations;
80 $this->filters = $filters;
81 $this->rootQueryName = $rootQueryName;
94 if (!$this->rootQuery) {
95 $this->mappedQueries = [];
96 $this->mappedFilters = [];
97 $this->rootQuery = $this->mapQuery($this->rootQueryName);
100 return $this->rootQuery;
113 private function mapQuery($queryName)
115 if (!isset($this->queries[$queryName])) {
116 throw new \Exception(
'Query ' . $queryName .
' does not exist');
117 }
elseif (in_array($queryName, $this->mappedQueries)) {
118 throw new StateException(
119 new Phrase(
'A cycle was found. The "%1" query is already used in the request hierarchy.', [$queryName])
122 $this->mappedQueries[] = $queryName;
123 $query = $this->queries[$queryName];
126 $query = $this->objectManager->create(
127 \
Magento\Framework\Search\Request\Query\Match::class,
130 'value' =>
$query[
'value'],
131 'boost' => isset(
$query[
'boost']) ?
$query[
'boost'] : 1,
132 'matches' =>
$query[
'match']
137 if (isset(
$query[
'queryReference'][0])) {
138 $reference = $this->mapQuery(
$query[
'queryReference'][0][
'ref']);
139 $referenceType = Filter::REFERENCE_QUERY;
141 $reference = $this->mapFilter(
$query[
'filterReference'][0][
'ref']);
142 $referenceType = Filter::REFERENCE_FILTER;
144 throw new \Exception(
'Reference is not provided');
146 $query = $this->objectManager->create(
147 \
Magento\Framework\Search\Request\Query\Filter::class,
150 'boost' => isset(
$query[
'boost']) ?
$query[
'boost'] : 1,
151 'reference' => $reference,
152 'referenceType' => $referenceType
157 $aggregatedByType = $this->aggregateQueriesByType(
$query[
'queryReference']);
158 $query = $this->objectManager->create(
159 \
Magento\Framework\Search\Request\Query\BoolExpression::class,
167 throw new \InvalidArgumentException(
'Invalid query type');
182 private function mapFilter($filterName)
184 if (!isset($this->filters[$filterName])) {
185 throw new \Exception(
'Filter ' . $filterName .
' does not exist');
186 }
elseif (in_array($filterName, $this->mappedFilters)) {
187 throw new StateException(
189 'A cycle was found. The "%1" filter is already used in the request hierarchy.',
194 $this->mappedFilters[] = $filterName;
195 $filter = $this->filters[$filterName];
196 switch ($filter[
'type']) {
198 $filter = $this->objectManager->create(
199 \
Magento\Framework\Search\Request\Filter\Term::class,
201 'name' => $filter[
'name'],
202 'field' => $filter[
'field'],
203 'value' => $filter[
'value']
208 $filter = $this->objectManager->create(
209 \
Magento\Framework\Search\Request\Filter\Range::class,
211 'name' => $filter[
'name'],
212 'field' => $filter[
'field'],
213 'from' => isset($filter[
'from']) ? $filter[
'from'] :
null,
214 'to' => isset($filter[
'to']) ? $filter[
'to'] :
null 219 $filter = $this->objectManager->create(
220 \
Magento\Framework\Search\Request\Filter\Wildcard::class,
222 'name' => $filter[
'name'],
223 'field' => $filter[
'field'],
224 'value' => $filter[
'value']
229 $aggregatedByType = $this->aggregateFiltersByType($filter[
'filterReference']);
230 $filter = $this->objectManager->create(
231 \
Magento\Framework\Search\Request\Filter\BoolExpression::class,
233 [
'name' => $filter[
'name']],
239 throw new \InvalidArgumentException(
'Invalid filter type');
250 private function aggregateFiltersByType(
$data)
265 private function aggregateQueriesByType(
$data)
278 private function validate()
280 $this->validateQueries();
281 $this->validateFilters();
288 private function validateQueries()
290 $this->validateNotUsed($this->queries, $this->mappedQueries,
'Query %1 is not used in request hierarchy');
300 private function validateNotUsed($elements, $mappedElements, $errorMessage)
302 $allElements = array_keys($elements);
303 $notUsedElements = implode(
', ', array_diff($allElements, $mappedElements));
304 if (!empty($notUsedElements)) {
305 throw new StateException(
new Phrase($errorMessage, [$notUsedElements]));
313 private function validateFilters()
315 $this->validateNotUsed($this->filters, $this->mappedFilters,
'Filter %1 is not used in request hierarchy');
327 foreach ($this->aggregations as $bucketData) {
329 'name' => $bucketData[
'name'],
330 'field' => $bucketData[
'field'],
331 'metrics' => $this->mapMetrics($bucketData),
333 switch ($bucketData[
'type']) {
335 $bucket = $this->objectManager->create(
341 $bucket = $this->objectManager->create(
345 [
'ranges' => $this->mapRanges($bucketData)]
350 $bucket = $this->objectManager->create(
354 [
'method' => $bucketData[
'method']]
373 private function mapMetrics(array $bucketData)
376 if (isset($bucketData[
'metric'])) {
377 $metrics = $bucketData[
'metric'];
378 foreach ($metrics as $metric) {
379 $metricObjects[] = $this->objectManager->create(
382 'type' => $metric[
'type']
387 return $metricObjects;
396 private function mapRanges(array $bucketData)
399 if (isset($bucketData[
'range'])) {
400 $ranges = $bucketData[
'range'];
401 foreach ($ranges as $range) {
402 $rangeObjects[] = $this->objectManager->create(
403 \
Magento\Framework\Search\Request\Aggregation\Range::class,
405 'from' => $range[
'from'],
411 return $rangeObjects;
__construct(\Magento\Framework\ObjectManagerInterface $objectManager, array $queries, $rootQueryName, array $aggregations=[], array $filters=[])
elseif(isset( $params[ 'redirect_parent']))