$this->tablesUsed[] = 'change_tag';
$this->tablesUsed[] = 'change_tag_def';
- $this->tablesUsed[] = 'tag_summary';
- $this->tablesUsed[] = 'valid_tag';
// Truncate these to avoid the supposed-to-be-unused IDs in tests here turning
// out to be used, leading ChangeTags::updateTags() to pick up bogus rc_id,
// HACK if we call $dbr->buildGroupConcatField() now, it will return the wrong table names
// We have to have the test runner call it instead
$baseConcats = [ ',', [ 'change_tag', 'change_tag_def' ], 'ctd_name' ];
- $joinConds = [ 'change_tag_def' => [ 'INNER JOIN', 'ct_tag_id=ctd_id' ] ];
+ $joinConds = [ 'change_tag_def' => [ 'JOIN', 'ct_tag_id=ctd_id' ] ];
$groupConcats = [
'recentchanges' => array_merge( $baseConcats, [ 'ct_rc_id=rc_id', $joinConds ] ),
'logging' => array_merge( $baseConcats, [ 'ct_log_id=log_id', $joinConds ] ),
'tables' => [ 'recentchanges', 'change_tag' ],
'fields' => [ 'rc_id', 'rc_timestamp', 'ts_tags' => $groupConcats['recentchanges'] ],
'conds' => [ "rc_timestamp > '20170714183203'", 'ct_tag_id' => [ 1 ] ],
- 'join_conds' => [ 'change_tag' => [ 'INNER JOIN', 'ct_rc_id=rc_id' ] ],
+ 'join_conds' => [ 'change_tag' => [ 'JOIN', 'ct_rc_id=rc_id' ] ],
'options' => [ 'ORDER BY' => 'rc_timestamp DESC' ],
]
],
'tables' => [ 'logging', 'change_tag' ],
'fields' => [ 'log_id', 'ts_tags' => $groupConcats['logging'] ],
'conds' => [ "log_timestamp > '20170714183203'", 'ct_tag_id' => [ 1 ] ],
- 'join_conds' => [ 'change_tag' => [ 'INNER JOIN', 'ct_log_id=log_id' ] ],
+ 'join_conds' => [ 'change_tag' => [ 'JOIN', 'ct_log_id=log_id' ] ],
'options' => [ 'ORDER BY log_timestamp DESC' ],
]
],
'tables' => [ 'revision', 'change_tag' ],
'fields' => [ 'rev_id', 'rev_timestamp', 'ts_tags' => $groupConcats['revision'] ],
'conds' => [ "rev_timestamp > '20170714183203'", 'ct_tag_id' => [ 1 ] ],
- 'join_conds' => [ 'change_tag' => [ 'INNER JOIN', 'ct_rev_id=rev_id' ] ],
+ 'join_conds' => [ 'change_tag' => [ 'JOIN', 'ct_rev_id=rev_id' ] ],
'options' => [ 'ORDER BY' => 'rev_timestamp DESC' ],
]
],
'tables' => [ 'archive', 'change_tag' ],
'fields' => [ 'ar_id', 'ar_timestamp', 'ts_tags' => $groupConcats['archive'] ],
'conds' => [ "ar_timestamp > '20170714183203'", 'ct_tag_id' => [ 1 ] ],
- 'join_conds' => [ 'change_tag' => [ 'INNER JOIN', 'ct_rev_id=ar_rev_id' ] ],
+ 'join_conds' => [ 'change_tag' => [ 'JOIN', 'ct_rev_id=ar_rev_id' ] ],
'options' => [ 'ORDER BY' => 'ar_timestamp DESC' ],
]
],
'tables' => [ 'recentchanges', 'change_tag' ],
'fields' => [ 'rc_id', 'rc_timestamp', 'ts_tags' => $groupConcats['recentchanges'] ],
'conds' => [ "rc_timestamp > '20170714183203'", 'ct_tag_id' => [ 1, 2 ] ],
- 'join_conds' => [ 'change_tag' => [ 'INNER JOIN', 'ct_rc_id=rc_id' ] ],
+ 'join_conds' => [ 'change_tag' => [ 'JOIN', 'ct_rc_id=rc_id' ] ],
'options' => [ 'ORDER BY' => 'rc_timestamp DESC', 'DISTINCT' ],
]
],
'tables' => [ 'recentchanges', 'change_tag' ],
'fields' => [ 'rc_id', 'rc_timestamp', 'ts_tags' => $groupConcats['recentchanges'] ],
'conds' => [ "rc_timestamp > '20170714183203'", 'ct_tag_id' => [ 1, 2 ] ],
- 'join_conds' => [ 'change_tag' => [ 'INNER JOIN', 'ct_rc_id=rc_id' ] ],
+ 'join_conds' => [ 'change_tag' => [ 'JOIN', 'ct_rc_id=rc_id' ] ],
'options' => [ 'DISTINCT', 'ORDER BY' => 'rc_timestamp DESC' ],
]
],
'tables' => [ 'recentchanges', 'change_tag' ],
'fields' => [ 'rc_id', 'ts_tags' => $groupConcats['recentchanges'] ],
'conds' => [ "rc_timestamp > '20170714183203'", 'ct_tag_id' => [ 1, 2 ] ],
- 'join_conds' => [ 'change_tag' => [ 'INNER JOIN', 'ct_rc_id=rc_id' ] ],
+ 'join_conds' => [ 'change_tag' => [ 'JOIN', 'ct_rc_id=rc_id' ] ],
'options' => [ 'ORDER BY rc_timestamp DESC', 'DISTINCT' ],
]
],
$dbw->delete( 'change_tag_def', '*' );
$rcId = 123;
- ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
+ $revId = 341;
+ ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId, $revId );
$dbr = wfGetDB( DB_REPLICA );
$expected2 = [
(object)[
'ct_tag_id' => 1,
- 'ct_rc_id' => 123
+ 'ct_rc_id' => 123,
+ 'ct_rev_id' => 341
],
(object)[
'ct_tag_id' => 2,
- 'ct_rc_id' => 123
+ 'ct_rc_id' => 123,
+ 'ct_rev_id' => 341
],
];
- $res2 = $dbr->select( 'change_tag', [ 'ct_tag_id', 'ct_rc_id' ], '' );
+ $res2 = $dbr->select( 'change_tag', [ 'ct_tag_id', 'ct_rc_id', 'ct_rev_id' ], '' );
$this->assertEquals( $expected2, iterator_to_array( $res2, false ) );
$rcId = 124;
- ChangeTags::updateTags( [ 'tag1' ], [], $rcId );
-
- ChangeTags::updateTags( [ 'tag3' ], [], $rcId );
+ $revId = 342;
+ ChangeTags::updateTags( [ 'tag1' ], [], $rcId, $revId );
+ ChangeTags::updateTags( [ 'tag3' ], [], $rcId, $revId );
$dbr = wfGetDB( DB_REPLICA );
$res = $dbr->select( 'change_tag_def', [ 'ctd_name', 'ctd_id', 'ctd_count' ], '' );
$this->assertEquals( $expected, iterator_to_array( $res, false ) );
+ $expected2 = [
+ (object)[
+ 'ct_tag_id' => 1,
+ 'ct_rc_id' => 123,
+ 'ct_rev_id' => 341
+ ],
+ (object)[
+ 'ct_tag_id' => 1,
+ 'ct_rc_id' => 124,
+ 'ct_rev_id' => 342
+ ],
+ (object)[
+ 'ct_tag_id' => 2,
+ 'ct_rc_id' => 123,
+ 'ct_rev_id' => 341
+ ],
+ (object)[
+ 'ct_tag_id' => 3,
+ 'ct_rc_id' => 124,
+ 'ct_rev_id' => 342
+ ],
+ ];
+ $res2 = $dbr->select( 'change_tag', [ 'ct_tag_id', 'ct_rc_id', 'ct_rev_id' ], '' );
+ $this->assertEquals( $expected2, iterator_to_array( $res2, false ) );
+ }
+
+ public function testUpdateTagsSkipDuplicates() {
+ // FIXME: fails under postgres
+ $this->markTestSkippedIfDbType( 'postgres' );
+
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->delete( 'change_tag', '*' );
+ $dbw->delete( 'change_tag_def', '*' );
+
+ $rcId = 123;
+ ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
+ ChangeTags::updateTags( [ 'tag2', 'tag3' ], [], $rcId );
+
+ $dbr = wfGetDB( DB_REPLICA );
+
+ $expected = [
+ (object)[
+ 'ctd_name' => 'tag1',
+ 'ctd_id' => 1,
+ 'ctd_count' => 1
+ ],
+ (object)[
+ 'ctd_name' => 'tag2',
+ 'ctd_id' => 2,
+ 'ctd_count' => 1
+ ],
+ (object)[
+ 'ctd_name' => 'tag3',
+ 'ctd_id' => 3,
+ 'ctd_count' => 1
+ ],
+ ];
+ $res = $dbr->select( 'change_tag_def', [ 'ctd_name', 'ctd_id', 'ctd_count' ], '' );
+ $this->assertEquals( $expected, iterator_to_array( $res, false ) );
+
$expected2 = [
(object)[
'ct_tag_id' => 1,
'ct_tag_id' => 2,
'ct_rc_id' => 123
],
+ (object)[
+ 'ct_tag_id' => 3,
+ 'ct_rc_id' => 123
+ ],
+ ];
+ $res2 = $dbr->select( 'change_tag', [ 'ct_tag_id', 'ct_rc_id' ], '' );
+ $this->assertEquals( $expected2, iterator_to_array( $res2, false ) );
+ }
+
+ public function testUpdateTagsDoNothingOnRepeatedCall() {
+ // FIXME: fails under postgres
+ $this->markTestSkippedIfDbType( 'postgres' );
+
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->delete( 'change_tag', '*' );
+ $dbw->delete( 'change_tag_def', '*' );
+
+ $rcId = 123;
+ ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
+ $res = ChangeTags::updateTags( [ 'tag2', 'tag1' ], [], $rcId );
+ $this->assertEquals( [ [], [], [ 'tag1', 'tag2' ] ], $res );
+
+ $dbr = wfGetDB( DB_REPLICA );
+
+ $expected = [
+ (object)[
+ 'ctd_name' => 'tag1',
+ 'ctd_id' => 1,
+ 'ctd_count' => 1
+ ],
+ (object)[
+ 'ctd_name' => 'tag2',
+ 'ctd_id' => 2,
+ 'ctd_count' => 1
+ ],
+ ];
+ $res = $dbr->select( 'change_tag_def', [ 'ctd_name', 'ctd_id', 'ctd_count' ], '' );
+ $this->assertEquals( $expected, iterator_to_array( $res, false ) );
+
+ $expected2 = [
(object)[
'ct_tag_id' => 1,
- 'ct_rc_id' => 124
+ 'ct_rc_id' => 123
],
(object)[
- 'ct_tag_id' => 3,
- 'ct_rc_id' => 124
+ 'ct_tag_id' => 2,
+ 'ct_rc_id' => 123
],
];
$res2 = $dbr->select( 'change_tag', [ 'ct_tag_id', 'ct_rc_id' ], '' );
$dbw = wfGetDB( DB_MASTER );
$dbw->delete( 'change_tag', '*' );
$dbw->delete( 'change_tag_def', '*' );
- $dbw->delete( 'valid_tag', '*' );
$rcId = 123;
ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
'ctd_user_defined' => 1
],
];
- $res = $dbr->select( 'change_tag_def', [ 'ctd_name', 'ctd_user_defined' ], '' );
+ $res = $dbr->select(
+ 'change_tag_def',
+ [ 'ctd_name', 'ctd_user_defined' ],
+ '',
+ __METHOD__,
+ [ 'ORDER BY' => 'ctd_name' ]
+ );
$this->assertEquals( $expected, iterator_to_array( $res, false ) );
-
- $this->assertEquals( [], $dbr->selectFieldValues( 'valid_tag', 'vt_tag', '' ) );
}
}