X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2FPrefixSearch.php;h=35be2a9d8792e2b206ec6f303a4fd98bb65ee8cd;hb=8a6428a3f57ca9506b8366341a90d21bb7bf4716;hp=31bc60054e9653905d2d09a6ba1fcb525f01c5ca;hpb=9ec7cb086847a18de33df4931759f3cc4944fc38;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/PrefixSearch.php b/includes/PrefixSearch.php index 31bc60054e..35be2a9d87 100644 --- a/includes/PrefixSearch.php +++ b/includes/PrefixSearch.php @@ -29,7 +29,7 @@ abstract class PrefixSearch { /** * Do a prefix search of titles and return a list of matching page names. - * @deprecated: Since 1.23, use TitlePrefixSearch or StringPrefixSearch classes + * @deprecated Since 1.23, use TitlePrefixSearch or StringPrefixSearch classes * * @param string $search * @param int $limit @@ -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 ); } @@ -167,7 +166,9 @@ abstract class PrefixSearch { protected function specialSearch( $search, $limit ) { global $wgContLang; - list( $searchKey, $subpageSearch ) = explode( '/', $search, 2 ); + $searchParts = explode( '/', $search, 2 ); + $searchKey = $searchParts[0]; + $subpageSearch = isset( $searchParts[1] ) ? $searchParts[1] : null; // Handle subpage search separately. if ( $subpageSearch !== null ) { @@ -236,33 +237,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; } /**