From: Krinkle Date: Tue, 24 Jun 2014 00:08:31 +0000 (+0000) Subject: Revert "PrefixSearch (ApiOpenSearch) now supports searching in multiple namespaces" X-Git-Tag: 1.31.0-rc.0~15273^2 X-Git-Url: http://git.cyclocoop.org/%7B%24admin_url%7Dmembres/cotisations/gestion/rappel_supprimer.php?a=commitdiff_plain;h=392e98fd1786a232f167ae07557fcb0642b90a89;p=lhc%2Fweb%2Fwiklou.git Revert "PrefixSearch (ApiOpenSearch) now supports searching in multiple namespaces" Caused regression in opensearch results for the main search field on every page. Special pages are no longer included when they should. This reverts commit 0e054bbf1a955b02afd4feaa04063c841e19a569. Change-Id: Ib39c6d7816cd3c21ec714f5d6272bebd049ac430 --- diff --git a/includes/PrefixSearch.php b/includes/PrefixSearch.php index 15d48cb82a..a796d35723 100644 --- a/includes/PrefixSearch.php +++ b/includes/PrefixSearch.php @@ -51,33 +51,32 @@ abstract class PrefixSearch { */ public function search( $search, $limit, $namespaces = array() ) { $search = trim( $search ); - if ( $search === '' ) { - return array(); + if ( $search == '' ) { + return array(); // Return empty result } - $namespaces = $this->validateNamespaces( $namespaces ); - // Is this a namespace prefix? Start listing all pages in it. - $title = Title::newFromText( $search . 'Dummy' ); - if ( $title - && $title->getText() === 'Dummy' - && !$title->inNamespace( NS_MAIN ) - && !$title->isExternal() - ) { - $this->searchBackend( array( $title->getNamespace() ), '', $limit ); + // Find a Title which is not an interwiki and is in NS_MAIN + $title = Title::newFromText( $search ); + if ( $title && !$title->isExternal() ) { + $ns = array( $title->getNamespace() ); + if ( $ns[0] == NS_MAIN ) { + $ns = $namespaces; // no explicit prefix, use default namespaces + } + return $this->searchBackend( + $ns, $title->getText(), $limit ); } - // Explicit namespace prefix? Limit search to that namespace. - $title = Title::newFromText( $search ); - if ( $title - && !$title->isExternal() - && !$title->inNamespace( NS_MAIN ) - ) { - // This will convert first letter to uppercase if appropriate for the namespace - $this->searchBackend( array( $title->getNamespace() ), $title->getText(), $limit ); + // Is this a namespace prefix? + $title = Title::newFromText( $search . 'Dummy' ); + if ( $title && $title->getText() == 'Dummy' + && $title->getNamespace() != NS_MAIN + && !$title->isExternal() ) + { + $namespaces = array( $title->getNamespace() ); + $search = ''; } - // Search in all requested namespaces return $this->searchBackend( $namespaces, $search, $limit ); } @@ -220,33 +219,28 @@ abstract class PrefixSearch { * @return array Array of Title objects */ protected function defaultSearchBackend( $namespaces, $search, $limit ) { - $dbr = wfGetDB( DB_SLAVE ); - - // Construct suitable prefix for each namespace, they might differ - $prefixes = array(); - foreach ( $namespaces as $ns ) { - $title = Title::makeTitleSafe( $ns, $search ); - $prefix = $title ? $title->getDBkey() : ''; - $prefixes[$prefix][] = $ns; - } - - $conds = array(); - foreach ( $prefixes as $prefix => $nss ) { - $conds[] = $dbr->makeList( array( - 'page_namespace' => $nss, - 'page_title' . $dbr->buildLike( $prefix, $dbr->anyString() ), - ), LIST_AND ); + $ns = array_shift( $namespaces ); // support only one namespace + if ( in_array( NS_MAIN, $namespaces ) ) { + $ns = NS_MAIN; // if searching on many always default to main } + $t = Title::newFromText( $search, $ns ); + $prefix = $t ? $t->getDBkey() : ''; + $dbr = wfGetDB( DB_SLAVE ); $res = $dbr->select( 'page', array( 'page_id', 'page_namespace', 'page_title' ), - $dbr->makeList( $conds, LIST_OR ), + array( + 'page_namespace' => $ns, + 'page_title ' . $dbr->buildLike( $prefix, $dbr->anyString() ) + ), __METHOD__, array( 'LIMIT' => $limit, 'ORDER BY' => 'page_title' ) ); - - // Shorter than a loop, and doesn't break class api - return iterator_to_array( TitleArray::newFromResult( $res ) ); + $srchres = array(); + foreach ( $res as $row ) { + $srchres[] = Title::newFromRow( $row ); + } + return $srchres; } /**