jenkins-bot has submitted this change and it was merged.
Change subject: Rank aliases in search in order they appear in the messages
file.
..
Rank aliases in search in order they appear in the messages file.
This will ensure the local page name (which is the first alias) is prioritized.
Bug: T151660
Change-Id: I3cc266024f5e052d20ff55c4b2c6cbd2945e3dd3
---
M includes/PrefixSearch.php
M tests/phpunit/includes/PrefixSearchTest.php
M tests/phpunit/includes/search/SearchEnginePrefixTest.php
3 files changed, 21 insertions(+), 19 deletions(-)
Approvals:
DCausse: Looks good to me, approved
jenkins-bot: Verified
diff --git a/includes/PrefixSearch.php b/includes/PrefixSearch.php
index f6c4147..04c17e4 100644
--- a/includes/PrefixSearch.php
+++ b/includes/PrefixSearch.php
@@ -239,7 +239,7 @@
// canonical and alias title forms...
$keys = [];
foreach ( SpecialPageFactory::getNames() as $page ) {
- $keys[$wgContLang->caseFold( $page )] = $page;
+ $keys[$wgContLang->caseFold( $page )] = [ 'page' =>
$page, 'rank' => 0 ];
}
foreach ( $wgContLang->getSpecialPageAliases() as $page =>
$aliases ) {
@@ -247,33 +247,35 @@
continue;
}
- foreach ( $aliases as $alias ) {
- $keys[$wgContLang->caseFold( $alias )] = $alias;
+ foreach ( $aliases as $key => $alias ) {
+ $keys[$wgContLang->caseFold( $alias )] = [
'page' => $alias, 'rank' => $key ];
}
}
ksort( $keys );
- $srchres = [];
- $skipped = 0;
+ $matches = [];
foreach ( $keys as $pageKey => $page ) {
if ( $searchKey === '' || strpos( $pageKey, $searchKey
) === 0 ) {
// bug 27671: Don't use
SpecialPage::getTitleFor() here because it
// localizes its input leading to searches for
e.g. Special:All
// returning
Spezial:MediaWiki-Systemnachrichten and returning
// Spezial:Alle_Seiten twice when
$wgLanguageCode == 'de'
- if ( $offset > 0 && $skipped < $offset ) {
- $skipped++;
- continue;
+ $matches[$page['rank']][] =
Title::makeTitleSafe( NS_SPECIAL, $page['page'] );
+
+ if ( isset( $matches[0] ) && count( $matches[0]
) >= $limit + $offset ) {
+ // We have enough items in primary
rank, no use to continue
+ break;
}
- $srchres[] = Title::makeTitleSafe( NS_SPECIAL,
$page );
}
- if ( count( $srchres ) >= $limit ) {
- break;
- }
}
- return $srchres;
+ // Ensure keys are in order
+ ksort( $matches );
+ // Flatten the array
+ $matches = array_reduce( $matches, 'array_merge', [] );
+
+ return array_slice( $matches, $offset, $limit );
}
/**
diff --git a/tests/phpunit/includes/PrefixSearchTest.php
b/tests/phpunit/includes/PrefixSearchTest.php
index bc43709..c5a7e04 100644
--- a/tests/phpunit/includes/PrefixSearchTest.php
+++ b/tests/phpunit/includes/PrefixSearchTest.php
@@ -129,11 +129,11 @@
'results' => [
'Special:ActiveUsers',
'Special:AllMessages',
- 'Special:AllMyFiles',
+ 'Special:AllMyUploads',
],
// Third result when testing offset
'offsetresult' => [
- 'Special:AllMyUploads',
+ 'Special:AllPages',
],
] ],
[ [
@@ -146,7 +146,7 @@
],
// Third result when testing offset
'offsetresult' => [
- 'Special:UncategorizedImages',
+ 'Special:UncategorizedPages',
],
] ],
[ [
diff --git a/tests/phpunit/includes/search/SearchEnginePrefixTest.php
b/tests/phpunit/includes