RevisionDelete log extract query optimizations
authorAaron Schulz <aaron@users.mediawiki.org>
Fri, 3 Apr 2009 12:58:39 +0000 (12:58 +0000)
committerAaron Schulz <aaron@users.mediawiki.org>
Fri, 3 Apr 2009 12:58:39 +0000 (12:58 +0000)
includes/LogEventsList.php
includes/specials/SpecialRevisiondelete.php

index f0b2756..a311243 100644 (file)
@@ -365,7 +365,9 @@ class LogEventsList {
                        $del = ''; // No one should be hiding from the oversight log
                } else {
                        $target = SpecialPage::getTitleFor( 'Log', $row->log_type );
-                       $query = array( 'target' => $target->getPrefixedDBkey(), 'logid' => $row->log_id );
+                       $page = Title::makeTitle( $row->log_namespace, $row->log_title );
+                       $query = array( 'target' => $target->getPrefixedDBkey(),
+                               'logid' => $row->log_id, 'page' => $page->getPrefixedDBkey() );
                        $del = $this->skin->revDeleteLink( $query,
                                self::isDeleted( $row, LogPage::DELETED_RESTRICTED ) );
                }
index 0afefa2..65a9f4f 100644 (file)
@@ -49,6 +49,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        return;
                }
                $this->page = Title::newFromUrl( $this->target );
+               $this->contextPage = Title::newFromUrl( $wgRequest->getText( 'page' ) );
                # If we have revisions, get the title from the first one
                # since they should all be from the same page. This allows 
                # for more flexibility with page moves...
@@ -146,6 +147,19 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                $safeIds[] = $m[0];
                        }
                }
+               // Optimization for logs
+               if( $action == 'event' ) {
+                       # If a context page is given, use title,time index
+                       if( $this->contextPage ) {
+                               $conds['log_namespace'] = $this->contextPage->getNamespace();
+                               $conds['log_title'] = $this->contextPage->getDBKey();
+                       } else {
+                               $first = wfGetDB( DB_SLAVE )->selectField( 'logging',
+                                       'MIN(log_timestamp)', array('log_id' => $safeIds) );
+                               # The event was be hidden after it was made
+                               $conds[] = "log_timestamp >= {$first}"; // use type,time index
+                       }
+               }
                // Format is <id1,id2,i3...>
                if( count($safeIds) ) {
                        $conds[] = "log_params RLIKE '(^|\n|,)(".implode('|',$safeIds).")(,|$)'";
@@ -548,7 +562,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        Xml::submitButton( wfMsg( 'revdelete-submit' ) ) );
                $hidden = array(
                        Xml::hidden( 'wpEditToken', $wgUser->editToken() ),
-                       Xml::hidden( 'target', $this->page->getPrefixedText() ),
+                       Xml::hidden( 'target', $this->page->getPrefixedDBKey() ),
+                       Xml::hidden( 'page', $this->contextPage ? $this->contextPage->getPrefixedDBKey() : '' ),
                        Xml::hidden( 'type', $this->deleteKey ),
                        Xml::hidden( 'logid', implode(',',$this->logids) )
                );