X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fapi%2FApiQueryRevisions.php;h=a6bf58a1b72e0b5b67498301901af7413a747d33;hb=6e58bfb43a161235444d10d8cf42e8f0eaee4efe;hp=b8a180f2a1dc8efade6ae50a0bec53f558e30ce2;hpb=d69b967481649acbf8fa3d4e60df821bd24fda01;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiQueryRevisions.php b/includes/api/ApiQueryRevisions.php index b8a180f2a1..a6bf58a1b7 100644 --- a/includes/api/ApiQueryRevisions.php +++ b/includes/api/ApiQueryRevisions.php @@ -84,7 +84,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase { } protected function run( ApiPageSet $resultPageSet = null ) { - global $wgChangeTagsSchemaMigrationStage; + global $wgActorTableSchemaMigrationStage; $params = $this->extractRequestParams( false ); $revisionStore = MediaWikiServices::getInstance()->getRevisionStore(); @@ -133,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']; @@ -147,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'] ); @@ -157,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 ) { @@ -173,16 +197,12 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase { $this->addJoinConds( [ 'change_tag' => [ 'INNER JOIN', [ 'rev_id=ct_rev_id' ] ] ] ); - 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'] ); + $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore(); + try { + $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $params['tag'] ) ); + } catch ( NameTableAccessException $exception ) { + // Return nothing. + $this->addWhere( '1=0' ); } } @@ -207,6 +227,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 @@ -222,9 +243,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)" ); } @@ -274,24 +295,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'] ); } @@ -300,7 +321,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()