/** * @return \Magento\Framework\Search\Response\QueryResponse */ private function executeQuery() { /** @var \Magento\Framework\Search\Response\QueryResponse $queryRequest */ $queryRequest = $this->requestBuilder->create(); $queryResponse = $this->adapter->query($queryRequest); return $queryResponse; }
/** * {@inheritdoc} */ public function search(SearchCriteriaInterface $searchCriteria) { $this->requestBuilder->setRequestName($searchCriteria->getRequestName()); $scope = $this->scopeResolver->getScope(); $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); }
/** * @inheritdoc */ protected function _renderFiltersBefore() { $this->requestBuilder->bindDimension('scope', $this->getStoreId()); if ($this->queryText) { $this->requestBuilder->bind('search_term', $this->queryText); } $priceRangeCalculation = $this->_scopeConfig->getValue(\Magento\Catalog\Model\Layer\Filter\Dynamic\AlgorithmFactory::XML_PATH_RANGE_CALCULATION, \Magento\Store\Model\ScopeInterface::SCOPE_STORE); if ($priceRangeCalculation) { $this->requestBuilder->bind('price_dynamic_algorithm', $priceRangeCalculation); } $this->requestBuilder->setRequestName('quick_search_container'); $queryRequest = $this->requestBuilder->create(); $this->queryResponse = $this->searchEngine->search($queryRequest); $ids = [0]; /** @var \Magento\Framework\Search\Document $document */ foreach ($this->queryResponse as $document) { $ids[] = $document->getId(); } parent::addFieldToFilter('entity_id', ['in' => $ids]); $this->_totalRecords = count($ids) - 1; if ($this->order && $this->order['field'] == 'relevance') { $this->getSelect()->order(new \Zend_Db_Expr($this->_conn->quoteInto('FIELD(e.entity_id, ?) ' . $this->order['dir'], $ids))); } return parent::_renderFiltersBefore(); }
/** * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testCreate() { $data = ['dimensions' => ['scope' => ['name' => 'scope', 'value' => 'default']], 'queries' => ['one_match_filters' => ['name' => 'one_match_filters', 'boost' => '2', 'queryReference' => [['clause' => 'must', 'ref' => 'fulltext_search_query'], ['clause' => 'must', 'ref' => 'fulltext_search_query2']], 'type' => 'boolQuery'], 'fulltext_search_query' => ['name' => 'fulltext_search_query', 'boost' => '5', 'value' => '$fulltext_search_query$', 'match' => [['field' => 'data_index', 'boost' => '2']], 'type' => 'matchQuery'], 'fulltext_search_query2' => ['name' => 'fulltext_search_query2', 'filterReference' => [['ref' => 'pid']], 'type' => 'filteredQuery']], 'filters' => ['pid' => ['name' => 'pid', 'filterReference' => [['clause' => 'should', 'ref' => 'pidm'], ['clause' => 'should', 'ref' => 'pidsh']], 'type' => 'boolFilter'], 'pidm' => ['name' => 'pidm', 'field' => 'product_id', 'type' => 'rangeFilter', 'from' => '$pidm_from$', 'to' => '$pidm_to$'], 'pidsh' => ['name' => 'pidsh', 'field' => 'product_id', 'type' => 'termFilter', 'value' => '$pidsh$']], 'from' => '10', 'size' => '10', 'query' => 'one_match_filters', 'index' => 'catalogsearch_fulltext', 'aggregations' => []]; $requestName = 'rn'; $this->requestBuilder->bind('fulltext_search_query', 'socks'); $this->requestBuilder->bind('pidsh', 4); $this->requestBuilder->bind('pidm_from', 1); $this->requestBuilder->bind('pidm_to', 3); $this->requestBuilder->setRequestName($requestName); $this->requestBuilder->setSize(10); $this->requestBuilder->setFrom(10); $this->requestBuilder->bindDimension('scope', 'default'); $this->binder->expects($this->once())->method('bind')->willReturn($data); $this->cleaner->expects($this->once())->method('clean')->willReturn($data); $this->requestMapper->expects($this->once())->method('getRootQuery')->willReturn([]); $this->objectManager->expects($this->at(0))->method('create')->willReturn($this->requestMapper); $this->objectManager->expects($this->at(2))->method('create')->willReturn($this->request); $this->config->expects($this->once())->method('get')->with($this->equalTo($requestName))->willReturn($data); $result = $this->requestBuilder->create(); $this->assertInstanceOf('\\Magento\\Framework\\Search\\Request', $result); }
/** * @inheritdoc */ protected function _renderFiltersBefore() { $this->requestBuilder->bindDimension('scope', $this->getStoreId()); if ($this->queryText) { $this->requestBuilder->bind('search_term', $this->queryText); } $priceRangeCalculation = $this->_scopeConfig->getValue(\Magento\Catalog\Model\Layer\Filter\Dynamic\AlgorithmFactory::XML_PATH_RANGE_CALCULATION, \Magento\Store\Model\ScopeInterface::SCOPE_STORE); if ($priceRangeCalculation) { $this->requestBuilder->bind('price_dynamic_algorithm', $priceRangeCalculation); } $this->requestBuilder->setRequestName($this->searchRequestName); $queryRequest = $this->requestBuilder->create(); $this->queryResponse = $this->searchEngine->search($queryRequest); $temporaryStorage = $this->temporaryStorageFactory->create(); $table = $temporaryStorage->storeDocuments($this->queryResponse->getIterator()); $this->getSelect()->joinInner(['search_result' => $table->getName()], 'e.entity_id = search_result.' . TemporaryStorage::FIELD_ENTITY_ID, []); $this->_totalRecords = $this->queryResponse->count(); if ($this->order && 'relevance' === $this->order['field']) { $this->getSelect()->order('search_result.' . TemporaryStorage::FIELD_SCORE . ' ' . $this->order['dir']); } return parent::_renderFiltersBefore(); }
/** * @inheritdoc * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ protected function _renderFiltersBefore() { if ($this->filters) { $this->requestBuilder->bindDimension('scope', $this->getStoreId()); $this->requestBuilder->setRequestName('advanced_search_container'); foreach ($this->filters as $attributes) { foreach ($attributes as $attributeCode => $attributeValue) { if (is_numeric($attributeCode)) { $attributeCode = $this->_eavConfig->getAttribute(Product::ENTITY, $attributeCode)->getAttributeCode(); } if (isset($attributeValue['from']) || isset($attributeValue['to'])) { if (isset($attributeValue['from']) && '' !== $attributeValue['from']) { $this->requestBuilder->bind("{$attributeCode}.from", $attributeValue['from']); } if (isset($attributeValue['to']) && '' !== $attributeValue['to']) { $this->requestBuilder->bind("{$attributeCode}.to", $attributeValue['to']); } } elseif (!is_array($attributeValue)) { $this->requestBuilder->bind($attributeCode, $attributeValue); } elseif (isset($attributeValue['like'])) { $this->requestBuilder->bind($attributeCode, trim($attributeValue['like'], '%')); } elseif (isset($attributeValue['in'])) { $this->requestBuilder->bind($attributeCode, $attributeValue['in']); } elseif (isset($attributeValue['in_set'])) { $this->requestBuilder->bind($attributeCode, $attributeValue['in_set']); } } } $queryRequest = $this->requestBuilder->create(); $queryResponse = $this->searchEngine->search($queryRequest); $ids = [0]; /** @var \Magento\Framework\Search\Document $document */ foreach ($queryResponse as $document) { $ids[] = $document->getId(); } $this->addIdFilter($ids); } return parent::_renderFiltersBefore(); }