/** * Called in index action. Sets the SearchConfigs namespaces based on MW-core NS request style. * @see WikiSearchControllerTest::testSetNamespacesFromRequest * @param WikiaSearchConfig $searchConfig * @return boolean true */ private function setNamespacesFromRequest(WikiaSearchConfig $searchConfig, User $user) { $searchEngine = F::build('SearchEngine'); $searchableNamespaces = $searchEngine->searchableNamespaces(); $namespaces = array(); foreach ($searchableNamespaces as $i => $name) { if ($this->getVal('ns' . $i, false)) { $namespaces[] = $i; } } if (empty($namespaces) && $user->getOption('searchAllNamespaces')) { $namespaces = array_keys($searchableNamespaces); } $searchConfig->setNamespaces($namespaces); return true; }
/** * Builds the necessary query clauses based on values set in the searchconfig object * @see WikiaSearchTest::testGetQueryClausesString * @param WikiaSearchConfig $searchConfig * @return string */ private function getQueryClausesString(WikiaSearchConfig $searchConfig) { $queryClauses = array(); if ($searchConfig->isInterWiki()) { $widQueries = array(); foreach ($this->getInterWikiSearchExcludedWikis() as $excludedWikiId) { $widQueries[] = self::valueForField('wid', $excludedWikiId, array('negate' => true)); } $queryClauses[] = implode(' AND ', $widQueries); $queryClauses[] = self::valueForField('lang', $this->wg->ContLang->mCode); $queryClauses[] = self::valueForField('iscontent', 'true'); $hub = $searchConfig->getHub(); if (!empty($hub)) { $queryClauses[] = self::valueForField('hub', $hub); } } else { if ($searchConfig->getVideoSearch()) { $searchConfig->setNamespaces(array(NS_FILE)); $queryClauses[] = self::valueForField('is_video', 'true'); $queryWithVideo = sprintf('(%s OR %s)', self::valueForField('wid', $searchConfig->getCityId()), self::valueForField('wid', self::VIDEO_WIKI_ID)); array_unshift($queryClauses, $queryWithVideo); } else { array_unshift($queryClauses, self::valueForField('wid', $searchConfig->getCityId())); } $nsQuery = ''; foreach ($searchConfig->getNamespaces() as $namespace) { $nsQuery .= (!empty($nsQuery) ? ' OR ' : '') . self::valueForField('ns', $namespace); } $queryClauses[] = "({$nsQuery})"; } if (!$searchConfig->getIncludeRedirects()) { $queryClauses[] = self::valueForField('is_redirect', 'false'); } return sprintf('(%s)', implode(' AND ', $queryClauses)); }