X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FPrefixSearch.php;h=c6f187d2b798cda62a13214b2af153faf538e57e;hb=f85df0ac40a09cc41016f7f003139e9671d245b7;hp=430b4b8972d5d7259059f2f1d5a08cea99a1f3f8;hpb=1fb06c0c71282807b0ccecd1d71fb16244846955;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/PrefixSearch.php b/includes/PrefixSearch.php index 430b4b8972..c6f187d2b7 100644 --- a/includes/PrefixSearch.php +++ b/includes/PrefixSearch.php @@ -164,106 +164,9 @@ abstract class PrefixSearch { return $this->strings( $this->handleResultFromHook( $srchres, $namespaces, $search, $limit ) ); } - /** - * 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. - * @param array $srchres results from the hook - * @return array munged results from the hook - */ private function handleResultFromHook( $srchres, $namespaces, $search, $limit ) { - // Pick namespace (based on PrefixSearch::defaultSearchBackend) - $ns = in_array( NS_MAIN, $namespaces ) ? NS_MAIN : $namespaces[0]; - $t = Title::newFromText( $search, $ns ); - if ( !$t || !$t->exists() ) { - // No exact match so just return the search results - return $srchres; - } - $string = $t->getPrefixedText(); - $key = array_search( $string, $srchres ); - if ( $key !== false ) { - // Exact match was in the results so just move it to the front - return $this->pullFront( $key, $srchres ); - } - // Exact match not in the search results so check for some redirect handling cases - if ( $t->isRedirect() ) { - $target = $this->getRedirectTarget( $t ); - $key = array_search( $target, $srchres ); - if ( $key !== false ) { - // Exact match is a redirect to one of the returned matches so pull the - // returned match to the front. This might look odd but the alternative - // is to put the redirect in front and drop the match. The name of the - // found match is often more descriptive/better formed than the name of - // the redirect AND by definition they share a prefix. Hopefully this - // choice is less confusing and more helpful. But it might not be. But - // it is the choice we're going with for now. - return $this->pullFront( $key, $srchres ); - } - $redirectTargetsToRedirect = $this->redirectTargetsToRedirect( $srchres ); - if ( isset( $redirectTargetsToRedirect[$target] ) ) { - // The exact match and something in the results list are both redirects - // to the same thing! In this case we'll pull the returned match to the - // top following the same logic above. Again, it might not be a perfect - // choice but it'll do. - return $this->pullFront( $redirectTargetsToRedirect[$target], $srchres ); - } - } else { - $redirectTargetsToRedirect = $this->redirectTargetsToRedirect( $srchres ); - if ( isset( $redirectTargetsToRedirect[$string] ) ) { - // The exact match is the target of a redirect already in the results list so remove - // the redirect from the results list and push the exact match to the front - array_splice( $srchres, $redirectTargetsToRedirect[$string], 1 ); - array_unshift( $srchres, $string ); - return $srchres; - } - } - - // Exact match is totally unique from the other results so just add it to the front - array_unshift( $srchres, $string ); - // And roll one off the end if the results are too long - if ( count( $srchres ) > $limit ) { - array_pop( $srchres ); - } - return $srchres; - } - - /** - * @param Array(string) $titles as strings - * @return Array(string => int) redirect target prefixedText to index of title in titles - * that is a redirect to it. - */ - private function redirectTargetsToRedirect( $titles ) { - $result = array(); - foreach ( $titles as $key => $titleText ) { - $title = Title::newFromText( $titleText ); - if ( !$title || !$title->isRedirect() ) { - continue; - } - $target = $this->getRedirectTarget( $title ); - if ( !$target ) { - continue; - } - $result[$target] = $key; - } - return $result; - } - - /** - * @param int $key key to pull to the front - * @return array $array with the item at $key pulled to the front - */ - private function pullFront( $key, $array ) { - $cut = array_splice( $array, $key, 1 ); - array_unshift( $array, $cut[0] ); - return $array; - } - - private function getRedirectTarget( $title ) { - $page = WikiPage::factory( $title ); - if ( !$page->exists() ) { - return null; - } - return $page->getRedirectTarget()->getPrefixedText(); + $rescorer = new SearchExactMatchRescorer(); + return $rescorer->rescore( $search, $namespaces, $srchres, $limit ); } /** @@ -362,10 +265,7 @@ abstract class PrefixSearch { $ns = NS_MAIN; // if searching on many always default to main } - $t = null; - if ( is_string( $search ) ) { - $t = Title::newFromText( $search, $ns ); - } + $t = Title::newFromText( $search, $ns ); $prefix = $t ? $t->getDBkey() : ''; $dbr = wfGetDB( DB_SLAVE );