https://www.mediawiki.org/wiki/Special:Code/MediaWiki/114222

Revision: 114222
Author:   bsitu
Date:     2012-03-20 00:20:12 +0000 (Tue, 20 Mar 2012)
Log Message:
-----------
Add method to generate PageTriage dashboard data and table for logging 
pagetriage activity

Modified Paths:
--------------
    trunk/extensions/PageTriage/PageTriage.php

Added Paths:
-----------
    trunk/extensions/PageTriage/includes/PageTriageUtil.php
    trunk/extensions/PageTriage/sql/PageTriageLog.sql

Modified: trunk/extensions/PageTriage/PageTriage.php
===================================================================
--- trunk/extensions/PageTriage/PageTriage.php  2012-03-20 00:14:56 UTC (rev 
114221)
+++ trunk/extensions/PageTriage/PageTriage.php  2012-03-20 00:20:12 UTC (rev 
114222)
@@ -52,6 +52,7 @@
 $wgSpecialPages['PageTriage'] = 'SpecialPageTriage';
 $wgSpecialPageGroups['PageTriage'] = 'changes';
 $wgAutoloadClasses['ArticleMetadata'] = $dir . 'includes/ArticleMetadata.php';
+$wgAutoloadClasses['PageTriageUtil'] = $dir . 'includes/PageTriageUtil.php';
 $wgAutoloadClasses['PageTriageHooks'] = $dir . 'PageTriage.hooks.php';
 
 $wgAutoloadClasses['ApiQueryPageTriage'] = $dir . 'api/ApiQueryPageTriage.php';
@@ -60,6 +61,7 @@
 // custom exceptions
 $wgAutoloadClasses['MWArticleMetadataMissingPageIdException'] = $dir . 
'includes/ArticleMetadata.php';
 $wgAutoloadClasses['MWArticleMetadataMetaDataOutofBoundException'] = $dir . 
'includes/ArticleMetadata.php';
+$wgAutoloadClasses['MWPageTriageUtilInvalidNumberException'] = $dir . 
'includes/PageTriageUtil.php';
 
 // api modules
 $wgAPIModules['pagetriage'] = 'ApiQueryPageTriage';
@@ -91,6 +93,7 @@
        $updater->addExtensionTable( 'pagetriage_tags', $base . 
'/PageTriageTags.sql' );
        $updater->addExtensionTable( 'pagetriage_page_tags', $base . 
'/PageTriagePageTags.sql' );
        $updater->addExtensionTable( 'pagetriage_page', $base . 
'/PageTriagePage.sql' );
+       $updater->addExtensionTable( 'pagetriage_log', $base . 
'/PageTriageLog.sql' );
 
        return true;
 }

Added: trunk/extensions/PageTriage/includes/PageTriageUtil.php
===================================================================
--- trunk/extensions/PageTriage/includes/PageTriageUtil.php                     
        (rev 0)
