API: (bug 16421) Actually do user name normalization in list=logevents. Also fix...
[lhc/web/wiklou.git] / includes / api / ApiQueryLogEvents.php
index df93e7c..84bd15d 100644 (file)
@@ -31,7 +31,7 @@ if (!defined('MEDIAWIKI')) {
 /**
  * Query action to List the log events, with optional filtering by various parameters.
  *
- * @addtogroup API
+ * @ingroup API
  */
 class ApiQueryLogEvents extends ApiQueryBase {
 
@@ -58,10 +58,14 @@ class ApiQueryLogEvents extends ApiQueryBase {
                if($hideLogs !== false)
                        $this->addWhere($hideLogs);
 
-               $this->addOption('STRAIGHT_JOIN');
-               $this->addTables("$tbl_logging LEFT OUTER JOIN $tbl_page ON " .
-               "log_namespace=page_namespace AND log_title=page_title " .
-               "INNER JOIN $tbl_user ON user_id=log_user");
+               // Order is significant here
+               $this->addTables(array('user', 'page', 'logging'));
+               $this->addJoinConds(array(
+                       'page' => array('LEFT JOIN',
+                               array(  'log_namespace=page_namespace',
+                                       'log_title=page_title'))));
+               $this->addWhere('user_id=log_user');
+               $this->addOption('USE INDEX', array('logging' => 'times')); // default, may change
 
                $this->addFields(array (
                        'log_type',
@@ -69,8 +73,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        'log_timestamp',
                ));
 
-               // FIXME: Fake out log_id for now until the column is live on Wikimedia
-               // $this->addFieldsIf('log_id', $this->fld_ids);
+               $this->addFieldsIf('log_id', $this->fld_ids);
                $this->addFieldsIf('page_id', $this->fld_ids);
                $this->addFieldsIf('log_user', $this->fld_user);
                $this->addFieldsIf('user_name', $this->fld_user);
@@ -79,22 +82,26 @@ class ApiQueryLogEvents extends ApiQueryBase {
                $this->addFieldsIf('log_comment', $this->fld_comment);
                $this->addFieldsIf('log_params', $this->fld_details);
 
-
                $this->addWhereFld('log_deleted', 0);
-               $this->addWhereFld('log_type', $params['type']);
+               
+               if( !is_null($params['type']) ) {
+                       $this->addWhereFld('log_type', $params['type']);
+                       $this->addOption('USE INDEX', array('logging' => array('type_time')));
+               }
+               
                $this->addWhereRange('log_timestamp', $params['dir'], $params['start'], $params['end']);
 
                $limit = $params['limit'];
                $this->addOption('LIMIT', $limit +1);
-
+               
+               $index = false;
                $user = $params['user'];
                if (!is_null($user)) {
-                       $userid = $db->selectField('user', 'user_id', array (
-                               'user_name' => $user
-                       ));
+                       $userid = User::idFromName($user);
                        if (!$userid)
                                $this->dieUsage("User name $user not found", 'param_user');
                        $this->addWhereFld('log_user', $userid);
+                       $index = 'user_time';
                }
 
                $title = $params['title'];
@@ -104,8 +111,15 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                $this->dieUsage("Bad title value '$title'", 'param_title');
                        $this->addWhereFld('log_namespace', $titleObj->getNamespace());
                        $this->addWhereFld('log_title', $titleObj->getDBkey());
+
+                       // Use the title index in preference to the user index if there is a conflict
+                       $index = 'page_time';
+               }
+               if ( $index ) {
+                       $this->addOption( 'USE INDEX', array( 'logging' => $index ) );
                }
 
+
                $data = array ();
                $count = 0;
                $res = $this->select(__METHOD__);
@@ -125,14 +139,52 @@ class ApiQueryLogEvents extends ApiQueryBase {
                $this->getResult()->setIndexedTagName($data, 'item');
                $this->getResult()->addValue('query', $this->getModuleName(), $data);
        }
+       
+       public static function addLogParams($result, &$vals, $params, $type) {
+               $params = explode("\n", $params);
+               switch ($type) {
+                       case 'move':
+                               if (isset ($params[0])) {
+                                       $title = Title :: newFromText($params[0]);
+                                       if ($title) {
+                                               $vals2 = array();
+                                               ApiQueryBase :: addTitleInfo($vals2, $title, "new_");
+                                               $vals[$type] = $vals2;
+                                               $params = null;
+                                       }
+                               }
+                               break;
+                       case 'patrol':
+                               $vals2 = array();
+                               list( $vals2['cur'], $vals2['prev'], $vals2['auto'] ) = $params;
+                               $vals[$type] = $vals2;
+                               $params = null;
+                               break;
+                       case 'rights':
+                               $vals2 = array();
+                               list( $vals2['old'], $vals2['new'] ) = $params;
+                               $vals[$type] = $vals2;
+                               $params = null;
+                               break;
+                       case 'block':
+                               $vals2 = array();
+                               list( $vals2['duration'], $vals2['flags'] ) = $params;
+                               $vals[$type] = $vals2;
+                               $params = null;
+                               break;
+               }
+               if (!is_null($params)) {
+                       $result->setIndexedTagName($params, 'param');
+                       $vals = array_merge($vals, $params);
+               }
+               return $vals;
+       }
 
        private function extractRowInfo($row) {
                $vals = array();
 
                if ($this->fld_ids) {
-                       // FIXME: Fake out log_id for now until the column is live on Wikimedia
-                       // $vals['logid'] = intval($row->log_id);
-                       $vals['logid'] = 0;
+                       $vals['logid'] = intval($row->log_id);
                        $vals['pageid'] = intval($row->page_id);
                }
 
@@ -147,43 +199,8 @@ class ApiQueryLogEvents extends ApiQueryBase {
                }
 
                if ($this->fld_details && $row->log_params !== '') {
-                       $params = explode("\n", $row->log_params);
-                       switch ($row->log_type) {
-                               case 'move':
-                                       if (isset ($params[0])) {
-                                               $title = Title :: newFromText($params[0]);
-                                               if ($title) {
-                                                       $vals2 = array();
-                                                       ApiQueryBase :: addTitleInfo($vals2, $title, "new_");
-                                                       $vals[$row->log_type] = $vals2;
-                                                       $params = null;
-                                               }
-                                       }
-                                       break;
-                               case 'patrol':
-                                       $vals2 = array();
-                                       list( $vals2['cur'], $vals2['prev'], $vals2['auto'] ) = $params;
-                                       $vals[$row->log_type] = $vals2;
-                                       $params = null;
-                                       break;
-                               case 'rights':
-                                       $vals2 = array();
-                                       list( $vals2['old'], $vals2['new'] ) = $params;
-                                       $vals[$row->log_type] = $vals2;
-                                       $params = null;
-                                       break;
-                               case 'block':
-                                       $vals2 = array();
-                                       list( $vals2['duration'], $vals2['flags'] ) = $params;
-                                       $vals[$row->log_type] = $vals2;
-                                       $params = null;
-                                       break;
-                       }
-
-                       if (isset($params)) {
-                               $this->getResult()->setIndexedTagName($params, 'param');
-                               $vals = array_merge($vals, $params);
-                       }
+                       self::addLogParams($this->getResult(), $vals,
+                               $row->log_params, $row->log_type);
                }
 
                if ($this->fld_user) {
@@ -194,7 +211,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                if ($this->fld_timestamp) {
                        $vals['timestamp'] = wfTimestamp(TS_ISO_8601, $row->log_timestamp);
                }
-               if ($this->fld_comment && !empty ($row->log_comment)) {
+               if ($this->fld_comment && isset($row->log_comment)) {
                        $vals['comment'] = $row->log_comment;
                }