Make ChangeTag use NameTableStore for change_tag_def table
authorAmir Sarabadani <ladsgroup@gmail.com>
Thu, 14 Jun 2018 16:37:19 +0000 (18:37 +0200)
committerAmir Sarabadani <ladsgroup@gmail.com>
Sun, 17 Jun 2018 20:32:30 +0000 (22:32 +0200)
Also adding a regression test to fix upsert AUTO_INCREMENT issue

Bug: T193868
Change-Id: I0363c93a824c41d12b33aedb05e92e1d9943c40d

includes/changetags/ChangeTags.php
tests/phpunit/includes/changetags/ChangeTagsTest.php

index d019f41..bd9cedc 100644 (file)
@@ -21,7 +21,9 @@
  * @ingroup Change tagging
  */
 
+use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\NameTableStore;
 use Wikimedia\Rdbms\Database;
 
 class ChangeTags {
@@ -346,31 +348,32 @@ class ChangeTags {
                if ( count( $tagsToAdd ) ) {
                        $changeTagMapping = [];
                        if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_OLD ) {
-                               $tagDefRows = [];
+                               $changeTagDefStore = new NameTableStore(
+                                       MediaWikiServices::getInstance()->getDBLoadBalancer(),
+                                       MediaWikiServices::getInstance()->getMainWANObjectCache(),
+                                       LoggerFactory::getInstance( 'NameTableSqlStore' ),
+                                       'change_tag_def',
+                                       'ctd_id',
+                                       'ctd_name',
+                                       null,
+                                       false,
+                                       function ( $insertFields ) {
+                                               $insertFields['ctd_user_defined'] = 0;
+                                               $insertFields['ctd_count'] = 0;
+                                               return $insertFields;
+                                       }
+                               );
+
                                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 = [];
index 215cdfd..216228a 100644 (file)
@@ -421,7 +421,9 @@ class ChangeTagsTest extends MediaWikiTestCase {
                $this->assertEquals( $expected2, iterator_to_array( $res2, false ) );
 
                $rcId = 124;
-               ChangeTags::updateTags( [ 'tag1', 'tag3' ], [], $rcId );
+               ChangeTags::updateTags( [ 'tag1' ], [], $rcId );
+
+               ChangeTags::updateTags( [ 'tag3' ], [], $rcId );
 
                $dbr = wfGetDB( DB_REPLICA );