From 192f38dc4c63b7b9a8f487bb9113af378d708056 Mon Sep 17 00:00:00 2001 From: Paladox Date: Tue, 4 Dec 2018 23:29:37 +0000 Subject: [PATCH] Add support for actor Bug: T211037 Change-Id: Ia395f904d12d96e0d8bf0c1b2a5f638639b3ab12 --- ContributionScores.php | 28 ++++++-- ContributionScores_body.php | 124 ++++++++++++++++++++++++------------ 2 files changed, 107 insertions(+), 45 deletions(-) diff --git a/ContributionScores.php b/ContributionScores.php index 7be318e..9e96446 100644 --- a/ContributionScores.php +++ b/ContributionScores.php @@ -64,22 +64,38 @@ function efContributionScores_Render( &$parser, $usertext, $metric = 'score' ) { if ( $user instanceof User && $user->isLoggedIn() ) { global $wgLang; + $revWhere = ActorMigration::newMigration()->getWhere( $dbr, 'rev_user', $user ); 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', - [ 'rev_user' => $user->getID() ] ); + $revWhere['conds'], + __METHOD__, + [], + $revWhere['joins'] + ); $row = $dbr->fetchObject( $res ); $output = $wgLang->formatNum( round( $row->wiki_rank, 0 ) ); } elseif ( $metric == 'changes' ) { - $res = $dbr->select( 'revision', + $res = $dbr->select( + [ 'revision' ] + $revWhere['tables'], 'COUNT(rev_id) AS rev_count', - [ 'rev_user' => $user->getID() ] ); + $revWhere['conds'], + __METHOD__, + [], + $revWhere['joins'] + ); $row = $dbr->fetchObject( $res ); $output = $wgLang->formatNum( $row->rev_count ); } elseif ( $metric == 'pages' ) { - $res = $dbr->select( 'revision', + $res = $dbr->select( + [ 'revision' ] + $revWhere['tables'], 'COUNT(DISTINCT rev_page) AS page_count', - [ 'rev_user' => $user->getID() ] ); + $revWhere['conds'], + __METHOD__, + [], + $revWhere['joins'] + ); $row = $dbr->fetchObject( $res ); $output = $wgLang->formatNum( $row->page_count ); } else { diff --git a/ContributionScores_body.php b/ContributionScores_body.php index 6142c1f..4a29e2b 100644 --- a/ContributionScores_body.php +++ b/ContributionScores_body.php @@ -3,6 +3,8 @@ * \brief Contains code for the ContributionScores Class (extends SpecialPage). */ +use MediaWiki\MediaWikiServices; + /// Special page class for the Contribution Scores extension /** * Special page that generates a list of wiki contributors based @@ -35,61 +37,105 @@ class ContributionScores extends IncludableSpecialPage { $dbr = wfGetDB( DB_REPLICA ); - $userTable = $dbr->tableName( 'user' ); - $userGroupTable = $dbr->tableName( 'user_groups' ); - $revTable = $dbr->tableName( 'revision' ); - $ipBlocksTable = $dbr->tableName( 'ipblocks' ); + $store = MediaWikiServices::getInstance() + ->getRevisionStoreFactory() + ->getRevisionStore(); + $revQuery = $store->getQueryInfo(); - $sqlWhere = ""; - $nextPrefix = "WHERE"; + $revUser = $revQuery['fields']['rev_user']; + + $sqlWhere = []; if ( $days > 0 ) { $date = time() - ( 60 * 60 * 24 * $days ); $dateString = $dbr->timestamp( $date ); - $sqlWhere .= " {$nextPrefix} rev_timestamp > '$dateString'"; - $nextPrefix = "AND"; + $sqlWhere[] = "rev_timestamp > '$dateString'"; } if ( $wgContribScoreIgnoreBlockedUsers ) { - $sqlWhere .= " {$nextPrefix} rev_user NOT IN " . - "(SELECT ipb_user FROM {$ipBlocksTable} WHERE ipb_user <> 0)"; - $nextPrefix = "AND"; + $sqlWhere[] = "{$revUser} NOT IN " . + $dbr->buildSelectSubquery( 'ipblocks', 'ipb_user', 'ipb_user <> 0', __METHOD__ ); } if ( $wgContribScoreIgnoreBots ) { - $sqlWhere .= " {$nextPrefix} rev_user NOT IN " . - "(SELECT ug_user FROM {$userGroupTable} WHERE ug_group='bot')"; + $sqlWhere[] = "{$revUser} NOT IN " . + $dbr->buildSelectSubquery( 'user_groups', 'ug_user', [ 'ug_group' => 'bot' ], __METHOD__ ); + } - $sqlMostPages = "SELECT rev_user, - COUNT(DISTINCT rev_page) AS page_count, - COUNT(rev_id) AS rev_count - FROM {$revTable} - {$sqlWhere} - GROUP BY rev_user - ORDER BY page_count DESC - LIMIT {$limit}"; + if ( $dbr->unionSupportsOrderAndLimit() ) { + $order = [ + 'GROUP BY' => $revUser, + 'ORDER BY' => 'page_count DESC', + 'LIMIT' => $limit + ]; + } else { + $order = [ 'GROUP BY' => $revUser ]; + } - $sqlMostRevs = "SELECT rev_user, - COUNT(DISTINCT rev_page) AS page_count, - COUNT(rev_id) AS rev_count - FROM {$revTable} - {$sqlWhere} - GROUP BY rev_user - ORDER BY rev_count DESC - LIMIT {$limit}"; + $sqlMostPages = $dbr->selectSQLText( + $revQuery['tables'], + [ + 'rev_user' => $revUser, + 'page_count' => 'COUNT(DISTINCT rev_page)', + 'rev_count' => 'COUNT(rev_id)', + ], + $sqlWhere, + __METHOD__, + $order, + $revQuery['joins'] + ); - $sql = "SELECT user_id, " . - "user_name, " . - "user_real_name, " . - "page_count, " . - "rev_count, " . - "page_count+SQRT(rev_count-page_count)*2 AS wiki_rank " . - "FROM $userTable u JOIN (($sqlMostPages) UNION ($sqlMostRevs)) s ON (user_id=rev_user) " . - "ORDER BY wiki_rank DESC " . - "LIMIT $limit"; + if ( $dbr->unionSupportsOrderAndLimit() ) { + $order = [ + 'GROUP BY' => 'rev_user', + 'ORDER BY' => 'rev_count DESC', + 'LIMIT' => $limit + ]; + } else { + $order = [ 'GROUP BY' => 'rev_user' ]; + } - $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';