/** * Creates an instance of Solarium_Query_Select configured by searchconfig. * @see WikiaSearchTest::testGetQuery * @param Solarium_Query_Select $query * @param WikiaSearchConfig $searchConfig * @return Solarium_Query_Select */ private function getSelectQuery(WikiaSearchConfig $searchConfig) { wfProfileIn(__METHOD__); $query = $this->client->createSelect(); $query->setDocumentClass('WikiaSearchResult'); $sort = $searchConfig->getSort(); $query->addFields($searchConfig->getRequestedFields())->removeField('*')->setStart($searchConfig->getStart())->setRows($searchConfig->getLength())->addSort($sort[0], $sort[1])->addParam('timeAllowed', $searchConfig->isInterWiki() ? 7500 : 5000); $highlighting = $query->getHighlighting(); $highlighting->addField(self::field('html'))->setSnippets(1)->setRequireFieldMatch(true)->setFragSize(self::HL_FRAG_SIZE)->setSimplePrefix(self::HL_MATCH_PREFIX)->setSimplePostfix(self::HL_MATCH_POSTFIX)->setAlternateField('html')->setMaxAlternateFieldLength(100); $query->addFilterQuery(array('query' => $this->getFilterQueryString($searchConfig), 'key' => 'fq1')); if ($searchConfig->isInterWiki()) { $grouping = $query->getGrouping(); $grouping->setLimit(self::GROUP_RESULTS_GROUPING_ROW_LIMIT)->setOffset($searchConfig->getStart())->setFields(array(self::GROUP_RESULTS_GROUPING_FIELD)); } // this is how we prevent duplicate results when we already have PTT $noPtt = ''; if ($searchConfig->hasArticleMatch()) { $am = $searchConfig->getArticleMatch(); $article = $am->getArticle(); $noPtt = self::valueForField('id', sprintf('%s_%s', $searchConfig->getCityId(), $article->getID()), array('negate' => true)); $query->addFilterQuery(array('query' => $noPtt, 'key' => 'ptt')); } $formulatedQuery = sprintf('%s AND (%s)', $this->getQueryClausesString($searchConfig), $this->getNestedQuery($searchConfig)); $query->setQuery($formulatedQuery); wfProfileOut(__METHOD__); return $query; }