X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2Fapi%2FApiQueryRevisions.php;h=ac7ee0ae9f758b3e9bd13a40c1610a436f413dd1;hb=59e856e3e64e9fa05c39a6d0bfb5514183c9658b;hp=5e7b864b54ac96c044715fd7e8e88ed6037c79fd;hpb=b7a0bafb4b64a02bb209853b37b3d8939ee9ffdc;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiQueryRevisions.php b/includes/api/ApiQueryRevisions.php index 5e7b864b54..ac7ee0ae9f 100644 --- a/includes/api/ApiQueryRevisions.php +++ b/includes/api/ApiQueryRevisions.php @@ -21,7 +21,8 @@ */ use MediaWiki\MediaWikiServices; -use MediaWiki\Storage\RevisionRecord; +use MediaWiki\Revision\RevisionRecord; +use MediaWiki\Storage\NameTableAccessException; /** * A query action to enumerate revisions of a given page, or show top revisions @@ -83,6 +84,8 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase { } protected function run( ApiPageSet $resultPageSet = null ) { + global $wgActorTableSchemaMigrationStage, $wgChangeTagsSchemaMigrationStage; + $params = $this->extractRequestParams( false ); $revisionStore = MediaWikiServices::getInstance()->getRevisionStore(); @@ -130,6 +133,19 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase { $db = $this->getDB(); + $idField = 'rev_id'; + $tsField = 'rev_timestamp'; + $pageField = 'rev_page'; + if ( $params['user'] !== null && + ( $wgActorTableSchemaMigrationStage & SCHEMA_COMPAT_READ_NEW ) + ) { + // We're going to want to use the page_actor_timestamp index (on revision_actor_temp) + // so use that table's denormalized fields. + $idField = 'revactor_rev'; + $tsField = 'revactor_timestamp'; + $pageField = 'revactor_page'; + } + if ( $resultPageSet === null ) { $this->parseParameters( $params ); $this->token = $params['token']; @@ -144,6 +160,15 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase { $opts[] = 'user'; } $revQuery = $revisionStore->getQueryInfo( $opts ); + + if ( $idField !== 'rev_id' ) { + $aliasFields = [ 'rev_id' => $idField, 'rev_timestamp' => $tsField, 'rev_page' => $pageField ]; + $revQuery['fields'] = array_merge( + $aliasFields, + array_diff( $revQuery['fields'], array_keys( $aliasFields ) ) + ); + } + $this->addTables( $revQuery['tables'] ); $this->addFields( $revQuery['fields'] ); $this->addJoinConds( $revQuery['joins'] ); @@ -154,7 +179,9 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase { $this->addJoinConds( [ 'page' => [ 'INNER JOIN', [ 'page_id = rev_page' ] ] ] ); - $this->addFields( [ 'rev_id', 'rev_timestamp', 'rev_page' ] ); + $this->addFields( [ + 'rev_id' => $idField, 'rev_timestamp' => $tsField, 'rev_page' => $pageField + ] ); } if ( $this->fld_tags ) { @@ -170,7 +197,17 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase { $this->addJoinConds( [ 'change_tag' => [ 'INNER JOIN', [ 'rev_id=ct_rev_id' ] ] ] ); - $this->addWhereFld( 'ct_tag', $params['tag'] ); + if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) { + $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore(); + try { + $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $params['tag'] ) ); + } catch ( NameTableAccessException $exception ) { + // Return nothing. + $this->addWhere( '1=0' ); + } + } else { + $this->addWhereFld( 'ct_tag', $params['tag'] ); + } } if ( $resultPageSet === null && $this->fetchContent ) { @@ -194,6 +231,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase { if ( $enumRevMode ) { // Indexes targeted: // page_timestamp if we don't have rvuser + // page_actor_timestamp (on revision_actor_temp) if we have rvuser in READ_NEW mode // page_user_timestamp if we have a logged-in rvuser // page_timestamp or usertext_timestamp if we have an IP rvuser @@ -209,9 +247,9 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase { $continueTimestamp = $db->addQuotes( $db->timestamp( $cont[0] ) ); $continueId = (int)$cont[1]; $this->dieContinueUsageIf( $continueId != $cont[1] ); - $this->addWhere( "rev_timestamp $op $continueTimestamp OR " . - "(rev_timestamp = $continueTimestamp AND " . - "rev_id $op= $continueId)" + $this->addWhere( "$tsField $op $continueTimestamp OR " . + "($tsField = $continueTimestamp AND " . + "$idField $op= $continueId)" ); } @@ -261,24 +299,24 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase { $op = ( $params['dir'] === 'newer' ? '>' : '<' ); $ts = $db->addQuotes( $db->timestampOrNull( $params['start'] ) ); if ( $params['startid'] !== null ) { - $this->addWhere( "rev_timestamp $op $ts OR " - . "rev_timestamp = $ts AND rev_id $op= " . intval( $params['startid'] ) ); + $this->addWhere( "$tsField $op $ts OR " + . "$tsField = $ts AND $idField $op= " . intval( $params['startid'] ) ); } else { - $this->addWhere( "rev_timestamp $op= $ts" ); + $this->addWhere( "$tsField $op= $ts" ); } } if ( $params['end'] !== null ) { $op = ( $params['dir'] === 'newer' ? '<' : '>' ); // Yes, opposite of the above $ts = $db->addQuotes( $db->timestampOrNull( $params['end'] ) ); if ( $params['endid'] !== null ) { - $this->addWhere( "rev_timestamp $op $ts OR " - . "rev_timestamp = $ts AND rev_id $op= " . intval( $params['endid'] ) ); + $this->addWhere( "$tsField $op $ts OR " + . "$tsField = $ts AND $idField $op= " . intval( $params['endid'] ) ); } else { - $this->addWhere( "rev_timestamp $op= $ts" ); + $this->addWhere( "$tsField $op= $ts" ); } } } else { - $this->addTimestampWhereRange( 'rev_timestamp', $params['dir'], + $this->addTimestampWhereRange( $tsField, $params['dir'], $params['start'], $params['end'] ); } @@ -287,7 +325,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase { // There is only one ID, use it $ids = array_keys( $pageSet->getGoodTitles() ); - $this->addWhereFld( 'rev_page', reset( $ids ) ); + $this->addWhereFld( $pageField, reset( $ids ) ); if ( $params['user'] !== null ) { $actorQuery = ActorMigration::newMigration() @@ -486,7 +524,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase { protected function getExamplesMessages() { return [ 'action=query&prop=revisions&titles=API|Main%20Page&' . - 'rvprop=timestamp|user|comment|content' + 'rvslots=*&rvprop=timestamp|user|comment|content' => 'apihelp-query+revisions-example-content', 'action=query&prop=revisions&titles=Main%20Page&rvlimit=5&' . 'rvprop=timestamp|user|comment'