Merge "Force usage of MCR aware database schema"
This commit is contained in:
commit
3dbc58222c
13 changed files with 5 additions and 959 deletions
|
|
@ -182,9 +182,9 @@ class RevisionStore
|
|||
'Reading needs to be enabled for the old or the new schema.'
|
||||
);
|
||||
Assert::parameter(
|
||||
( $mcrMigrationStage & SCHEMA_COMPAT_WRITE_BOTH ) !== 0,
|
||||
( $mcrMigrationStage & SCHEMA_COMPAT_WRITE_NEW ) !== 0,
|
||||
'$mcrMigrationStage',
|
||||
'Writing needs to be enabled for the old or the new schema.'
|
||||
'Writing needs to be enabled for the new schema.'
|
||||
);
|
||||
Assert::parameter(
|
||||
( $mcrMigrationStage & SCHEMA_COMPAT_READ_OLD ) === 0
|
||||
|
|
@ -192,12 +192,6 @@ class RevisionStore
|
|||
'$mcrMigrationStage',
|
||||
'Cannot read the old schema when not also writing it.'
|
||||
);
|
||||
Assert::parameter(
|
||||
( $mcrMigrationStage & SCHEMA_COMPAT_READ_NEW ) === 0
|
||||
|| ( $mcrMigrationStage & SCHEMA_COMPAT_WRITE_NEW ) !== 0,
|
||||
'$mcrMigrationStage',
|
||||
'Cannot read the new schema when not also writing it.'
|
||||
);
|
||||
|
||||
$this->loadBalancer = $loadBalancer;
|
||||
$this->blobStore = $blobStore;
|
||||
|
|
|
|||
|
|
@ -178,7 +178,6 @@ $wgAutoloadClasses += [
|
|||
'MediaWiki\Tests\Revision\RevisionSlotsTest' => "$testDir/phpunit/includes/Revision/RevisionSlotsTest.php",
|
||||
'MediaWiki\Tests\Revision\RevisionRecordTests' => "$testDir/phpunit/includes/Revision/RevisionRecordTests.php",
|
||||
'MediaWiki\Tests\Revision\RevisionStoreDbTestBase' => "$testDir/phpunit/includes/Revision/RevisionStoreDbTestBase.php",
|
||||
'MediaWiki\Tests\Revision\PreMcrSchemaOverride' => "$testDir/phpunit/includes/Revision/PreMcrSchemaOverride.php",
|
||||
'MediaWiki\Tests\Revision\RevisionStoreRecordTest' => "$testDir/phpunit/includes/Revision/RevisionStoreRecordTest.php",
|
||||
|
||||
# tests/phpunit/languages
|
||||
|
|
|
|||
|
|
@ -1,202 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace MediaWiki\Tests\Revision;
|
||||
|
||||
use Revision;
|
||||
|
||||
/**
|
||||
* Tests RevisionStore against the pre-MCR, pre-ContentHandler DB schema.
|
||||
*
|
||||
* @covers \MediaWiki\Revision\RevisionStore
|
||||
*
|
||||
* @group RevisionStore
|
||||
* @group Storage
|
||||
* @group Database
|
||||
* @group medium
|
||||
*/
|
||||
class NoContentModelRevisionStoreDbTest extends RevisionStoreDbTestBase {
|
||||
|
||||
use PreMcrSchemaOverride;
|
||||
|
||||
protected function getContentHandlerUseDB() {
|
||||
return false;
|
||||
}
|
||||
|
||||
protected function revisionToRow( Revision $rev, $options = [ 'page', 'user', 'comment' ] ) {
|
||||
$row = parent::revisionToRow( $rev, $options );
|
||||
|
||||
$row->rev_text_id = (string)$rev->getTextId();
|
||||
|
||||
return $row;
|
||||
}
|
||||
|
||||
public function provideGetArchiveQueryInfo() {
|
||||
yield [
|
||||
[
|
||||
'tables' => [ 'archive' ],
|
||||
'fields' => array_merge(
|
||||
$this->getDefaultArchiveFields(),
|
||||
[
|
||||
'ar_comment_text' => 'ar_comment',
|
||||
'ar_comment_data' => 'NULL',
|
||||
'ar_comment_cid' => 'NULL',
|
||||
'ar_user_text' => 'ar_user_text',
|
||||
'ar_user' => 'ar_user',
|
||||
'ar_actor' => 'NULL',
|
||||
]
|
||||
),
|
||||
'joins' => [],
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
public function provideGetQueryInfo() {
|
||||
yield [
|
||||
[],
|
||||
[
|
||||
'tables' => [ 'revision' ],
|
||||
'fields' => array_merge(
|
||||
$this->getDefaultQueryFields(),
|
||||
$this->getCommentQueryFields(),
|
||||
$this->getActorQueryFields()
|
||||
),
|
||||
'joins' => [],
|
||||
]
|
||||
];
|
||||
yield [
|
||||
[ 'page' ],
|
||||
[
|
||||
'tables' => [ 'revision', 'page' ],
|
||||
'fields' => array_merge(
|
||||
$this->getDefaultQueryFields(),
|
||||
$this->getCommentQueryFields(),
|
||||
$this->getActorQueryFields(),
|
||||
[
|
||||
'page_namespace',
|
||||
'page_title',
|
||||
'page_id',
|
||||
'page_latest',
|
||||
'page_is_redirect',
|
||||
'page_len',
|
||||
]
|
||||
),
|
||||
'joins' => [
|
||||
'page' => [ 'JOIN', [ 'page_id = rev_page' ] ],
|
||||
],
|
||||
]
|
||||
];
|
||||
yield [
|
||||
[ 'user' ],
|
||||
[
|
||||
'tables' => [ 'revision', 'user' ],
|
||||
'fields' => array_merge(
|
||||
$this->getDefaultQueryFields(),
|
||||
$this->getCommentQueryFields(),
|
||||
$this->getActorQueryFields(),
|
||||
[
|
||||
'user_name',
|
||||
]
|
||||
),
|
||||
'joins' => [
|
||||
'user' => [ 'LEFT JOIN', [ 'rev_user != 0', 'user_id = rev_user' ] ],
|
||||
],
|
||||
]
|
||||
];
|
||||
yield [
|
||||
[ 'text' ],
|
||||
[
|
||||
'tables' => [ 'revision', 'text' ],
|
||||
'fields' => array_merge(
|
||||
$this->getDefaultQueryFields(),
|
||||
$this->getCommentQueryFields(),
|
||||
$this->getActorQueryFields(),
|
||||
[
|
||||
'old_text',
|
||||
'old_flags',
|
||||
]
|
||||
),
|
||||
'joins' => [
|
||||
'text' => [ 'JOIN', [ 'rev_text_id=old_id' ] ],
|
||||
],
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
public function provideGetSlotsQueryInfo() {
|
||||
$db = wfGetDB( DB_REPLICA );
|
||||
|
||||
yield [
|
||||
[],
|
||||
[
|
||||
'tables' => [
|
||||
'slots' => 'revision',
|
||||
],
|
||||
'fields' => array_merge(
|
||||
[
|
||||
'slot_revision_id' => 'slots.rev_id',
|
||||
'slot_content_id' => 'NULL',
|
||||
'slot_origin' => 'slots.rev_id',
|
||||
'role_name' => $db->addQuotes( SlotRecord::MAIN ),
|
||||
]
|
||||
),
|
||||
'joins' => [],
|
||||
]
|
||||
];
|
||||
yield [
|
||||
[ 'content' ],
|
||||
[
|
||||
'tables' => [
|
||||
'slots' => 'revision',
|
||||
],
|
||||
'fields' => array_merge(
|
||||
[
|
||||
'slot_revision_id' => 'slots.rev_id',
|
||||
'slot_content_id' => 'NULL',
|
||||
'slot_origin' => 'slots.rev_id',
|
||||
'role_name' => $db->addQuotes( SlotRecord::MAIN ),
|
||||
'content_size' => 'slots.rev_len',
|
||||
'content_sha1' => 'slots.rev_sha1',
|
||||
'content_address' =>
|
||||
$db->buildConcat( [ $db->addQuotes( 'tt:' ), 'slots.rev_text_id' ] ),
|
||||
'model_name' => 'NULL',
|
||||
]
|
||||
),
|
||||
'joins' => [],
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
public function provideNewMutableRevisionFromArray() {
|
||||
foreach ( parent::provideNewMutableRevisionFromArray() as $case ) {
|
||||
yield $case;
|
||||
}
|
||||
|
||||
yield 'Basic array, with page & id' => [
|
||||
[
|
||||
'id' => 2,
|
||||
'page' => 1,
|
||||
'text_id' => 2,
|
||||
'timestamp' => '20171017114835',
|
||||
'user_text' => '111.0.1.2',
|
||||
'user' => 0,
|
||||
'minor_edit' => false,
|
||||
'deleted' => 0,
|
||||
'len' => 46,
|
||||
'parent_id' => 1,
|
||||
'sha1' => 'rdqbbzs3pkhihgbs8qf2q9jsvheag5z',
|
||||
'comment' => 'Goat Comment!',
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Conditions to use together with getSlotsQueryInfo() when selecting slot rows for a given
|
||||
* revision.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getSlotRevisionConditions( $revId ) {
|
||||
return [ 'rev_id' => $revId ];
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,102 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace MediaWiki\Tests\Revision;
|
||||
|
||||
use InvalidArgumentException;
|
||||
use MediaWiki\Revision\RevisionRecord;
|
||||
use Revision;
|
||||
use WikitextContent;
|
||||
|
||||
/**
|
||||
* Tests RevisionStore against the pre-MCR DB schema.
|
||||
*
|
||||
* @covers \MediaWiki\Revision\RevisionStore
|
||||
*
|
||||
* @group RevisionStore
|
||||
* @group Storage
|
||||
* @group Database
|
||||
* @group medium
|
||||
*/
|
||||
class PreMcrRevisionStoreDbTest extends RevisionStoreDbTestBase {
|
||||
|
||||
use PreMcrSchemaOverride;
|
||||
|
||||
protected function revisionToRow( Revision $rev, $options = [ 'page', 'user', 'comment' ] ) {
|
||||
$row = parent::revisionToRow( $rev, $options );
|
||||
|
||||
$row->rev_text_id = (string)$rev->getTextId();
|
||||
$row->rev_content_format = (string)$rev->getContentFormat();
|
||||
$row->rev_content_model = (string)$rev->getContentModel();
|
||||
|
||||
return $row;
|
||||
}
|
||||
|
||||
protected function assertRevisionExistsInDatabase( RevisionRecord $rev ) {
|
||||
// Legacy schema is still being written
|
||||
$this->assertSelect(
|
||||
[ 'revision', 'text' ],
|
||||
[ 'count(*)' ],
|
||||
[ 'rev_id' => $rev->getId(), 'rev_text_id > 0' ],
|
||||
[ [ 1 ] ],
|
||||
[],
|
||||
[ 'text' => [ 'JOIN', [ 'rev_text_id = old_id' ] ] ]
|
||||
);
|
||||
|
||||
parent::assertRevisionExistsInDatabase( $rev );
|
||||
}
|
||||
|
||||
public function provideInsertRevisionOn_failures() {
|
||||
foreach ( parent::provideInsertRevisionOn_failures() as $case ) {
|
||||
yield $case;
|
||||
}
|
||||
|
||||
yield 'slot that is not main slot' => [
|
||||
[
|
||||
'content' => [
|
||||
'main' => new WikitextContent( 'Chicken' ),
|
||||
'lalala' => new WikitextContent( 'Duck' ),
|
||||
],
|
||||
'comment' => $this->getRandomCommentStoreComment(),
|
||||
'timestamp' => '20171117010101',
|
||||
'user' => true,
|
||||
],
|
||||
new InvalidArgumentException( 'Only the main slot is supported' )
|
||||
];
|
||||
}
|
||||
|
||||
public function provideNewMutableRevisionFromArray() {
|
||||
foreach ( parent::provideNewMutableRevisionFromArray() as $case ) {
|
||||
yield $case;
|
||||
}
|
||||
|
||||
yield 'Basic array, with page & id' => [
|
||||
[
|
||||
'id' => 2,
|
||||
'page' => 1,
|
||||
'text_id' => 2,
|
||||
'timestamp' => '20171017114835',
|
||||
'user_text' => '111.0.1.2',
|
||||
'user' => 0,
|
||||
'minor_edit' => false,
|
||||
'deleted' => 0,
|
||||
'len' => 46,
|
||||
'parent_id' => 1,
|
||||
'sha1' => 'rdqbbzs3pkhihgbs8qf2q9jsvheag5z',
|
||||
'comment' => 'Goat Comment!',
|
||||
'content_format' => 'text/x-wiki',
|
||||
'content_model' => 'wikitext',
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Conditions to use together with getSlotsQueryInfo() when selecting slot rows for a given
|
||||
* revision.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getSlotRevisionConditions( $revId ) {
|
||||
return [ 'rev_id' => $revId ];
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace MediaWiki\Tests\Revision;
|
||||
|
||||
use Wikimedia\Rdbms\IMaintainableDatabase;
|
||||
use MediaWiki\DB\PatchFileLocation;
|
||||
|
||||
/**
|
||||
* Trait providing schema overrides that allow tests to run against the pre-MCR database schema.
|
||||
*/
|
||||
trait PreMcrSchemaOverride {
|
||||
|
||||
use PatchFileLocation;
|
||||
use McrSchemaDetection;
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
protected function getMcrMigrationStage() {
|
||||
return MIGRATION_OLD;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
protected function getMcrTablesToReset() {
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array[]
|
||||
*/
|
||||
protected function getSchemaOverrides( IMaintainableDatabase $db ) {
|
||||
$overrides = [
|
||||
'scripts' => [],
|
||||
'drop' => [],
|
||||
'create' => [],
|
||||
'alter' => [],
|
||||
];
|
||||
|
||||
if ( $this->hasMcrTables( $db ) ) {
|
||||
$overrides['drop'] = [ 'slots', 'content', 'slot_roles', 'content_models', ];
|
||||
$overrides['scripts'][] = $this->getSqlPatchPath( $db, '/drop-mcr-tables', __DIR__ );
|
||||
}
|
||||
|
||||
if ( !$this->hasPreMcrFields( $db ) ) {
|
||||
$overrides['alter'][] = 'revision';
|
||||
$overrides['scripts'][] = $this->getSqlPatchPath( $db, '/create-pre-mcr-fields', __DIR__ );
|
||||
}
|
||||
|
||||
return $overrides;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -172,29 +172,6 @@ class RevisionQueryInfoTest extends MediaWikiTestCase {
|
|||
],
|
||||
]
|
||||
];
|
||||
yield 'pre-MCR, no model' => [
|
||||
[
|
||||
'wgContentHandlerUseDB' => false,
|
||||
'wgMultiContentRevisionSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
|
||||
],
|
||||
[
|
||||
'tables' => [
|
||||
'archive',
|
||||
'actor_ar_user' => 'actor',
|
||||
'comment_ar_comment' => 'comment',
|
||||
],
|
||||
'fields' => array_merge(
|
||||
$this->getArchiveQueryFields( true ),
|
||||
$this->getNewActorQueryFields( 'ar' ),
|
||||
$this->getNewCommentQueryFields( 'ar' )
|
||||
),
|
||||
'joins' => [
|
||||
'comment_ar_comment'
|
||||
=> [ 'JOIN', 'comment_ar_comment.comment_id = ar_comment_id' ],
|
||||
'actor_ar_user' => [ 'JOIN', 'actor_ar_user.actor_id = ar_actor' ],
|
||||
],
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
public function provideQueryInfo() {
|
||||
|
|
@ -397,238 +374,6 @@ class RevisionQueryInfoTest extends MediaWikiTestCase {
|
|||
],
|
||||
]
|
||||
];
|
||||
yield 'pre-MCR' => [
|
||||
[
|
||||
'wgContentHandlerUseDB' => true,
|
||||
'wgMultiContentRevisionSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
|
||||
],
|
||||
[],
|
||||
[
|
||||
'tables' => [
|
||||
'revision',
|
||||
'temp_rev_comment' => 'revision_comment_temp',
|
||||
'comment_rev_comment' => 'comment',
|
||||
'temp_rev_user' => 'revision_actor_temp',
|
||||
'actor_rev_user' => 'actor',
|
||||
],
|
||||
'fields' => array_merge(
|
||||
$this->getRevisionQueryFields( true ),
|
||||
$this->getContentHandlerQueryFields( 'rev' ),
|
||||
$this->getNewActorQueryFields( 'rev', true ),
|
||||
$this->getNewCommentQueryFields( 'rev' )
|
||||
),
|
||||
'joins' => [
|
||||
'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
|
||||
'comment_rev_comment'
|
||||
=> [ 'JOIN', 'comment_rev_comment.comment_id = temp_rev_comment.revcomment_comment_id' ],
|
||||
'temp_rev_user' => [ 'JOIN', 'temp_rev_user.revactor_rev = rev_id' ],
|
||||
'actor_rev_user' => [ 'JOIN', 'actor_rev_user.actor_id = temp_rev_user.revactor_actor' ],
|
||||
],
|
||||
]
|
||||
];
|
||||
yield 'pre-MCR, page, user' => [
|
||||
[
|
||||
'wgContentHandlerUseDB' => true,
|
||||
'wgMultiContentRevisionSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
|
||||
],
|
||||
[ 'page', 'user' ],
|
||||
[
|
||||
'tables' => [
|
||||
'revision', 'page', 'user',
|
||||
'temp_rev_comment' => 'revision_comment_temp',
|
||||
'comment_rev_comment' => 'comment',
|
||||
'temp_rev_user' => 'revision_actor_temp',
|
||||
'actor_rev_user' => 'actor',
|
||||
],
|
||||
'fields' => array_merge(
|
||||
$this->getRevisionQueryFields( true ),
|
||||
$this->getContentHandlerQueryFields( 'rev' ),
|
||||
$this->getPageQueryFields(),
|
||||
$this->getUserQueryFields(),
|
||||
$this->getNewActorQueryFields( 'rev', true ),
|
||||
$this->getNewCommentQueryFields( 'rev' )
|
||||
),
|
||||
'joins' => [
|
||||
'page' => [ 'JOIN', [ 'page_id = rev_page' ] ],
|
||||
'user' => [ 'LEFT JOIN', [
|
||||
'actor_rev_user.actor_user != 0',
|
||||
'user_id = actor_rev_user.actor_user',
|
||||
] ],
|
||||
'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
|
||||
'comment_rev_comment'
|
||||
=> [ 'JOIN', 'comment_rev_comment.comment_id = temp_rev_comment.revcomment_comment_id' ],
|
||||
'temp_rev_user' => [ 'JOIN', 'temp_rev_user.revactor_rev = rev_id' ],
|
||||
'actor_rev_user' => [ 'JOIN', 'actor_rev_user.actor_id = temp_rev_user.revactor_actor' ],
|
||||
],
|
||||
]
|
||||
];
|
||||
yield 'pre-MCR, no model' => [
|
||||
[
|
||||
'wgContentHandlerUseDB' => false,
|
||||
'wgMultiContentRevisionSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
|
||||
],
|
||||
[],
|
||||
[
|
||||
'tables' => [
|
||||
'revision',
|
||||
'temp_rev_comment' => 'revision_comment_temp',
|
||||
'comment_rev_comment' => 'comment',
|
||||
'temp_rev_user' => 'revision_actor_temp',
|
||||
'actor_rev_user' => 'actor',
|
||||
],
|
||||
'fields' => array_merge(
|
||||
$this->getRevisionQueryFields( true ),
|
||||
$this->getNewActorQueryFields( 'rev', true ),
|
||||
$this->getNewCommentQueryFields( 'rev' )
|
||||
),
|
||||
'joins' => [
|
||||
'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
|
||||
'comment_rev_comment'
|
||||
=> [ 'JOIN', 'comment_rev_comment.comment_id = temp_rev_comment.revcomment_comment_id' ],
|
||||
'temp_rev_user' => [ 'JOIN', 'temp_rev_user.revactor_rev = rev_id' ],
|
||||
'actor_rev_user' => [ 'JOIN', 'actor_rev_user.actor_id = temp_rev_user.revactor_actor' ],
|
||||
],
|
||||
],
|
||||
];
|
||||
yield 'pre-MCR, no model, page' => [
|
||||
[
|
||||
'wgContentHandlerUseDB' => false,
|
||||
'wgMultiContentRevisionSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
|
||||
],
|
||||
[ 'page' ],
|
||||
[
|
||||
'tables' => [
|
||||
'revision', 'page',
|
||||
'temp_rev_comment' => 'revision_comment_temp',
|
||||
'comment_rev_comment' => 'comment',
|
||||
'temp_rev_user' => 'revision_actor_temp',
|
||||
'actor_rev_user' => 'actor',
|
||||
],
|
||||
'fields' => array_merge(
|
||||
$this->getRevisionQueryFields( true ),
|
||||
$this->getPageQueryFields(),
|
||||
$this->getNewActorQueryFields( 'rev', true ),
|
||||
$this->getNewCommentQueryFields( 'rev' )
|
||||
),
|
||||
'joins' => [
|
||||
'page' => [ 'JOIN', [ 'page_id = rev_page' ], ],
|
||||
'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
|
||||
'comment_rev_comment'
|
||||
=> [ 'JOIN', 'comment_rev_comment.comment_id = temp_rev_comment.revcomment_comment_id' ],
|
||||
'temp_rev_user' => [ 'JOIN', 'temp_rev_user.revactor_rev = rev_id' ],
|
||||
'actor_rev_user' => [ 'JOIN', 'actor_rev_user.actor_id = temp_rev_user.revactor_actor' ],
|
||||
],
|
||||
],
|
||||
];
|
||||
yield 'pre-MCR, no model, user' => [
|
||||
[
|
||||
'wgContentHandlerUseDB' => false,
|
||||
'wgMultiContentRevisionSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
|
||||
],
|
||||
[ 'user' ],
|
||||
[
|
||||
'tables' => [
|
||||
'revision', 'user',
|
||||
'temp_rev_comment' => 'revision_comment_temp',
|
||||
'comment_rev_comment' => 'comment',
|
||||
'temp_rev_user' => 'revision_actor_temp',
|
||||
'actor_rev_user' => 'actor',
|
||||
],
|
||||
'fields' => array_merge(
|
||||
$this->getRevisionQueryFields( true ),
|
||||
$this->getUserQueryFields(),
|
||||
$this->getNewActorQueryFields( 'rev', true ),
|
||||
$this->getNewCommentQueryFields( 'rev' )
|
||||
),
|
||||
'joins' => [
|
||||
'user' => [ 'LEFT JOIN', [
|
||||
'actor_rev_user.actor_user != 0',
|
||||
'user_id = actor_rev_user.actor_user',
|
||||
] ],
|
||||
'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
|
||||
'comment_rev_comment'
|
||||
=> [ 'JOIN', 'comment_rev_comment.comment_id = temp_rev_comment.revcomment_comment_id' ],
|
||||
'temp_rev_user' => [ 'JOIN', 'temp_rev_user.revactor_rev = rev_id' ],
|
||||
'actor_rev_user' => [ 'JOIN', 'actor_rev_user.actor_id = temp_rev_user.revactor_actor' ],
|
||||
],
|
||||
],
|
||||
];
|
||||
yield 'pre-MCR, no model, text' => [
|
||||
[
|
||||
'wgContentHandlerUseDB' => false,
|
||||
'wgMultiContentRevisionSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
|
||||
],
|
||||
[ 'text' ],
|
||||
[
|
||||
'tables' => [
|
||||
'revision', 'text',
|
||||
'temp_rev_comment' => 'revision_comment_temp',
|
||||
'comment_rev_comment' => 'comment',
|
||||
'temp_rev_user' => 'revision_actor_temp',
|
||||
'actor_rev_user' => 'actor',
|
||||
],
|
||||
'fields' => array_merge(
|
||||
$this->getRevisionQueryFields( true ),
|
||||
$this->getTextQueryFields(),
|
||||
$this->getNewActorQueryFields( 'rev', true ),
|
||||
$this->getNewCommentQueryFields( 'rev' )
|
||||
),
|
||||
'joins' => [
|
||||
'text' => [ 'JOIN', [ 'rev_text_id=old_id' ] ],
|
||||
'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
|
||||
'comment_rev_comment'
|
||||
=> [ 'JOIN', 'comment_rev_comment.comment_id = temp_rev_comment.revcomment_comment_id' ],
|
||||
'temp_rev_user' => [ 'JOIN', 'temp_rev_user.revactor_rev = rev_id' ],
|
||||
'actor_rev_user' => [ 'JOIN', 'actor_rev_user.actor_id = temp_rev_user.revactor_actor' ],
|
||||
],
|
||||
],
|
||||
];
|
||||
yield 'pre-MCR, no model, text, page, user' => [
|
||||
[
|
||||
'wgContentHandlerUseDB' => false,
|
||||
'wgMultiContentRevisionSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
|
||||
],
|
||||
[ 'text', 'page', 'user' ],
|
||||
[
|
||||
'tables' => [
|
||||
'revision', 'page', 'user', 'text',
|
||||
'temp_rev_comment' => 'revision_comment_temp',
|
||||
'comment_rev_comment' => 'comment',
|
||||
'temp_rev_user' => 'revision_actor_temp',
|
||||
'actor_rev_user' => 'actor',
|
||||
],
|
||||
'fields' => array_merge(
|
||||
$this->getRevisionQueryFields( true ),
|
||||
$this->getPageQueryFields(),
|
||||
$this->getUserQueryFields(),
|
||||
$this->getTextQueryFields(),
|
||||
$this->getNewActorQueryFields( 'rev', true ),
|
||||
$this->getNewCommentQueryFields( 'rev' )
|
||||
),
|
||||
'joins' => [
|
||||
'page' => [
|
||||
'JOIN',
|
||||
[ 'page_id = rev_page' ],
|
||||
],
|
||||
'user' => [
|
||||
'LEFT JOIN',
|
||||
[
|
||||
'actor_rev_user.actor_user != 0',
|
||||
'user_id = actor_rev_user.actor_user',
|
||||
],
|
||||
],
|
||||
'text' => [
|
||||
'JOIN',
|
||||
[ 'rev_text_id=old_id' ],
|
||||
],
|
||||
'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
|
||||
'comment_rev_comment'
|
||||
=> [ 'JOIN', 'comment_rev_comment.comment_id = temp_rev_comment.revcomment_comment_id' ],
|
||||
'temp_rev_user' => [ 'JOIN', 'temp_rev_user.revactor_rev = rev_id' ],
|
||||
'actor_rev_user' => [ 'JOIN', 'actor_rev_user.actor_id = temp_rev_user.revactor_actor' ],
|
||||
],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
public function provideSlotsQueryInfo() {
|
||||
|
|
@ -805,54 +550,6 @@ class RevisionQueryInfoTest extends MediaWikiTestCase {
|
|||
'joins' => [],
|
||||
]
|
||||
];
|
||||
yield 'pre-MCR' => [
|
||||
[
|
||||
'wgMultiContentRevisionSchemaMigrationStage'
|
||||
=> SCHEMA_COMPAT_OLD,
|
||||
],
|
||||
[],
|
||||
[
|
||||
'tables' => [
|
||||
'revision',
|
||||
],
|
||||
'fields' => array_merge(
|
||||
[
|
||||
'slot_revision_id' => 'rev_id',
|
||||
'slot_content_id' => 'NULL',
|
||||
'slot_origin' => 'rev_id',
|
||||
'role_name' => $db->addQuotes( SlotRecord::MAIN ),
|
||||
]
|
||||
),
|
||||
'joins' => [],
|
||||
]
|
||||
];
|
||||
yield 'pre-MCR, content' => [
|
||||
[
|
||||
'wgMultiContentRevisionSchemaMigrationStage'
|
||||
=> SCHEMA_COMPAT_OLD,
|
||||
],
|
||||
[ 'content' ],
|
||||
[
|
||||
'tables' => [
|
||||
'revision',
|
||||
],
|
||||
'fields' => array_merge(
|
||||
[
|
||||
'slot_revision_id' => 'rev_id',
|
||||
'slot_content_id' => 'NULL',
|
||||
'slot_origin' => 'rev_id',
|
||||
'role_name' => $db->addQuotes( SlotRecord::MAIN ),
|
||||
'content_size' => 'rev_len',
|
||||
'content_sha1' => 'rev_sha1',
|
||||
'content_address' =>
|
||||
$db->buildConcat( [ $db->addQuotes( 'tt:' ), 'rev_text_id' ] ),
|
||||
'rev_text_id' => 'rev_text_id',
|
||||
'model_name' => 'rev_content_model',
|
||||
]
|
||||
),
|
||||
'joins' => [],
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ class RevisionStoreFactoryTest extends \MediaWikiIntegrationTestCase {
|
|||
$this->getHashWANObjectCache(),
|
||||
$this->getMockCommentStore(),
|
||||
ActorMigration::newMigration(),
|
||||
MIGRATION_OLD,
|
||||
MIGRATION_NEW,
|
||||
new NullLogger(),
|
||||
true
|
||||
);
|
||||
|
|
@ -44,8 +44,6 @@ class RevisionStoreFactoryTest extends \MediaWikiIntegrationTestCase {
|
|||
yield [ true ];
|
||||
yield [ false ];
|
||||
yield [ 'somewiki' ];
|
||||
yield [ 'somewiki', MIGRATION_OLD , false ];
|
||||
yield [ 'somewiki', MIGRATION_NEW , true ];
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -54,7 +52,7 @@ class RevisionStoreFactoryTest extends \MediaWikiIntegrationTestCase {
|
|||
*/
|
||||
public function testGetRevisionStore(
|
||||
$dbDomain,
|
||||
$mcrMigrationStage = MIGRATION_OLD,
|
||||
$mcrMigrationStage = MIGRATION_NEW,
|
||||
$contentHandlerUseDb = true
|
||||
) {
|
||||
$lbFactory = $this->getMockLoadBalancerFactory();
|
||||
|
|
|
|||
|
|
@ -120,9 +120,7 @@ class RevisionStoreTest extends MediaWikiTestCase {
|
|||
|
||||
public function provideSetContentHandlerUseDB() {
|
||||
return [
|
||||
// ContentHandlerUseDB can be true of false pre migration.
|
||||
[ false, SCHEMA_COMPAT_OLD, false ],
|
||||
[ true, SCHEMA_COMPAT_OLD, false ],
|
||||
// ContentHandlerUseDB can be true or false pre migration.
|
||||
// During and after migration it can not be false...
|
||||
[ false, SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD, true ],
|
||||
[ false, SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW, true ],
|
||||
|
|
@ -563,7 +561,6 @@ class RevisionStoreTest extends MediaWikiTestCase {
|
|||
|
||||
public function provideMigrationConstruction() {
|
||||
return [
|
||||
[ SCHEMA_COMPAT_OLD, false ],
|
||||
[ SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD, false ],
|
||||
[ SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW, false ],
|
||||
[ SCHEMA_COMPAT_NEW, false ],
|
||||
|
|
|
|||
|
|
@ -1,53 +0,0 @@
|
|||
<?php
|
||||
|
||||
use MediaWiki\Tests\Revision\PreMcrSchemaOverride;
|
||||
|
||||
/**
|
||||
* Tests Revision against the pre-MCR, pre ContentHandler DB schema.
|
||||
*
|
||||
* @covers Revision
|
||||
*
|
||||
* @group Revision
|
||||
* @group Storage
|
||||
* @group ContentHandler
|
||||
* @group Database
|
||||
* @group medium
|
||||
*/
|
||||
class RevisionNoContentModelDbTest extends RevisionDbTestBase {
|
||||
|
||||
use PreMcrSchemaOverride;
|
||||
|
||||
protected function getContentHandlerUseDB() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public function provideGetTextId() {
|
||||
yield [ [], null ];
|
||||
|
||||
$row = (object)[
|
||||
'rev_id' => 7,
|
||||
'rev_page' => 1, // should match actual page id
|
||||
'rev_text_id' => 789,
|
||||
'rev_timestamp' => '20180101000000',
|
||||
'rev_len' => 7,
|
||||
'rev_minor_edit' => 0,
|
||||
'rev_deleted' => 0,
|
||||
'rev_parent_id' => 0,
|
||||
'rev_sha1' => 'deadbeef',
|
||||
'rev_comment' => 'some comment',
|
||||
'rev_comment_text' => 'some comment',
|
||||
'rev_comment_data' => '{}',
|
||||
'rev_user' => 17,
|
||||
'rev_user_text' => 'some user',
|
||||
];
|
||||
|
||||
yield [ $row, 789 ];
|
||||
}
|
||||
|
||||
public function provideGetRevisionText() {
|
||||
yield [
|
||||
[ 'text' ]
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
<?php
|
||||
|
||||
use MediaWiki\Tests\Revision\PreMcrSchemaOverride;
|
||||
|
||||
/**
|
||||
* Tests Revision against the pre-MCR DB schema.
|
||||
*
|
||||
* @covers Revision
|
||||
*
|
||||
* @group Revision
|
||||
* @group Storage
|
||||
* @group ContentHandler
|
||||
* @group Database
|
||||
* @group medium
|
||||
*/
|
||||
class RevisionPreMcrDbTest extends RevisionDbTestBase {
|
||||
|
||||
use PreMcrSchemaOverride;
|
||||
|
||||
protected function getContentHandlerUseDB() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function provideGetTextId() {
|
||||
yield [ [], null ];
|
||||
|
||||
$row = (object)[
|
||||
'rev_id' => 7,
|
||||
'rev_page' => 1, // should match actual page id
|
||||
'rev_text_id' => 789,
|
||||
'rev_timestamp' => '20180101000000',
|
||||
'rev_len' => 7,
|
||||
'rev_minor_edit' => 0,
|
||||
'rev_deleted' => 0,
|
||||
'rev_parent_id' => 0,
|
||||
'rev_sha1' => 'deadbeef',
|
||||
'rev_comment' => 'some comment',
|
||||
'rev_comment_text' => 'some comment',
|
||||
'rev_comment_data' => '{}',
|
||||
'rev_user' => 17,
|
||||
'rev_user_text' => 'some user',
|
||||
];
|
||||
|
||||
yield [ $row, 789 ];
|
||||
}
|
||||
|
||||
public function provideGetRevisionText() {
|
||||
yield [
|
||||
[ 'text' ]
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -1,80 +0,0 @@
|
|||
<?php
|
||||
|
||||
use MediaWiki\MediaWikiServices;
|
||||
use MediaWiki\Revision\SlotRecord;
|
||||
use MediaWiki\Storage\SqlBlobStore;
|
||||
use MediaWiki\Tests\Revision\PreMcrSchemaOverride;
|
||||
|
||||
/**
|
||||
* Test class for page archiving, using the pre-MCR schema.
|
||||
*
|
||||
* @group ContentHandler
|
||||
* @group Database
|
||||
* ^--- important, causes temporary tables to be used instead of the real database
|
||||
*
|
||||
* @group medium
|
||||
* ^--- important, causes tests not to fail with timeout
|
||||
*/
|
||||
class PageArchivePreMcrTest extends PageArchiveTestBase {
|
||||
|
||||
use PreMcrSchemaOverride;
|
||||
|
||||
protected function getExpectedArchiveRows() {
|
||||
/** @var SqlBlobStore $blobStore */
|
||||
$blobStore = MediaWikiServices::getInstance()->getBlobStore();
|
||||
|
||||
return [
|
||||
[
|
||||
'ar_minor_edit' => '0',
|
||||
'ar_user' => null,
|
||||
'ar_user_text' => $this->ipEditor,
|
||||
'ar_actor' => (string)User::newFromName( $this->ipEditor, false )->getActorId( $this->db ),
|
||||
'ar_len' => '11',
|
||||
'ar_deleted' => '0',
|
||||
'ar_rev_id' => strval( $this->ipRev->getId() ),
|
||||
'ar_timestamp' => $this->db->timestamp( $this->ipRev->getTimestamp() ),
|
||||
'ar_sha1' => '0qdrpxl537ivfnx4gcpnzz0285yxryy',
|
||||
'ar_page_id' => strval( $this->ipRev->getPageId() ),
|
||||
'ar_comment_text' => 'just a test',
|
||||
'ar_comment_data' => null,
|
||||
'ar_comment_cid' => '2',
|
||||
'ar_content_format' => null,
|
||||
'ar_content_model' => null,
|
||||
'ts_tags' => null,
|
||||
'ar_id' => '2',
|
||||
'ar_namespace' => '0',
|
||||
'ar_title' => 'PageArchiveTest_thePage',
|
||||
'ar_text_id' => (string)$blobStore->getTextIdFromAddress(
|
||||
$this->ipRev->getSlot( SlotRecord::MAIN )->getAddress()
|
||||
),
|
||||
'ar_parent_id' => strval( $this->ipRev->getParentId() ),
|
||||
],
|
||||
[
|
||||
'ar_minor_edit' => '0',
|
||||
'ar_user' => (string)$this->getTestUser()->getUser()->getId(),
|
||||
'ar_user_text' => $this->getTestUser()->getUser()->getName(),
|
||||
'ar_actor' => (string)$this->getTestUser()->getUser()->getActorId(),
|
||||
'ar_len' => '7',
|
||||
'ar_deleted' => '0',
|
||||
'ar_rev_id' => strval( $this->firstRev->getId() ),
|
||||
'ar_timestamp' => $this->db->timestamp( $this->firstRev->getTimestamp() ),
|
||||
'ar_sha1' => 'pr0s8e18148pxhgjfa0gjrvpy8fiyxc',
|
||||
'ar_page_id' => strval( $this->firstRev->getPageId() ),
|
||||
'ar_comment_text' => 'testing',
|
||||
'ar_comment_data' => null,
|
||||
'ar_comment_cid' => '1',
|
||||
'ar_content_format' => null,
|
||||
'ar_content_model' => null,
|
||||
'ts_tags' => null,
|
||||
'ar_id' => '1',
|
||||
'ar_namespace' => '0',
|
||||
'ar_title' => 'PageArchiveTest_thePage',
|
||||
'ar_text_id' => (string)$blobStore->getTextIdFromAddress(
|
||||
$this->firstRev->getSlot( SlotRecord::MAIN )->getAddress()
|
||||
),
|
||||
'ar_parent_id' => '0',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
<?php
|
||||
|
||||
use MediaWiki\Tests\Revision\PreMcrSchemaOverride;
|
||||
|
||||
/**
|
||||
* Tests WikiPage against the pre-MCR, pre ContentHandler DB schema.
|
||||
*
|
||||
* @covers WikiPage
|
||||
*
|
||||
* @group WikiPage
|
||||
* @group Storage
|
||||
* @group ContentHandler
|
||||
* @group Database
|
||||
* @group medium
|
||||
*/
|
||||
class WikiPageNoContentModelDbTest extends WikiPageDbTestBase {
|
||||
|
||||
use PreMcrSchemaOverride;
|
||||
|
||||
protected function getContentHandlerUseDB() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public function testGetDeletionUpdates() {
|
||||
$mainContent1 = new WikitextContent( '' );
|
||||
|
||||
$title = Title::makeTitle( $this->getDefaultWikitextNS(), __METHOD__ );
|
||||
$page = new WikiPage( $title );
|
||||
$page = $this->createPage(
|
||||
$page,
|
||||
[ 'main' => $mainContent1 ]
|
||||
);
|
||||
|
||||
$dataUpdates = $page->getDeletionUpdates( $page->getRevisionRecord() );
|
||||
$this->assertNotEmpty( $dataUpdates );
|
||||
|
||||
$updateNames = array_map( function ( $du ) {
|
||||
return isset( $du->_name ) ? $du->_name : get_class( $du );
|
||||
}, $dataUpdates );
|
||||
|
||||
$this->assertContains( LinksDeletionUpdate::class, $updateNames );
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
<?php
|
||||
|
||||
use MediaWiki\Tests\Revision\PreMcrSchemaOverride;
|
||||
|
||||
/**
|
||||
* Tests WikiPage against the pre-MCR DB schema.
|
||||
*
|
||||
* @covers WikiPage
|
||||
*
|
||||
* @group WikiPage
|
||||
* @group Storage
|
||||
* @group ContentHandler
|
||||
* @group Database
|
||||
* @group medium
|
||||
*/
|
||||
class WikiPagePreMcrDbTest extends WikiPageDbTestBase {
|
||||
|
||||
use PreMcrSchemaOverride;
|
||||
|
||||
protected function getContentHandlerUseDB() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers WikiPage::getContentModel
|
||||
*/
|
||||
public function testGetContentModel() {
|
||||
$page = $this->createPage(
|
||||
__METHOD__,
|
||||
"some text",
|
||||
CONTENT_MODEL_JAVASCRIPT
|
||||
);
|
||||
|
||||
$page = new WikiPage( $page->getTitle() );
|
||||
$this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $page->getContentModel() );
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers WikiPage::getContentHandler
|
||||
*/
|
||||
public function testGetContentHandler() {
|
||||
$page = $this->createPage(
|
||||
__METHOD__,
|
||||
"some text",
|
||||
CONTENT_MODEL_JAVASCRIPT
|
||||
);
|
||||
|
||||
$page = new WikiPage( $page->getTitle() );
|
||||
$this->assertEquals( JavaScriptContentHandler::class, get_class( $page->getContentHandler() ) );
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in a new issue