+++ trunk/extensions/PageTriage/includes/PageTriageUtil.php     2012-03-20 
00:20:12 UTC (rev 114222)
@@ -0,0 +1,138 @@
+<?php
+
+/**
+ * Utility class for PageTriage
+ */
+class PageTriageUtil {
+
+       /**
+        * Get a list of stat for untriaged articles
+        * @return array
+        *
+        * @Todo - Limit the number of records by a timestamp filter, maybe 30 
days etc,
+        *         depends on the time the triage queue should look back for 
listview
+        */
+       public static function getUntriageArticleStat() {
+               global $wgMemc;
+               
+               $key = wfMemcKey( 'pagetriage', 'untriaged-article', 'stat' );
+       
+               $data = $wgMemc->get( $key );
+               if ( $data !== false ) {
+                       return $data;
+               }
+               
+               $dbr = wfGetDB( DB_SLAVE );
+               
+               $res = $dbr->selectRow( 
+                       array( 'pagetriage_page' ),
+                       array( 'COUNT(ptrp_id) AS total' ),
+                       array( 'ptrp_triaged' => 0 )
+               );
+
+               $percentile = array( 25, 50, 75, 90, 100 );
+
+               $data = array( 'count' => 0 );
+
+               foreach ( $percentile as $val ) {
+                       $data['age-' . $val . 'th-percentile'] = false; 
+               }
+
+               if ( $res ) {
+                       $data['count'] = intval( $res->total );
+
+                       // show percentile stat only if there is a certain 
number of untriaged articles
+                       if ( $data['count'] > 10 ) {
+                               foreach ( $percentile as $val ) {
+                                       $data['age-' . $val . 'th-percentile'] 
= self::estimateArticleAgePercentile( $val, $data['count'] );
+                               }
+                       }
+               }
+               
+               // make it expire in an hour
+               $wgMemc->set( $key, $data, 3600 );
+               return $data;
+       }
+
+       /**
+        * Get top page triagers in the past week
+        * @param $num int - number of records to retrieve
+        * @return array
+        */
+       public static function getTopTriager( $num = 5 ) {
+               global $wgMemc;
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $key = wfMemcKey( 'pagetriage', 'top-triager', 'past-week' );
+
+               $topTriager = $wgMemc->get( $key );
+               if ( $topTriager === false ) {
+                       $timestamp = wfTimestamp( TS_UNIX ) - 7 * 24 * 60 * 60; 
// 1 week ago
+
+                       $res = $dbr->select(
+                               array( 'pagetriage_log', 'user' ),
+                               array( 'user_name', 'COUNT(ptrl_id) AS num' ),
+                               array( 'user_id = ptrl_user_id', 
'ptrl_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( $timestamp ) ) ),
+                               __METHOD__,
+                               array( 'GROUP BY' => 'user_id', 'ORDER BY' => 
'num DESC', 'LIMIT' => $num )
+                       );
+                       
+                       $topTriager = iterator_to_array( $res );
+
+                       // make it expire in 2 hours
+                       $wgMemc->set( $key, $topTriager, 7200 );
+               }
+
+               return $topTriager;
+       }
+       
+       /**
+        * Calculate the age of untriaged articles by percentile
+        * @param $percentile int
+        * @param $count int
+        * @return int|bool
+        */
+       private static function estimateArticleAgePercentile( $percentile, 
$count ) {
+
+               if ( !is_int( $percentile ) || $percentile < 1 || $percentile > 
100) {
+                       throw new MWPageTriageUtilInvalidNumberException( 
'Invalid percentage number' );
+               }
+               
+               if ( !is_int( $count ) || $count < 1 ) {
+                       throw new MWPageTriageUtilInvalidNumberException ( 
'Invalid total count' );
+               }
+
+               // starting from oldest timestamp if percent is > 50
+               if ( $percentile > 50 ) {
+                       $percentile = 100 - $percentile;
+                       $order = 'ASC';
+               } else {
+                       $order = 'DESC';
+               }
+               
+               $start = floor( ( $percentile / 100 ) * $count ) - 1;           
+               
+               if ( $start < 0 ) {
+                       $start = 0;
+               }
+       
+               $dbr = wfGetDB( DB_SLAVE );
+               
+               $res = $dbr->selectRow(
+                       array( 'pagetriage_page' ),
+                       array( 'ptrp_timestamp' ),
+                       array( 'ptrp_triaged' => 0 ),
+                       __METHOD__,
+                       array( 'ORDER BY' => "ptrp_timestamp $order", 'LIMIT' 
=> '1', 'OFFSET' => $start )
+               );
+
+               if ( $res ) {
+                       return $res->ptrp_timestamp;
+               } else {
+                       return false;   
+               }
+       }
+
+}
+
+class MWPageTriageUtilInvalidNumberException extends MWException {}


Property changes on: trunk/extensions/PageTriage/includes/PageTriageUtil.php
___________________________________________________________________
Added: svn:eol-style
   + native

Added: trunk/extensions/PageTriage/sql/PageTriageLog.sql
===================================================================
--- trunk/extensions/PageTriage/sql/PageTriageLog.sql                           
(rev 0)
+++ trunk/extensions/PageTriage/sql/PageTriageLog.sql   2012-03-20 00:20:12 UTC 
(rev 114222)
@@ -0,0 +1,12 @@
+-- Store the triage log for articles
+CREATE TABLE /*_*/pagetriage_log (
+       ptrl_id int unsigned NOT NULL PRIMARY KEY auto_increment,
+       ptrl_page_id int unsigned NOT NULL,
+       ptrl_user_id int unsigned NOT NULL,
+       ptrl_triaged tinyint unsigned not null default 0,
+       ptrl_comment varbinary(255),
+       ptrl_timestamp varbinary(14) NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE INDEX /*i*/ptrl_page_id_timestamp ON /*_*/pagetriage_log (ptrl_page_id, 
ptrl_timestamp);
+CREATE INDEX /*i*/ptrl_timestamp ON /*_*/pagetriage_log (ptrl_timestamp);


Property changes on: trunk/extensions/PageTriage/sql/PageTriageLog.sql
___________________________________________________________________
Added: svn:eol-style
   + native


_______________________________________________
MediaWiki-CVS mailing list
MediaWiki-CVS@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to