public function buildQuery(RequestInterface $request) { // $params = new Object(); $params = $this->searchHelper->getSearchParams(); $this->processQuery($request->getQuery(), $params, BoolQuery::QUERY_CONDITION_MUST); return $params; }
/** * @param RequestInterface $request * @return \Magento\Framework\DB\Ddl\Table * @throws \Exception */ public function buildQuery(RequestInterface $request) { $searchIndex = $this->indexFactory->create()->load($request->getIndex()); $weights = []; foreach ($searchIndex->getIndexInstance()->getAttributeWeights() as $attr => $weight) { $weights[$attr] = pow(2, $weight); } $indexName = $this->scopeResolver->resolve($request->getIndex(), $request->getDimensions()); $sphinxQuery = $this->engine->getQuery()->select(['id', new QLExpression('weight()')])->from($indexName)->limit(0, 1000000)->option('max_matches', 1000000)->option('field_weights', $weights)->option('ranker', new QLExpression("expr('sum(word_count*user_weight) + bm25')")); //@todo http://habrahabr.ru/company/sphinx/blog/133790/ $queryContainer = $this->queryContainerFactory->create(['request' => $request]); $sphinxQuery = $this->processQuery($request->getQuery(), $sphinxQuery, BoolQuery::QUERY_CONDITION_MUST, $queryContainer); $sphinxQuery = $this->addDerivedQueries($queryContainer, $sphinxQuery); $result = $sphinxQuery->execute(); if (isset($_GET) && isset($_GET['debug'])) { echo $sphinxQuery->getCompiled(); echo '<pre>' . print_r($result, true) . '</pre>'; } $documents = []; foreach ($result as $item) { $document = $this->documentFactory->create([]); $document->setId($item['id'])->setCustomAttribute('entity_id', $item['id'])->setCustomAttribute('score', new DataObject(['value' => $item['weight()']])); $documents[] = $document; } $table = $this->temporaryStorage->storeApiDocuments($documents); return $table; }
/** * @param Select $select * @param RequestInterface $request * @return Select */ public function addTables(Select $select, RequestInterface $request) { $mappedTables = []; $filters = $this->getFilters($request->getQuery()); foreach ($filters as $filter) { list($alias, $table, $mapOn, $mappedFields) = $this->getMappingData($filter); if (!array_key_exists($alias, $mappedTables)) { $select->joinLeft([$alias => $table], $mapOn, $mappedFields); $mappedTables[$alias] = $table; } } return $select; }
/** * @param RequestInterface $request * @return bool */ private function isNeedToAddFilters(RequestInterface $request) { return $this->hasFilters($request->getQuery()); }
/** * Build adapter dependent query * * @param RequestInterface $request * @return Select */ public function buildQuery(RequestInterface $request) { /** @var ScoreBuilder $scoreBuilder */ $scoreBuilder = $this->scoreBuilderFactory->create(); $select = $this->processQuery($scoreBuilder, $request->getQuery(), $this->getSelect(), self::BOOL_MUST); $select = $this->processDimensions($request, $select); $tableName = $this->resource->getTableName($request->getIndex()); $select->from($tableName)->columns($scoreBuilder->build())->order($scoreBuilder->getScoreAlias() . ' ' . Select::SQL_DESC); return $select; }