From 89c263dcaf4eea2de3aeb21bcd047196730c9d0d Mon Sep 17 00:00:00 2001 From: Brad Jorsch Date: Tue, 7 Feb 2017 10:22:47 -0500 Subject: [PATCH] ApiPageSet: Use processTitlesArray() in getRedirectTargets() Instead of trying to duplicate the code to build a LinkBatch while handling whatever special titles might exist, let's just use processTitlesArray() to do it for us. To do it right we also need to add some more deduplication to processTitlesArray(). Bug: T41492 Change-Id: I28ed0d813a026b64a42b5a2518de9b02a8543aac --- includes/api/ApiPageSet.php | 38 ++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/includes/api/ApiPageSet.php b/includes/api/ApiPageSet.php index 06019cff2f..8623e127b6 100644 --- a/includes/api/ApiPageSet.php +++ b/includes/api/ApiPageSet.php @@ -64,6 +64,7 @@ class ApiPageSet extends ApiBase { private $mMissingPageIDs = []; private $mRedirectTitles = []; private $mSpecialTitles = []; + private $mAllSpecials = []; // separate from mAllPages to avoid breaking getAllTitlesByNamespace() private $mNormalizedTitles = []; private $mInterwikiTitles = []; /** @var Title[] */ @@ -1061,7 +1062,7 @@ class ApiPageSet extends ApiBase { * @return LinkBatch */ private function getRedirectTargets() { - $lb = new LinkBatch(); + $titlesToResolve = []; $db = $this->getDB(); $res = $db->select( @@ -1088,8 +1089,8 @@ class ApiPageSet extends ApiBase { 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; } @@ -1104,7 +1105,11 @@ class ApiPageSet extends ApiBase { // 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; @@ -1112,7 +1117,7 @@ class ApiPageSet extends ApiBase { } } - return $lb; + return $this->processTitlesArray( $titlesToResolve ); } /** @@ -1151,12 +1156,14 @@ class ApiPageSet extends ApiBase { $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 { @@ -1184,8 +1191,13 @@ class ApiPageSet extends ApiBase { 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 ); -- 2.20.1