Merge "PrefixSearch: Enforce including the exact match as first result"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 10 Oct 2014 21:34:23 +0000 (21:34 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 10 Oct 2014 21:34:23 +0000 (21:34 +0000)
1  2 
includes/PrefixSearch.php

@@@ -151,7 -151,31 +151,31 @@@ abstract class PrefixSearch 
                $srchres = array();
                if ( wfRunHooks( 'PrefixSearchBackend', array( $namespaces, $search, $limit, &$srchres ) ) ) {
                        return $this->titles( $this->defaultSearchBackend( $namespaces, $search, $limit ) );
+               } else {
+                       // Default search backend does proper prefix searching, but custom backends
+                       // may sort based on other algorythms that may cause the exact title match
+                       // to not be in the results or be lower down the list.
+                       // Pick namespace (based on PrefixSearch::defaultSearchBackend)
+                       $ns = in_array( NS_MAIN, $namespaces ) ? NS_MAIN : $namespaces[0];
+                       $t = Title::newFromText( $search, $ns );
+                       $string = $t->getPrefixedText();
+                       $key = array_search( $string, $srchres );
+                       if ( $key !== false ) {
+                               // Move it to the front
+                               $cut = array_splice( $srchres, $key, 1 );
+                               array_unshift( $srchres, $cut[0] );
+                       } elseif ( $t->exists() ) {
+                               // Add it in front
+                               array_unshift( $srchres, $string );
+                               if ( count( $srchres ) > $limit ) {
+                                       array_pop( $srchres );
+                               }
+                       }
                }
                return $this->strings( $srchres );
        }
  
                // Unlike SpecialPage itself, we want the canonical forms of both
                // canonical and alias title forms...
                $keys = array();
 -              foreach ( SpecialPageFactory::getNames() as $page  ) {
 +              foreach ( SpecialPageFactory::getNames() as $page ) {
                        $keys[$wgContLang->caseFold( $page )] = $page;
                }