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
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs