* @return LinkBatch
*/
private function getRedirectTargets() {
- $redirectTitles = $this->resolveIdsToRedirectTargets( array_keys( $this->mPendingRedirectIDs ), 'profileDB' );
-
$lb = new LinkBatch();
- foreach( $this->mPendingRedirectIDs as $rdfrom => $from ) {
- if( !isset( $redirectTitles[$rdfrom] ) ) {
- continue;
- }
- $to = $redirectTitles[$rdfrom];
- if ( $to && !isset( $this->mAllPages[$to->getNamespace()][$to->getText()] ) ) {
- $lb->addObj( $to );
- }
- $this->mRedirectTitles[$from->getPrefixedText()] = $to;
- }
- return $lb;
- }
-
- /**
- * Get the targets of redirects from the database
- *
- * Also creates entries in the redirect table for redirects that don't
- * have one.
- *
- * @param $redirectIDs array The array of pageids to resolve
- * @param $profileDB string if profileDBIn should called
- * @return array id => redirect target as title
- * @since 1.21
- */
- public function resolveIdsToRedirectTargets( $redirectIDs, $profileDB = '' ) {
- if( !$redirectIDs ) {
- return array();
- }
-
$db = $this->getDB();
- if( $profileDB ) {
- $this->profileDBIn();
- }
+ $this->profileDBIn();
$res = $db->select(
'redirect',
array(
'rd_fragment',
'rd_interwiki',
'rd_title'
- ), array( 'rd_from' => $redirectIDs ),
+ ), array( 'rd_from' => array_keys( $this->mPendingRedirectIDs ) ),
__METHOD__
);
- if( $profileDB ) {
- $this->profileDBOut();
- }
-
- $redirectTitles = array();
+ $this->profileDBOut();
foreach ( $res as $row ) {
$rdfrom = intval( $row->rd_from );
+ $from = $this->mPendingRedirectIDs[$rdfrom]->getPrefixedText();
$to = Title::makeTitle( $row->rd_namespace, $row->rd_title, $row->rd_fragment, $row->rd_interwiki );
- $redirectTitles[$rdfrom] = $to;
+ unset( $this->mPendingRedirectIDs[$rdfrom] );
+ if ( !isset( $this->mAllPages[$row->rd_namespace][$row->rd_title] ) ) {
+ $lb->add( $row->rd_namespace, $row->rd_title );
+ }
+ $this->mRedirectTitles[$from] = $to;
}
- $unresolvedRedirectIDs = array_diff( $redirectIDs, array_keys( $redirectTitles ) );
- if ( $unresolvedRedirectIDs ) {
+ if ( $this->mPendingRedirectIDs ) {
// We found pages that aren't in the redirect table
// Add them
- foreach ( $unresolvedRedirectIDs as $id ) {
- $page = WikiPage::newFromID( $id );
- if ( !$page ) {
- continue;
- }
+ foreach ( $this->mPendingRedirectIDs as $id => $title ) {
+ $page = WikiPage::factory( $title );
$rt = $page->insertRedirect();
if ( !$rt ) {
// What the hell. Let's just ignore this
continue;
}
- $redirectTitles[$id] = $rt;
+ $lb->addObj( $rt );
+ $this->mRedirectTitles[$title->getPrefixedText()] = $rt;
+ unset( $this->mPendingRedirectIDs[$id] );
}
}
- return $redirectTitles;
+ return $lb;
}
/**
private $fld_protection = false, $fld_talkid = false,
$fld_subjectid = false, $fld_url = false,
$fld_readable = false, $fld_watched = false, $fld_notificationtimestamp = false,
- $fld_preload = false, $fld_displaytitle = false, $fld_redirecttarget = false;
+ $fld_preload = false, $fld_displaytitle = false;
private $params, $titles, $missing, $everything, $pageCounter;
private $pageRestrictions, $pageIsRedir, $pageIsNew, $pageTouched,
- $pageLatest, $pageLength, $redirectTarget;
+ $pageLatest, $pageLength;
private $protections, $watched, $notificationtimestamps, $talkids, $subjectids, $displaytitles;
$this->fld_readable = isset( $prop['readable'] );
$this->fld_preload = isset( $prop['preload'] );
$this->fld_displaytitle = isset( $prop['displaytitle'] );
- $this->fld_redirecttarget = isset( $prop['redirecttarget'] );
}
$pageSet = $this->getPageSet();
$this->getDisplayTitle();
}
- if ( $this->fld_redirecttarget ) {
- $this->redirectTarget = $pageSet->resolveIdsToRedirectTargets( array_keys( $this->pageIsRedir ) );
- }
-
foreach ( $this->everything as $pageid => $title ) {
$pageInfo = $this->extractPageInfo( $pageid, $title );
$fit = $result->addValue( array(
if ( $this->pageIsNew[$pageid] ) {
$pageInfo['new'] = '';
}
- if ( $this->fld_redirecttarget && isset( $this->redirectTarget[$pageid] ) ) {
- $targetTitle = $this->redirectTarget[$pageid];
- $pageInfo['redirecttarget'] = $targetTitle->getPrefixedText();
- if( $targetTitle->getFragment() !== '' ) {
- $pageInfo['redirecttargetfragment'] = $targetTitle->getFragment();
- }
- }
}
if ( !is_null( $this->params['token'] ) ) {
'url',
'preload',
'displaytitle',
- 'redirecttarget',
);
if ( !is_null( $params['prop'] ) ) {
foreach ( $params['prop'] as $prop ) {
'readable', # private
'preload',
'displaytitle',
- 'redirecttarget',
// If you add more properties here, please consider whether they
// need to be added to getCacheMode()
) ),
' readable - Whether the user can read this page',
' preload - Gives the text returned by EditFormPreloadText',
' displaytitle - Gives the way the page title is actually displayed',
- ' redirecttarget - Gives the redirect target, if this page is a redirect',
),
'token' => 'Request a token to perform a data-modifying action on a page',
'continue' => 'When more results are available, use this to continue',
),
'displaytitle' => array(
'displaytitle' => 'string'
- ),
- 'redirecttarget' => array(
- 'redirecttarget' => 'string',
- 'redirecttargetfragment' => array(
- ApiBase::PROP_TYPE => 'string',
- ApiBase::PROP_NULLABLE => true
- )
)
);