X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=includes%2Fapi%2FApiQueryUserContribs.php;h=919c7631b37a3b0e1774355a18134fa28a583e22;hp=5b178b747838ce1f13f10e346754c6ad994e9b79;hb=54c93f1d384cd5accd2db2ebbb911e4d627c2980;hpb=d5e63e5ad8b0d033c90649c552a0b726d82132ee diff --git a/includes/api/ApiQueryUserContribs.php b/includes/api/ApiQueryUserContribs.php index 5b178b7478..919c7631b3 100644 --- a/includes/api/ApiQueryUserContribs.php +++ b/includes/api/ApiQueryUserContribs.php @@ -331,9 +331,6 @@ class ApiQueryUserContribs extends ApiQueryBase { $db = $this->getDB(); $revQuery = MediaWikiServices::getInstance()->getRevisionStore()->getQueryInfo( [ 'page' ] ); - $this->addTables( $revQuery['tables'] ); - $this->addJoinConds( $revQuery['joins'] ); - $this->addFields( $revQuery['fields'] ); if ( $wgActorTableSchemaMigrationStage & SCHEMA_COMPAT_READ_NEW ) { $revWhere = ActorMigration::newMigration()->getWhere( $db, 'rev_user', $users ); @@ -341,6 +338,24 @@ class ApiQueryUserContribs extends ApiQueryBase { $userField = $this->orderBy === 'actor' ? 'revactor_actor' : 'actor_name'; $tsField = 'revactor_timestamp'; $idField = 'revactor_rev'; + + // T221511: MySQL/MariaDB (10.1.37) can sometimes irrationally decide that querying `actor` + // before `revision_actor_temp` and filesorting is somehow better than querying $limit+1 rows + // from `revision_actor_temp`. Tell it not to reorder the query (and also reorder it ourselves + // because as generated by RevisionStore it'll have `revision` first rather than + // `revision_actor_temp`). But not when uctag is used, as it seems as likely to be harmed as + // helped in that case, and not when there's only one User because in that case it fetches + // the one `actor` row as a constant and doesn't filesort. + if ( count( $users ) > 1 && !isset( $this->params['tag'] ) ) { + $revQuery['joins']['revision'] = $revQuery['joins']['temp_rev_user']; + unset( $revQuery['joins']['temp_rev_user'] ); + $this->addOption( 'STRAIGHT_JOIN' ); + // It isn't actually necesssary to reorder $revQuery['tables'] as Database does the right thing + // when join conditions are given for all joins, but Gergő is wary of relying on that so pull + // `revision_actor_temp` to the start. + $revQuery['tables'] = + [ 'temp_rev_user' => $revQuery['tables']['temp_rev_user'] ] + $revQuery['tables']; + } } else { // If we're dealing with user names (rather than IDs) in read-old mode, // pass false for ActorMigration::getWhere()'s $useId parameter so @@ -353,6 +368,9 @@ class ApiQueryUserContribs extends ApiQueryBase { $idField = 'rev_id'; } + $this->addTables( $revQuery['tables'] ); + $this->addJoinConds( $revQuery['joins'] ); + $this->addFields( $revQuery['fields'] ); $this->addWhere( $revWhere['conds'] ); // Handle continue parameter @@ -390,9 +408,11 @@ class ApiQueryUserContribs extends ApiQueryBase { // Don't include any revisions where we're not supposed to be able to // see the username. $user = $this->getUser(); - if ( !$user->isAllowed( 'deletedhistory' ) ) { + if ( !$this->getPermissionManager()->userHasRight( $user, 'deletedhistory' ) ) { $bitmask = RevisionRecord::DELETED_USER; - } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) { + } elseif ( !$this->getPermissionManager() + ->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' ) + ) { $bitmask = RevisionRecord::DELETED_USER | RevisionRecord::DELETED_RESTRICTED; } else { $bitmask = 0;