X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fspecials%2FSpecialDoubleRedirects.php;h=ee073235e0415fe3ade9be1d50ba29deead9c996;hb=0d81130dd47970a71871dae4ff1f625ff6f33014;hp=51cb08af6e1aafce46031fc069f858edda024d89;hpb=78a8aa828e335593003a0caa1c743eca2050ec64;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/specials/SpecialDoubleRedirects.php b/includes/specials/SpecialDoubleRedirects.php index 51cb08af6e..ee073235e0 100644 --- a/includes/specials/SpecialDoubleRedirects.php +++ b/includes/specials/SpecialDoubleRedirects.php @@ -33,9 +33,17 @@ class DoubleRedirectsPage extends QueryPage { parent::__construct( $name ); } - function isExpensive() { return true; } - function isSyndicated() { return false; } - function sortDescending() { return false; } + function isExpensive() { + return true; + } + + function isSyndicated() { + return false; + } + + function sortDescending() { + return false; + } function getPageHeader() { return $this->msg( 'doubleredirectstext' )->parseAsBlock(); @@ -44,22 +52,43 @@ class DoubleRedirectsPage extends QueryPage { function reallyGetQueryInfo( $namespace = null, $title = null ) { $limitToTitle = !( $namespace === null && $title === null ); $retval = array ( - 'tables' => array ( 'ra' => 'redirect', - 'rb' => 'redirect', 'pa' => 'page', - 'pb' => 'page', 'pc' => 'page' ), - 'fields' => array ( 'pa.page_namespace AS namespace', - 'pa.page_title AS title', - 'pa.page_title AS value', - 'pb.page_namespace AS nsb', - 'pb.page_title AS tb', - 'pc.page_namespace AS nsc', - 'pc.page_title AS tc' ), - 'conds' => array ( 'ra.rd_from = pa.page_id', - 'pb.page_namespace = ra.rd_namespace', - 'pb.page_title = ra.rd_title', - 'rb.rd_from = pb.page_id', - 'pc.page_namespace = rb.rd_namespace', - 'pc.page_title = rb.rd_title' ) + 'tables' => array ( + 'ra' => 'redirect', + 'rb' => 'redirect', + 'pa' => 'page', + 'pb' => 'page' + ), + 'fields' => array( + 'namespace' => 'pa.page_namespace', + 'title' => 'pa.page_title', + 'value' => 'pa.page_title', + + 'nsb' => 'pb.page_namespace', + 'tb' => 'pb.page_title', + + // Select fields from redirect instead of page. Because there may + // not actually be a page table row for this target (e.g. for interwiki redirects) + 'nsc' => 'rb.rd_namespace', + 'tc' => 'rb.rd_title', + 'iwc' => 'rb.rd_interwiki', + ), + 'conds' => array( + 'ra.rd_from = pa.page_id', + + // Filter out redirects where the target goes interwiki (bug 40353). + // This isn't an optimization, it is required for correct results, + // otherwise a non-double redirect like Bar -> w:Foo will show up + // like "Bar -> Foo -> w:Foo". + + // Need to check both NULL and "" for some reason, + // apparently either can be stored for non-iw entries. + '(ra.rd_interwiki IS NULL OR ra.rd_interwiki = "")', + + 'pb.page_namespace = ra.rd_namespace', + 'pb.page_title = ra.rd_title', + + 'rb.rd_from = pb.page_id', + ) ); if ( $limitToTitle ) { $retval['conds']['pa.page_namespace'] = $namespace; @@ -79,6 +108,11 @@ class DoubleRedirectsPage extends QueryPage { function formatResult( $skin, $result ) { $titleA = Title::makeTitle( $result->namespace, $result->title ); + // If only titleA is in the query, it means this came from + // querycache (which only saves 3 columns). + // That does save the bulk of the query cost, but now we need to + // get a little more detail about each individual entry quickly + // using the filter of reallyGetQueryInfo. if ( $result && !isset( $result->nsb ) ) { $dbr = wfGetDB( DB_SLAVE ); $qi = $this->reallyGetQueryInfo( $result->namespace, @@ -94,7 +128,7 @@ class DoubleRedirectsPage extends QueryPage { } $titleB = Title::makeTitle( $result->nsb, $result->tb ); - $titleC = Title::makeTitle( $result->nsc, $result->tc ); + $titleC = Title::makeTitle( $result->nsc, $result->tc, '', $result->iwc ); $linkA = Linker::linkKnown( $titleA,