requestBuilder = $requestBuilder; $this->scopeResolver = $scopeResolver; $this->searchEngine = $searchEngine; $this->searchResponseBuilder = $searchResponseBuilder; } /** * {@inheritdoc} */ public function search(SearchCriteriaInterface $searchCriteria) { $this->requestBuilder->setRequestName($searchCriteria->getRequestName()); $scope = $this->scopeResolver->getScope()->getId(); $this->requestBuilder->bindDimension('scope', $scope); foreach ($searchCriteria->getFilterGroups() as $filterGroup) { foreach ($filterGroup->getFilters() as $filter) { $this->addFieldToFilter($filter->getField(), $filter->getValue()); } } $this->requestBuilder->setFrom($searchCriteria->getCurrentPage() * $searchCriteria->getPageSize()); $this->requestBuilder->setSize($searchCriteria->getPageSize()); $request = $this->requestBuilder->create(); $searchResponse = $this->searchEngine->search($request); return $this->searchResponseBuilder->build($searchResponse) ->setSearchCriteria($searchCriteria); } /** * Apply attribute filter to facet collection * * @param string $field * @param string|array|null $condition * @return $this */ private function addFieldToFilter($field, $condition = null) { if (!is_array($condition) || !in_array(key($condition), ['from', 'to'], true)) { $this->requestBuilder->bind($field, $condition); } else { if (!empty($condition['from'])) { $this->requestBuilder->bind("{$field}.from", $condition['from']); } if (!empty($condition['to'])) { $this->requestBuilder->bind("{$field}.to", $condition['to']); } } return $this; } }