private $mMissingPageIDs = [];
private $mRedirectTitles = [];
private $mSpecialTitles = [];
+ private $mAllSpecials = []; // separate from mAllPages to avoid breaking getAllTitlesByNamespace()
private $mNormalizedTitles = [];
private $mInterwikiTitles = [];
/** @var Title[] */
* @return LinkBatch
*/
private function getRedirectTargets() {
- $lb = new LinkBatch();
+ $titlesToResolve = [];
$db = $this->getDB();
$res = $db->select(
unset( $this->mPendingRedirectIDs[$rdfrom] );
if ( $to->isExternal() ) {
$this->mInterwikiTitles[$to->getPrefixedText()] = $to->getInterwiki();
- } elseif ( !isset( $this->mAllPages[$row->rd_namespace][$row->rd_title] ) ) {
- $lb->add( $row->rd_namespace, $row->rd_title );
+ } elseif ( !isset( $this->mAllPages[$to->getNamespace()][$to->getDBkey()] ) ) {
+ $titlesToResolve[] = $to;
}
$this->mRedirectTitles[$from] = $to;
}
// What the hell. Let's just ignore this
continue;
}
- $lb->addObj( $rt );
+ if ( $rt->isExternal() ) {
+ $this->mInterwikiTitles[$rt->getPrefixedText()] = $rt->getInterwiki();
+ } elseif ( !isset( $this->mAllPages[$rt->getNamespace()][$rt->getDBkey()] ) ) {
+ $titlesToResolve[] = $rt;
+ }
$from = $title->getPrefixedText();
$this->mResolvedRedirectTitles[$from] = $title;
$this->mRedirectTitles[$from] = $rt;
}
}
- return $lb;
+ return $this->processTitlesArray( $titlesToResolve );
}
/**
$titleObj = Title::newFromTextThrow( $title, $this->mDefaultNamespace );
} catch ( MalformedTitleException $ex ) {
// Handle invalid titles gracefully
- $this->mAllPages[0][$title] = $this->mFakePageId;
- $this->mInvalidTitles[$this->mFakePageId] = [
- 'title' => $title,
- 'invalidreason' => $this->getErrorFormatter()->formatException( $ex, [ 'bc' => true ] ),
- ];
- $this->mFakePageId--;
+ if ( !isset( $this->mAllPages[0][$title] ) ) {
+ $this->mAllPages[0][$title] = $this->mFakePageId;
+ $this->mInvalidTitles[$this->mFakePageId] = [
+ 'title' => $title,
+ 'invalidreason' => $this->getErrorFormatter()->formatException( $ex, [ 'bc' => true ] ),
+ ];
+ $this->mFakePageId--;
+ }
continue; // There's nothing else we can do
}
} else {
if ( $titleObj->getNamespace() < 0 ) {
// Handle Special and Media pages
$titleObj = $titleObj->fixSpecialName();
- $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
- $this->mFakePageId--;
+ $ns = $titleObj->getNamespace();
+ $dbkey = $titleObj->getDBkey();
+ if ( !isset( $this->mAllSpecials[$ns][$dbkey] ) ) {
+ $this->mAllSpecials[$ns][$dbkey] = $this->mFakePageId;
+ $this->mSpecialTitles[$this->mFakePageId] = $titleObj;
+ $this->mFakePageId--;
+ }
} else {
// Regular page
$linkBatch->addObj( $titleObj );