/** * Build adapter dependent query * * @param RequestInterface $request * @throws \LogicException * @return Select */ public function buildQuery(RequestInterface $request) { if (!array_key_exists($request->getIndex(), $this->indexProviders)) { throw new \LogicException('Index provider not configured'); } $indexBuilder = $this->indexProviders[$request->getIndex()]; $queryContainer = $this->queryContainerFactory->create(['indexBuilder' => $indexBuilder, 'request' => $request]); $select = $indexBuilder->build($request); /** @var ScoreBuilder $scoreBuilder */ $scoreBuilder = $this->scoreBuilderFactory->create(); $select = $this->processQuery($scoreBuilder, $request->getQuery(), $select, BoolQuery::QUERY_CONDITION_MUST, $queryContainer); $select = $this->addDerivedQueries($request, $queryContainer, $scoreBuilder, $select, $indexBuilder); $select->limit($request->getSize()); $select->order('relevance ' . Select::SQL_DESC); return $select; }
/** * Build adapter dependent query * * @param RequestInterface $request * @throws \Exception * @return Select */ public function buildQuery(RequestInterface $request) { if (!isset($this->indexProviders[$request->getIndex()])) { throw new \Exception('Index provider not configured'); } $indexBuilder = $this->indexProviders[$request->getIndex()]; $queryContainer = $this->queryContainerFactory->create( [ 'indexBuilder' => $indexBuilder, 'request' => $request ] ); $select = $indexBuilder->build($request); /** @var ScoreBuilder $scoreBuilder */ $scoreBuilder = $this->scoreBuilderFactory->create(); $select = $this->processQuery( $scoreBuilder, $request->getQuery(), $select, BoolQuery::QUERY_CONDITION_MUST, $queryContainer ); $filtersCount = $queryContainer->getFiltersCount(); if ($filtersCount > 1) { $select->group('entity_id'); $select->having('COUNT(DISTINCT search_index.attribute_id) = ' . $filtersCount); } $select = $this->addMatchQueries( $request, $queryContainer->getDerivedQueries(), $scoreBuilder, $select, $indexBuilder ); $select->limit($request->getSize()); $select->order('relevance ' . Select::SQL_DESC); return $select; }
/** * Build adapter dependent query * * @param RequestInterface $request * @throws \Exception * @return Select */ public function buildQuery(RequestInterface $request) { if (!isset($this->indexProviders[$request->getIndex()])) { throw new \Exception('Index provider not configured'); } $indexBuilder = $this->indexProviders[$request->getIndex()]; $queryContainer = $this->queryContainerFactory->create( [ 'indexBuilder' => $indexBuilder, 'request' => $request ] ); $select = $indexBuilder->build($request); /** @var ScoreBuilder $scoreBuilder */ $scoreBuilder = $this->scoreBuilderFactory->create(); $select = $this->processQuery( $scoreBuilder, $request->getQuery(), $select, BoolQuery::QUERY_CONDITION_MUST, $queryContainer ); $select = $this->processDimensions($request, $select); $select->columns($scoreBuilder->build()); $select->limit(self::SQL_ENTITIES_LIMIT); $filtersCount = $queryContainer->getFiltersCount(); if ($filtersCount > 1) { $select->group('entity_id'); $select->having('COUNT(DISTINCT search_index.attribute_id) = ' . $filtersCount); } $select = $this->createAroundSelect($select, $scoreBuilder); $select->limit($request->getSize()); $matchQueries = $queryContainer->getDerivedQueries(); if ($matchQueries) { $subSelect = $select; $select = $this->resource->getConnection(Resource::DEFAULT_READ_RESOURCE)->select(); $tables = array_merge($queryContainer->getDerivedQueryNames(), ['main_select.relevance']); $relevance = implode('.relevance + ', $tables); $select ->from( ['main_select' => $subSelect], [ $this->entityMetadata->getEntityId() => 'entity_id', 'relevance' => sprintf('(%s)', $relevance), ] ); foreach ($matchQueries as $matchName => $matchSelect) { $select->join( [$matchName => $this->createAroundSelect($matchSelect, $scoreBuilder)], $matchName . '.entity_id = main_select.entity_id', [] ); } } $select->order('relevance ' . Select::SQL_DESC); return $select; }