Add support for actor

Bug: T211037
Change-Id: Ia395f904d12d96e0d8bf0c1b2a5f638639b3ab12
This commit is contained in:
Paladox 2018-12-04 23:29:37 +00:00
parent 2668446cd7
commit 192f38dc4c
2 changed files with 107 additions and 45 deletions

View file

@ -64,22 +64,38 @@ function efContributionScores_Render( &$parser, $usertext, $metric = 'score' ) {
if ( $user instanceof User && $user->isLoggedIn() ) { if ( $user instanceof User && $user->isLoggedIn() ) {
global $wgLang; global $wgLang;
$revWhere = ActorMigration::newMigration()->getWhere( $dbr, 'rev_user', $user );
if ( $metric == 'score' ) { if ( $metric == 'score' ) {
$res = $dbr->select( 'revision', $res = $dbr->select(
[ 'revision' ] + $revWhere['tables'],
'COUNT(DISTINCT rev_page)+SQRT(COUNT(rev_id)-COUNT(DISTINCT rev_page))*2 AS wiki_rank', 'COUNT(DISTINCT rev_page)+SQRT(COUNT(rev_id)-COUNT(DISTINCT rev_page))*2 AS wiki_rank',
[ 'rev_user' => $user->getID() ] ); $revWhere['conds'],
__METHOD__,
[],
$revWhere['joins']
);
$row = $dbr->fetchObject( $res ); $row = $dbr->fetchObject( $res );
$output = $wgLang->formatNum( round( $row->wiki_rank, 0 ) ); $output = $wgLang->formatNum( round( $row->wiki_rank, 0 ) );
} elseif ( $metric == 'changes' ) { } elseif ( $metric == 'changes' ) {
$res = $dbr->select( 'revision', $res = $dbr->select(
[ 'revision' ] + $revWhere['tables'],
'COUNT(rev_id) AS rev_count', 'COUNT(rev_id) AS rev_count',
[ 'rev_user' => $user->getID() ] ); $revWhere['conds'],
__METHOD__,
[],
$revWhere['joins']
);
$row = $dbr->fetchObject( $res ); $row = $dbr->fetchObject( $res );
$output = $wgLang->formatNum( $row->rev_count ); $output = $wgLang->formatNum( $row->rev_count );
} elseif ( $metric == 'pages' ) { } elseif ( $metric == 'pages' ) {
$res = $dbr->select( 'revision', $res = $dbr->select(
[ 'revision' ] + $revWhere['tables'],
'COUNT(DISTINCT rev_page) AS page_count', 'COUNT(DISTINCT rev_page) AS page_count',
[ 'rev_user' => $user->getID() ] ); $revWhere['conds'],
__METHOD__,
[],
$revWhere['joins']
);
$row = $dbr->fetchObject( $res ); $row = $dbr->fetchObject( $res );
$output = $wgLang->formatNum( $row->page_count ); $output = $wgLang->formatNum( $row->page_count );
} else { } else {

View file

@ -3,6 +3,8 @@
* \brief Contains code for the ContributionScores Class (extends SpecialPage). * \brief Contains code for the ContributionScores Class (extends SpecialPage).
*/ */
use MediaWiki\MediaWikiServices;
/// Special page class for the Contribution Scores extension /// Special page class for the Contribution Scores extension
/** /**
* Special page that generates a list of wiki contributors based * Special page that generates a list of wiki contributors based
@ -35,61 +37,105 @@ class ContributionScores extends IncludableSpecialPage {
$dbr = wfGetDB( DB_REPLICA ); $dbr = wfGetDB( DB_REPLICA );
$userTable = $dbr->tableName( 'user' ); $store = MediaWikiServices::getInstance()
$userGroupTable = $dbr->tableName( 'user_groups' ); ->getRevisionStoreFactory()
$revTable = $dbr->tableName( 'revision' ); ->getRevisionStore();
$ipBlocksTable = $dbr->tableName( 'ipblocks' ); $revQuery = $store->getQueryInfo();
$sqlWhere = ""; $revUser = $revQuery['fields']['rev_user'];
$nextPrefix = "WHERE";
$sqlWhere = [];
if ( $days > 0 ) { if ( $days > 0 ) {
$date = time() - ( 60 * 60 * 24 * $days ); $date = time() - ( 60 * 60 * 24 * $days );
$dateString = $dbr->timestamp( $date ); $dateString = $dbr->timestamp( $date );
$sqlWhere .= " {$nextPrefix} rev_timestamp > '$dateString'"; $sqlWhere[] = "rev_timestamp > '$dateString'";
$nextPrefix = "AND";
} }
if ( $wgContribScoreIgnoreBlockedUsers ) { if ( $wgContribScoreIgnoreBlockedUsers ) {
$sqlWhere .= " {$nextPrefix} rev_user NOT IN " . $sqlWhere[] = "{$revUser} NOT IN " .
"(SELECT ipb_user FROM {$ipBlocksTable} WHERE ipb_user <> 0)"; $dbr->buildSelectSubquery( 'ipblocks', 'ipb_user', 'ipb_user <> 0', __METHOD__ );
$nextPrefix = "AND";
} }
if ( $wgContribScoreIgnoreBots ) { if ( $wgContribScoreIgnoreBots ) {
$sqlWhere .= " {$nextPrefix} rev_user NOT IN " . $sqlWhere[] = "{$revUser} NOT IN " .
"(SELECT ug_user FROM {$userGroupTable} WHERE ug_group='bot')"; $dbr->buildSelectSubquery( 'user_groups', 'ug_user', [ 'ug_group' => 'bot' ], __METHOD__ );
} }
$sqlMostPages = "SELECT rev_user, if ( $dbr->unionSupportsOrderAndLimit() ) {
COUNT(DISTINCT rev_page) AS page_count, $order = [
COUNT(rev_id) AS rev_count 'GROUP BY' => $revUser,
FROM {$revTable} 'ORDER BY' => 'page_count DESC',
{$sqlWhere} 'LIMIT' => $limit
GROUP BY rev_user ];
ORDER BY page_count DESC } else {
LIMIT {$limit}"; $order = [ 'GROUP BY' => $revUser ];
}
$sqlMostRevs = "SELECT rev_user, $sqlMostPages = $dbr->selectSQLText(
COUNT(DISTINCT rev_page) AS page_count, $revQuery['tables'],
COUNT(rev_id) AS rev_count [
FROM {$revTable} 'rev_user' => $revUser,
{$sqlWhere} 'page_count' => 'COUNT(DISTINCT rev_page)',
GROUP BY rev_user 'rev_count' => 'COUNT(rev_id)',
ORDER BY rev_count DESC ],
LIMIT {$limit}"; $sqlWhere,
__METHOD__,
$order,
$revQuery['joins']
);
$sql = "SELECT user_id, " . if ( $dbr->unionSupportsOrderAndLimit() ) {
"user_name, " . $order = [
"user_real_name, " . 'GROUP BY' => 'rev_user',
"page_count, " . 'ORDER BY' => 'rev_count DESC',
"rev_count, " . 'LIMIT' => $limit
"page_count+SQRT(rev_count-page_count)*2 AS wiki_rank " . ];
"FROM $userTable u JOIN (($sqlMostPages) UNION ($sqlMostRevs)) s ON (user_id=rev_user) " . } else {
"ORDER BY wiki_rank DESC " . $order = [ 'GROUP BY' => 'rev_user' ];
"LIMIT $limit"; }
$res = $dbr->query( $sql ); $sqlMostRevs = $dbr->selectSQLText(
$revQuery['tables'],
[
'rev_user' => $revUser,
'page_count' => 'COUNT(DISTINCT rev_page)',
'rev_count' => 'COUNT(rev_id)',
],
$sqlWhere,
__METHOD__,
$order,
$revQuery['joins']
);
$sqlMostPagesOrRevs = $dbr->unionQueries( [ $sqlMostPages, $sqlMostRevs ], false );
$res = $dbr->select(
[
'u' => 'user',
's' => new Wikimedia\Rdbms\Subquery( $sqlMostPagesOrRevs ),
],
[
'user_id',
'user_name',
'user_real_name',
'page_count',
'rev_count',
'wiki_rank' => 'page_count+SQRT(rev_count-page_count)*2',
],
[],
__METHOD__,
[
'ORDER BY' => 'wiki_rank DESC',
'LIMIT' => $limit,
],
[
's' => [
'JOIN',
'user_id=rev_user'
]
]
);
$sortable = in_array( 'nosort', $opts ) ? '' : ' sortable'; $sortable = in_array( 'nosort', $opts ) ? '' : ' sortable';