From 392e98fd1786a232f167ae07557fcb0642b90a89 Mon Sep 17 00:00:00 2001 From: Krinkle Date: Tue, 24 Jun 2014 00:08:31 +0000 Subject: [PATCH] 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 --- includes/PrefixSearch.php | 74 ++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 40 deletions(-) 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; } /** -- 2.20.1