Add config to use change_tag_def table for Special:Tags
[lhc/web/wiklou.git] / includes / changetags / ChangeTags.php
index 0c81144..3bb777e 100644 (file)
@@ -213,7 +213,7 @@ class ChangeTags {
         * @param int|null $rc_id The rc_id of the change to add the tags to
         * @param int|null $rev_id The rev_id of the change to add the tags to
         * @param int|null $log_id The log_id of the change to add the tags to
-        * @param string $params Params to put in the ct_params field of table 'change_tag'
+        * @param string|null $params Params to put in the ct_params field of table 'change_tag'
         * @param RecentChange|null $rc Recent change, in case the tagging accompanies the action
         * (this should normally be the case)
         *
@@ -244,7 +244,7 @@ class ChangeTags {
         * Pass a variable whose value is null if the rev_id is not relevant or unknown.
         * @param int|null &$log_id The log_id of the change to add the tags to.
         * Pass a variable whose value is null if the log_id is not relevant or unknown.
-        * @param string $params Params to put in the ct_params field of table
+        * @param string|null $params Params to put in the ct_params field of table
         * 'change_tag' when adding tags
         * @param RecentChange|null $rc Recent change being tagged, in case the tagging accompanies
         * the action
@@ -346,31 +346,18 @@ class ChangeTags {
                if ( count( $tagsToAdd ) ) {
                        $changeTagMapping = [];
                        if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_OLD ) {
-                               $tagDefRows = [];
+                               $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
+
                                foreach ( $tagsToAdd as $tag ) {
-                                       $tagDefRows[] = [
-                                               'ctd_name' => $tag,
-                                               'ctd_user_defined' => 0,
-                                               'ctd_count' => 1
-                                       ];
+                                       $changeTagMapping[$tag] = $changeTagDefStore->acquireId( $tag );
                                }
 
-                               $dbw->upsert(
+                               $dbw->update(
                                        'change_tag_def',
-                                       $tagDefRows,
-                                       [ 'ctd_name' ],
                                        [ 'ctd_count = ctd_count + 1' ],
+                                       [ 'ctd_name' => $tagsToAdd ],
                                        __METHOD__
                                );
-
-                               $res = $dbw->select(
-                                       'change_tag_def',
-                                       [ 'ctd_name', 'ctd_id' ],
-                                       [ 'ctd_name' => $tagsToAdd ]
-                               );
-                               foreach ( $res as $row ) {
-                                       $changeTagMapping[$row->ctd_name] = $row->ctd_id;
-                               }
                        }
 
                        $tagsRows = [];
@@ -386,7 +373,7 @@ class ChangeTags {
                                                'ct_log_id' => $log_id,
                                                'ct_rev_id' => $rev_id,
                                                'ct_params' => $params,
-                                               'ct_tag_id' => isset( $changeTagMapping[$tag] ) ? $changeTagMapping[$tag] : null,
+                                               'ct_tag_id' => $changeTagMapping[$tag] ?? null,
                                        ]
                                );
 
@@ -466,7 +453,7 @@ class ChangeTags {
                // $prevTags can be out of date on replica DBs, especially when addTags is called consecutively,
                // causing loss of tags added recently in tag_summary table.
                $prevTags = $dbw->selectField( 'tag_summary', 'ts_tags', $tsConds, __METHOD__ );
-               $prevTags = $prevTags ? $prevTags : '';
+               $prevTags = $prevTags ?: '';
                $prevTags = array_filter( explode( ',', $prevTags ) );
 
                // add tags
@@ -954,7 +941,7 @@ class ChangeTags {
         * @param string $tag
         * @param string $reason
         * @param User $user Who to attribute the action to
-        * @param int $tagCount For deletion only, how many usages the tag had before
+        * @param int|null $tagCount For deletion only, how many usages the tag had before
         * it was deleted.
         * @param array $logEntryTags Change tags to apply to the entry
         * that will be created in the tag management log
@@ -1520,6 +1507,13 @@ class ChangeTags {
         * @return array Array of string => int
         */
        public static function tagUsageStatistics() {
+               global $wgChangeTagsSchemaMigrationStage, $wgTagStatisticsNewTable;
+               if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ||
+                       ( $wgTagStatisticsNewTable && $wgChangeTagsSchemaMigrationStage > MIGRATION_OLD )
+               ) {
+                       return self::newTagUsageStatistics();
+               }
+
                $fname = __METHOD__;
                $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
                return $cache->getWithSetCallback(
@@ -1553,6 +1547,29 @@ class ChangeTags {
                );
        }
 
+       /**
+        * Same self::tagUsageStatistics() but uses change_tag_def.
+        *
+        * @return array Array of string => int
+        */
+       private static function newTagUsageStatistics() {
+               $dbr = wfGetDB( DB_REPLICA );
+               $res = $dbr->select(
+                       'change_tag_def',
+                       [ 'ctd_name', 'ctd_count' ],
+                       [],
+                       __METHOD__,
+                       [ 'ORDER BY' => 'ctd_count DESC' ]
+               );
+
+               $out = [];
+               foreach ( $res as $row ) {
+                       $out[$row->ctd_name] = $row->ctd_count;
+               }
+
+               return $out;
+       }
+
        /**
         * Indicate whether change tag editing UI is relevant
         *