$result = new StatusValue();
$rowsByRevId = [];
- $pageIds = [];
+ $pageIdsToFetchTitles = [];
$titlesByPageId = [];
foreach ( $rows as $row ) {
if ( isset( $rowsByRevId[$row->rev_id] ) ) {
throw new InvalidArgumentException(
"Revision {$row->rev_id} doesn't belong to page {$title->getArticleID()}"
);
+ } elseif ( !$title && !isset( $titlesByPageId[ $row->rev_page ] ) ) {
+ if ( isset( $row->page_namespace ) && isset( $row->page_title ) &&
+ // This should not happen, but just in case we don't have a page_id
+ // set or it doesn't match rev_page, let's fetch the title again.
+ isset( $row->page_id ) && $row->rev_page === $row->page_id
+ ) {
+ $titlesByPageId[ $row->rev_page ] = Title::newFromRow( $row );
+ } else {
+ $pageIdsToFetchTitles[] = $row->rev_page;
+ }
}
- $pageIds[] = $row->rev_page;
$rowsByRevId[$row->rev_id] = $row;
}
// If the title is not supplied, batch-fetch Title objects.
if ( $title ) {
$titlesByPageId[$title->getArticleID()] = $title;
- } else {
- $pageIds = array_unique( $pageIds );
- foreach ( Title::newFromIDs( $pageIds ) as $t ) {
+ } elseif ( !empty( $pageIdsToFetchTitles ) ) {
+ $pageIdsToFetchTitles = array_unique( $pageIdsToFetchTitles );
+ foreach ( Title::newFromIDs( $pageIdsToFetchTitles ) as $t ) {
$titlesByPageId[$t->getArticleID()] = $t;
}
}
public function provideNewRevisionsFromBatchOptions() {
yield 'No preload slots or content, single page' => [
+ [ 'comment' ],
null,
[]
];
yield 'Preload slots and content, single page' => [
+ [ 'comment' ],
null,
[
'slots' => [ SlotRecord::MAIN ],
]
];
yield 'Ask for no slots' => [
+ [ 'comment' ],
null,
[ 'slots' => [] ]
];
yield 'No preload slots or content, multiple pages' => [
+ [ 'comment' ],
'Other_Page',
[]
];
yield 'Preload slots and content, multiple pages' => [
+ [ 'comment' ],
+ 'Other_Page',
+ [
+ 'slots' => [ SlotRecord::MAIN ],
+ 'content' => true
+ ]
+ ];
+ yield 'Preload slots and content, multiple pages, preload page fields' => [
+ [ 'page', 'comment' ],
'Other_Page',
[
'slots' => [ SlotRecord::MAIN ],
/**
* @dataProvider provideNewRevisionsFromBatchOptions
- * @covers \MediaWiki\Revision\RevisionStore::newRevisionsFromBatch
+ * @covers \MediaWiki\Revision\RevisionStore::newRevisionsFromBatch
+ * @param array|null $queryOptions options to provide to revisionToRow
* @param string|null $otherPageTitle
* @param array|null $options
* @throws \MWException
*/
public function testNewRevisionsFromBatch_preloadContent(
+ $queryOptions,
$otherPageTitle = null,
array $options = []
) {
$store = MediaWikiServices::getInstance()->getRevisionStore();
$result = $store->newRevisionsFromBatch(
- [ $this->revisionToRow( $rev1 ), $this->revisionToRow( $rev2 ) ],
+ [
+ $this->revisionToRow( $rev1, $queryOptions ),
+ $this->revisionToRow( $rev2, $queryOptions )
+ ],
$options
);
$this->assertTrue( $result->isGood() );