From 6024bfd83b4ec99763adc8e6aba9a85897fc505e Mon Sep 17 00:00:00 2001
From: Func <Funcer@outlook.com>
Date: Tue, 23 Mar 2021 15:27:18 +0000
Subject: [PATCH] Introduce a config, to use the rough number of edits in user
 table

Bug: T278030
Change-Id: Ibd6d0380cc091e4720fb038bd8c663a6ebb4a6ea
---
 extension.json             |  4 ++++
 src/ContributionScores.php | 36 +++++++++++++++++++++---------------
 2 files changed, 25 insertions(+), 15 deletions(-)

diff --git a/extension.json b/extension.json
index 6e1cefb..94212dd 100644
--- a/extension.json
+++ b/extension.json
@@ -46,6 +46,10 @@
 		"ContribScoreDisableCache": {
 			"value": false,
 			"description": "Set to true to disable cache for parser function and inclusion of table."
+		},
+		"ContribScoreUseRoughEditCount": {
+			"value": false,
+			"description": "Set to true to use the rough number of edits in user table, for performance issue."
 		}
 	},
 	"manifest_version": 2
diff --git a/src/ContributionScores.php b/src/ContributionScores.php
index ff9f83d..1434243 100644
--- a/src/ContributionScores.php
+++ b/src/ContributionScores.php
@@ -24,7 +24,7 @@ class ContributionScores extends IncludableSpecialPage {
 	}
 
 	public static function efContributionScoresRender( $parser, $usertext, $metric = 'score' ) {
-		global $wgContribScoreDisableCache;
+		global $wgContribScoreDisableCache, $wgContribScoreUseRoughEditCount;
 
 		if ( $wgContribScoreDisableCache ) {
 			$parser->getOutput()->updateCacheExpiry( 0 );
@@ -35,12 +35,13 @@ class ContributionScores extends IncludableSpecialPage {
 
 		if ( $user instanceof User && $user->isRegistered() ) {
 			global $wgLang;
+			$revVar = $wgContribScoreUseRoughEditCount ? 'user_editcount' : 'COUNT(rev_id)';
 
 			$revWhere = ActorMigration::newMigration()->getWhere( $dbr, 'rev_user', $user );
 			if ( $metric == 'score' ) {
 				$res = $dbr->select(
 					[ 'revision' ] + $revWhere['tables'],
-					'COUNT(DISTINCT rev_page)+SQRT(COUNT(rev_id)-COUNT(DISTINCT rev_page))*2 AS wiki_rank',
+					[ 'wiki_rank' => "COUNT(DISTINCT rev_page)+SQRT($revVar-COUNT(DISTINCT rev_page))*2" ],
 					$revWhere['conds'],
 					__METHOD__,
 					[],
@@ -51,7 +52,7 @@ class ContributionScores extends IncludableSpecialPage {
 			} elseif ( $metric == 'changes' ) {
 				$res = $dbr->select(
 					[ 'revision' ] + $revWhere['tables'],
-					'COUNT(rev_id) AS rev_count',
+					[ 'rev_count' => $revVar ],
 					$revWhere['conds'],
 					__METHOD__,
 					[],
@@ -62,7 +63,7 @@ class ContributionScores extends IncludableSpecialPage {
 			} elseif ( $metric == 'pages' ) {
 				$res = $dbr->select(
 					[ 'revision' ] + $revWhere['tables'],
-					'COUNT(DISTINCT rev_page) AS page_count',
+					[ 'page_count' => 'COUNT(DISTINCT rev_page)' ],
 					$revWhere['conds'],
 					__METHOD__,
 					[],
@@ -91,7 +92,8 @@ class ContributionScores extends IncludableSpecialPage {
 	 * @return string Html Table representing the requested Contribution Scores.
 	 */
 	function genContributionScoreTable( $days, $limit, $title = null, $options = 'none' ) {
-		global $wgContribScoreIgnoreBots, $wgContribScoreIgnoreBlockedUsers, $wgContribScoresUseRealName;
+		global $wgContribScoreIgnoreBots, $wgContribScoreIgnoreBlockedUsers, $wgContribScoresUseRealName,
+			$wgContribScoreUseRoughEditCount;
 
 		$opts = explode( ',', strtolower( $options ) );
 
@@ -109,6 +111,18 @@ class ContributionScores extends IncludableSpecialPage {
 			$sqlWhere[] = 'rev_timestamp > ' . $dbr->addQuotes( $dbr->timestamp( $date ) );
 		}
 
+		$sqlVars = [
+			'rev_user'   => $revUser,
+			'page_count' => 'COUNT(DISTINCT rev_page)'
+		];
+		if ( $wgContribScoreUseRoughEditCount ) {
+			$revQuery['tables'][] = 'user';
+			$revQuery['joins']['user'] = [ 'LEFT JOIN', [ "$revUser != 0", "user_id = $revUser" ] ];
+			$sqlVars['rev_count'] = 'user_editcount';
+		} else {
+			$sqlVars['rev_count'] = 'COUNT(rev_id)';
+		}
+
 		if ( $wgContribScoreIgnoreBlockedUsers ) {
 			$sqlWhere[] = "{$revUser} NOT IN " .
 				$dbr->buildSelectSubquery( 'ipblocks', 'ipb_user', 'ipb_user <> 0', __METHOD__ );
@@ -134,11 +148,7 @@ class ContributionScores extends IncludableSpecialPage {
 
 		$sqlMostPages = $dbr->selectSQLText(
 			$revQuery['tables'],
-			[
-				'rev_user'   => $revUser,
-				'page_count' => 'COUNT(DISTINCT rev_page)',
-				'rev_count'  => 'COUNT(rev_id)',
-			],
+			$sqlVars,
 			$sqlWhere,
 			__METHOD__,
 			$order,
@@ -151,11 +161,7 @@ class ContributionScores extends IncludableSpecialPage {
 
 		$sqlMostRevs = $dbr->selectSQLText(
 			$revQuery['tables'],
-			[
-				'rev_user' => $revUser,
-				'page_count' => 'COUNT(DISTINCT rev_page)',
-				'rev_count' => 'COUNT(rev_id)',
-			],
+			$sqlVars,
 			$sqlWhere,
 			__METHOD__,
 			$order,