Merge "(bug 43942) Skip screen sheets with media queries when printing"
[lhc/web/wiklou.git] / includes / specials / SpecialDoubleRedirects.php
index 8ecc871..ee07323 100644 (file)
@@ -52,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 ( 'namespace' => 'pa.page_namespace',
-                                       'title' => 'pa.page_title',
-                                       'value' => 'pa.page_title',
-                                       'nsb' => 'pb.page_namespace',
-                                       'tb' => 'pb.page_title',
-                                       'nsc' => 'pc.page_namespace',
-                                       'tc' => 'pc.page_title' ),
-                       '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;
@@ -87,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,
@@ -102,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,