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