Add support for actor
Bug: T211037 Change-Id: Ia395f904d12d96e0d8bf0c1b2a5f638639b3ab12
This commit is contained in:
parent
2668446cd7
commit
192f38dc4c
2 changed files with 107 additions and 45 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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';
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue