4 use Wikimedia\TestingAccessWrapper;
14 'revision_actor_temp',
38 $this->assertEquals( $expect,
$result );
43 'Simple table, old' => [
47 'rc_user' =>
'rc_user',
48 'rc_user_text' =>
'rc_user_text',
54 'Simple table, write-both' => [
56 'tables' => [
'actor_rc_user' =>
'actor' ],
58 'rc_user' =>
'COALESCE( actor_rc_user.actor_user, rc_user )',
59 'rc_user_text' =>
'COALESCE( actor_rc_user.actor_name, rc_user_text )',
60 'rc_actor' =>
'rc_actor',
63 'actor_rc_user' => [
'LEFT JOIN',
'actor_rc_user.actor_id = rc_actor' ],
67 'Simple table, write-new' => [
69 'tables' => [
'actor_rc_user' =>
'actor' ],
71 'rc_user' =>
'COALESCE( actor_rc_user.actor_user, rc_user )',
72 'rc_user_text' =>
'COALESCE( actor_rc_user.actor_name, rc_user_text )',
73 'rc_actor' =>
'rc_actor',
76 'actor_rc_user' => [
'LEFT JOIN',
'actor_rc_user.actor_id = rc_actor' ],
80 'Simple table, new' => [
82 'tables' => [
'actor_rc_user' =>
'actor' ],
84 'rc_user' =>
'actor_rc_user.actor_user',
85 'rc_user_text' =>
'actor_rc_user.actor_name',
86 'rc_actor' =>
'rc_actor',
89 'actor_rc_user' => [
'JOIN',
'actor_rc_user.actor_id = rc_actor' ],
99 'ipb_by_text' =>
'ipb_by_text',
100 'ipb_by_actor' =>
'NULL',
105 'ipblocks, write-both' => [
107 'tables' => [
'actor_ipb_by' =>
'actor' ],
109 'ipb_by' =>
'COALESCE( actor_ipb_by.actor_user, ipb_by )',
110 'ipb_by_text' =>
'COALESCE( actor_ipb_by.actor_name, ipb_by_text )',
111 'ipb_by_actor' =>
'ipb_by_actor',
114 'actor_ipb_by' => [
'LEFT JOIN',
'actor_ipb_by.actor_id = ipb_by_actor' ],
118 'ipblocks, write-new' => [
120 'tables' => [
'actor_ipb_by' =>
'actor' ],
122 'ipb_by' =>
'COALESCE( actor_ipb_by.actor_user, ipb_by )',
123 'ipb_by_text' =>
'COALESCE( actor_ipb_by.actor_name, ipb_by_text )',
124 'ipb_by_actor' =>
'ipb_by_actor',
127 'actor_ipb_by' => [
'LEFT JOIN',
'actor_ipb_by.actor_id = ipb_by_actor' ],
133 'tables' => [
'actor_ipb_by' =>
'actor' ],
135 'ipb_by' =>
'actor_ipb_by.actor_user',
136 'ipb_by_text' =>
'actor_ipb_by.actor_name',
137 'ipb_by_actor' =>
'ipb_by_actor',
140 'actor_ipb_by' => [
'JOIN',
'actor_ipb_by.actor_id = ipb_by_actor' ],
149 'rev_user' =>
'rev_user',
150 'rev_user_text' =>
'rev_user_text',
151 'rev_actor' =>
'NULL',
156 'Revision, write-both' => [
159 'temp_rev_user' =>
'revision_actor_temp',
160 'actor_rev_user' =>
'actor',
163 'rev_user' =>
'COALESCE( actor_rev_user.actor_user, rev_user )',
164 'rev_user_text' =>
'COALESCE( actor_rev_user.actor_name, rev_user_text )',
165 'rev_actor' =>
'temp_rev_user.revactor_actor',
168 'temp_rev_user' => [
'LEFT JOIN',
'temp_rev_user.revactor_rev = rev_id' ],
169 'actor_rev_user' => [
'LEFT JOIN',
'actor_rev_user.actor_id = temp_rev_user.revactor_actor' ],
173 'Revision, write-new' => [
176 'temp_rev_user' =>
'revision_actor_temp',
177 'actor_rev_user' =>
'actor',
180 'rev_user' =>
'COALESCE( actor_rev_user.actor_user, rev_user )',
181 'rev_user_text' =>
'COALESCE( actor_rev_user.actor_name, rev_user_text )',
182 'rev_actor' =>
'temp_rev_user.revactor_actor',
185 'temp_rev_user' => [
'LEFT JOIN',
'temp_rev_user.revactor_rev = rev_id' ],
186 'actor_rev_user' => [
'LEFT JOIN',
'actor_rev_user.actor_id = temp_rev_user.revactor_actor' ],
193 'temp_rev_user' =>
'revision_actor_temp',
194 'actor_rev_user' =>
'actor',
197 'rev_user' =>
'actor_rev_user.actor_user',
198 'rev_user_text' =>
'actor_rev_user.actor_name',
199 'rev_actor' =>
'temp_rev_user.revactor_actor',
202 'temp_rev_user' => [
'JOIN',
'temp_rev_user.revactor_rev = rev_id' ],
203 'actor_rev_user' => [
'JOIN',
'actor_rev_user.actor_id = temp_rev_user.revactor_actor' ],
219 $expect[
'conds'] =
'(' . implode(
') OR (', $expect[
'orconds'] ) .
')';
227 $this->assertEquals( $expect,
$result );
231 $makeUserIdentity =
function ( $id,
$name, $actor ) {
233 $u->method(
'getId' )->willReturn( $id );
234 $u->method(
'getName' )->willReturn(
$name );
235 $u->method(
'getActorId' )->willReturn( $actor );
239 $genericUser = [ $makeUserIdentity( 1,
'User1', 11 ) ];
240 $complicatedUsers = [
241 $makeUserIdentity( 1,
'User1', 11 ),
242 $makeUserIdentity( 2,
'User2', 12 ),
243 $makeUserIdentity( 3,
'User3', 0 ),
244 $makeUserIdentity( 0,
'192.168.12.34', 34 ),
245 $makeUserIdentity( 0,
'192.168.12.35', 0 ),
249 'Simple table, old' => [
252 'orconds' => [
'userid' =>
"rc_user = '1'" ],
256 'Simple table, write-both' => [
260 'actor' =>
"rc_actor = '11'",
261 'userid' =>
"rc_actor = '0' AND rc_user = '1'"
266 'Simple table, write-new' => [
270 'actor' =>
"rc_actor = '11'",
271 'userid' =>
"rc_actor = '0' AND rc_user = '1'"
276 'Simple table, new' => [
279 'orconds' => [
'actor' =>
"rc_actor = '11'" ],
287 'orconds' => [
'userid' =>
"ipb_by = '1'" ],
291 'ipblocks, write-both' => [
295 'actor' =>
"ipb_by_actor = '11'",
296 'userid' =>
"ipb_by_actor = '0' AND ipb_by = '1'"
301 'ipblocks, write-new' => [
305 'actor' =>
"ipb_by_actor = '11'",
306 'userid' =>
"ipb_by_actor = '0' AND ipb_by = '1'"
314 'orconds' => [
'actor' =>
"ipb_by_actor = '11'" ],
322 'orconds' => [
'userid' =>
"rev_user = '1'" ],
326 'Revision, write-both' => [
329 'temp_rev_user' =>
'revision_actor_temp',
333 "(temp_rev_user.revactor_actor IS NOT NULL) AND temp_rev_user.revactor_actor = '11'",
334 'userid' =>
"temp_rev_user.revactor_actor IS NULL AND rev_user = '1'"
337 'temp_rev_user' => [
'LEFT JOIN',
'temp_rev_user.revactor_rev = rev_id' ],
341 'Revision, write-new' => [
344 'temp_rev_user' =>
'revision_actor_temp',
348 "(temp_rev_user.revactor_actor IS NOT NULL) AND temp_rev_user.revactor_actor = '11'",
349 'userid' =>
"temp_rev_user.revactor_actor IS NULL AND rev_user = '1'"
352 'temp_rev_user' => [
'LEFT JOIN',
'temp_rev_user.revactor_rev = rev_id' ],
359 'temp_rev_user' =>
'revision_actor_temp',
361 'orconds' => [
'actor' =>
"temp_rev_user.revactor_actor = '11'" ],
363 'temp_rev_user' => [
'JOIN',
'temp_rev_user.revactor_rev = rev_id' ],
368 'Multiple users, old' => [
372 'userid' =>
"rc_user IN ('1','2','3') ",
373 'username' =>
"rc_user_text IN ('192.168.12.34','192.168.12.35') "
378 'Multiple users, write-both' => [
382 'actor' =>
"rc_actor IN ('11','12','34') ",
383 'userid' =>
"rc_actor = '0' AND rc_user IN ('1','2','3') ",
384 'username' =>
"rc_actor = '0' AND rc_user_text IN ('192.168.12.34','192.168.12.35') "
389 'Multiple users, write-new' => [
393 'actor' =>
"rc_actor IN ('11','12','34') ",
394 'userid' =>
"rc_actor = '0' AND rc_user IN ('1','2','3') ",
395 'username' =>
"rc_actor = '0' AND rc_user_text IN ('192.168.12.34','192.168.12.35') "
400 'Multiple users, new' => [
403 'orconds' => [
'actor' =>
"rc_actor IN ('11','12','34') " ],
408 'Multiple users, no use ID, old' => [
412 'username' =>
"rc_user_text IN ('User1','User2','User3','192.168.12.34','192.168.12.35') "
417 'Multiple users, write-both' => [
421 'actor' =>
"rc_actor IN ('11','12','34') ",
422 'username' =>
"rc_actor = '0' AND "
423 .
"rc_user_text IN ('User1','User2','User3','192.168.12.34','192.168.12.35') "
428 'Multiple users, write-new' => [
432 'actor' =>
"rc_actor IN ('11','12','34') ",
433 'username' =>
"rc_actor = '0' AND "
434 .
"rc_user_text IN ('User1','User2','User3','192.168.12.34','192.168.12.35') "
439 'Multiple users, new' => [
442 'orconds' => [
'actor' =>
"rc_actor IN ('11','12','34') " ],
459 $user->method(
'getId' )->willReturn( $u->getId() );
460 $user->method(
'getName' )->willReturn( $u->getName() );
461 if ( $u->getActorId( $this->db ) ) {
462 $user->method(
'getActorId' )->willReturn( $u->getActorId() );
466 [
'actor_user' => $u->getId(),
'actor_name' => $u->getName() ],
469 $user->method(
'getActorId' )->willReturn( $this->db->insertId() );
479 $nameKey = $key .
'_text';
480 $actorKey = $key ===
'ipb_by' ?
'ipb_by_actor' : substr( $key, 0, -5 ) .
'_actor';
482 foreach ( $stages
as $writeStage => $readRange ) {
483 if ( $key ===
'ipb_by' ) {
484 $extraFields[
'ipb_address'] = __CLASS__ .
"#$writeStage";
488 $usesTemp = $key ===
'rev_user';
491 list( $fields, $callback ) = $w->getInsertValuesWithTempTable( $this->db, $key,
$user );
493 $fields = $w->getInsertValues( $this->db, $key,
$user );
497 $this->assertSame(
$user->getId(), $fields[$key],
"old field, stage=$writeStage" );
498 $this->assertSame(
$user->getName(), $fields[$nameKey],
"old field, stage=$writeStage" );
500 $this->assertArrayNotHasKey( $key, $fields,
"old field, stage=$writeStage" );
501 $this->assertArrayNotHasKey( $nameKey, $fields,
"old field, stage=$writeStage" );
504 $this->assertSame(
$user->getActorId(), $fields[$actorKey],
"new field, stage=$writeStage" );
506 $this->assertArrayNotHasKey( $actorKey, $fields,
"new field, stage=$writeStage" );
509 $this->db->insert( $table, $extraFields + $fields, __METHOD__ );
510 $id = $this->db->insertId();
512 $callback( $id, $extraFields );
515 for ( $readStage = $readRange[0]; $readStage <= $readRange[1]; $readStage++ ) {
518 $queryInfo = $r->getJoin( $key );
519 $row = $this->db->selectRow(
520 [ $table ] + $queryInfo[
'tables'],
521 $queryInfo[
'fields'],
528 $this->assertSame(
$user->getId(), (int)$row->$key,
"w=$writeStage, r=$readStage, id" );
529 $this->assertSame(
$user->getName(), $row->$nameKey,
"w=$writeStage, r=$readStage, name" );
532 (int)$row->$actorKey,
533 "w=$writeStage, r=$readStage, actor"
548 'recentchanges' => [
'recentchanges',
'rc_user',
'rc_id', [
549 'rc_timestamp' =>
$db->timestamp(),
551 'rc_title' =>
'Test',
552 'rc_this_oldid' => 42,
553 'rc_last_oldid' => 41,
554 'rc_source' =>
'test',
556 'ipblocks' => [
'ipblocks',
'ipb_by',
'ipb_id', [
557 'ipb_range_start' =>
'',
558 'ipb_range_end' =>
'',
559 'ipb_timestamp' =>
$db->timestamp(),
560 'ipb_expiry' =>
$db->getInfinity(),
562 'revision' => [
'revision',
'rev_user',
'rev_id', [
566 'rev_timestamp' =>
$db->timestamp(),
588 $m->getInsertValues( $this->db,
'rev_user', $this->
getTestUser()->getUser() );
599 $m->getInsertValuesWithTempTable( $this->db,
'rc_user', $this->
getTestUser()->getUser() );
608 $wrap->formerTempTables += [
'rc_user' =>
'1.30' ];
610 $this->
hideDeprecated(
'ActorMigration::getInsertValuesWithTempTable for rc_user' );
612 list( $fields, $callback )
613 = $m->getInsertValuesWithTempTable( $this->db,
'rc_user', $this->
getTestUser()->getUser() );
614 $this->assertTrue( is_callable( $callback ) );
625 list( $fields, $callback )
626 = $m->getInsertValuesWithTempTable( $this->db,
'rev_user', $this->
getTestUser()->getUser() );
633 $userIdentity->method(
'getId' )->willReturn(
$user->getId() );
634 $userIdentity->method(
'getName' )->willReturn(
$user->getName() );
635 $userIdentity->method(
'getActorId' )->willReturn( 0 );
638 ->insertWithTempTable( $this->db,
'' );
640 list( $fields, $callback ) =
641 $m->getInsertValuesWithTempTable( $this->db,
'rev_user', $userIdentity );
646 'rev_timestamp' => $this->db->timestamp(),
648 $this->db->insert(
'revision', $extraFields + $fields, __METHOD__ );
649 $id = $this->db->insertId();
650 $callback( $id, $extraFields );
654 $row = $this->db->selectRow(
655 $qi[
'tables'], $qi[
'fields'], [
'rev_id' => $id ], __METHOD__, [], $qi[
'joins']
657 $this->assertSame(
$user->getId(), (int)$row->rev_user );
658 $this->assertSame(
$user->getName(), $row->rev_user_text );
659 $this->assertSame(
$user->getActorId(), (int)$row->rev_actor );
662 $fields = $m->getInsertValues( $this->db,
'dummy_user', $userIdentity );
663 $this->assertSame(
$user->getId(), $fields[
'dummy_user'] );
664 $this->assertSame(
$user->getName(), $fields[
'dummy_user_text'] );
665 $this->assertSame(
$user->getActorId(), $fields[
'dummy_actor'] );
682 $this->assertSame( $isAnon, $m->isAnon(
'foo' ) );
683 $this->assertSame( $isNotAnon, $m->isNotAnon(
'foo' ) );
691 'MIGRATION_NEW' => [
MIGRATION_NEW,
'foo IS NULL',
'foo IS NOT NULL' ],