From c1f9b1f7b1b77776192048005dcc66dcf3df2bfb Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Sat, 27 Dec 2014 15:41:37 +0100 Subject: Update to MediaWiki 1.24.1 --- includes/api/ApiQueryAllLinks.php | 124 +++++++++++++++++++++++--------------- 1 file changed, 75 insertions(+), 49 deletions(-) (limited to 'includes/api/ApiQueryAllLinks.php') diff --git a/includes/api/ApiQueryAllLinks.php b/includes/api/ApiQueryAllLinks.php index 47d1bcef..903dee42 100644 --- a/includes/api/ApiQueryAllLinks.php +++ b/includes/api/ApiQueryAllLinks.php @@ -31,15 +31,21 @@ */ class ApiQueryAllLinks extends ApiQueryGeneratorBase { - public function __construct( $query, $moduleName ) { + private $table, $tablePrefix, $indexTag, + $description, $descriptionWhat, $descriptionTargets, $descriptionLinking; + private $fieldTitle = 'title'; + private $dfltNamespace = NS_MAIN; + private $hasNamespace = true; + private $useIndex = null; + private $props = array(), $propHelp = array(); + + public function __construct( ApiQuery $query, $moduleName ) { switch ( $moduleName ) { case 'alllinks': $prefix = 'al'; $this->table = 'pagelinks'; $this->tablePrefix = 'pl_'; - $this->fieldTitle = 'title'; - $this->dfltNamespace = NS_MAIN; - $this->hasNamespace = true; + $this->useIndex = 'pl_namespace'; $this->indexTag = 'l'; $this->description = 'Enumerate all links that point to a given namespace'; $this->descriptionWhat = 'link'; @@ -50,11 +56,11 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { $prefix = 'at'; $this->table = 'templatelinks'; $this->tablePrefix = 'tl_'; - $this->fieldTitle = 'title'; $this->dfltNamespace = NS_TEMPLATE; - $this->hasNamespace = true; + $this->useIndex = 'tl_namespace'; $this->indexTag = 't'; - $this->description = 'List all transclusions (pages embedded using {{x}}), including non-existing'; + $this->description = + 'List all transclusions (pages embedded using {{x}}), including non-existing'; $this->descriptionWhat = 'transclusion'; $this->descriptionTargets = 'transcluded titles'; $this->descriptionLinking = 'transcluding'; @@ -72,6 +78,24 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { $this->descriptionTargets = 'file titles'; $this->descriptionLinking = 'using'; break; + case 'allredirects': + $prefix = 'ar'; + $this->table = 'redirect'; + $this->tablePrefix = 'rd_'; + $this->indexTag = 'r'; + $this->description = 'List all redirects to a namespace'; + $this->descriptionWhat = 'redirect'; + $this->descriptionTargets = 'target pages'; + $this->descriptionLinking = 'redirecting'; + $this->props = array( + 'fragment' => 'rd_fragment', + 'interwiki' => 'rd_interwiki', + ); + $this->propHelp = array( + ' fragment - Adds the fragment from the redirect, if any', + ' interwiki - Adds the interwiki prefix from the redirect, if any', + ); + break; default: ApiBase::dieDebug( __METHOD__, 'Unknown module name' ); } @@ -92,7 +116,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { } /** - * @param $resultPageSet ApiPageSet + * @param ApiPageSet $resultPageSet * @return void */ private function run( $resultPageSet = null ) { @@ -111,10 +135,13 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { } if ( $params['unique'] ) { - if ( $fld_ids ) { + $matches = array_intersect_key( $prop, $this->props + array( 'ids' => 1 ) ); + if ( $matches ) { + $p = $this->getModulePrefix(); $this->dieUsage( - "{$this->getModuleName()} cannot return corresponding page ids in unique {$this->descriptionWhat}s mode", - 'params' ); + "Cannot use {$p}prop=" . join( '|', array_keys( $matches ) ) . " with {$p}unique", + 'params' + ); } $this->addOption( 'DISTINCT' ); } @@ -145,19 +172,25 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { } // 'continue' always overrides 'from' - $from = ( $continue || is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) ); - $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) ); + $from = ( $continue || $params['from'] === null ? null : + $this->titlePartToKey( $params['from'], $namespace ) ); + $to = ( $params['to'] === null ? null : + $this->titlePartToKey( $params['to'], $namespace ) ); $this->addWhereRange( $pfx . $fieldTitle, 'newer', $from, $to ); if ( isset( $params['prefix'] ) ) { - $this->addWhere( $pfx . $fieldTitle . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) ); + $this->addWhere( $pfx . $fieldTitle . $db->buildLike( $this->titlePartToKey( + $params['prefix'], $namespace ), $db->anyString() ) ); } $this->addFields( array( 'pl_title' => $pfx . $fieldTitle ) ); $this->addFieldsIf( array( 'pl_from' => $pfx . 'from' ), !$params['unique'] ); + foreach ( $this->props as $name => $field ) { + $this->addFieldsIf( $field, isset( $prop[$name] ) ); + } - if ( $this->hasNamespace ) { - $this->addOption( 'USE INDEX', $pfx . 'namespace' ); + if ( $this->useIndex ) { + $this->addOption( 'USE INDEX', $this->useIndex ); } $limit = $params['limit']; $this->addOption( 'LIMIT', $limit + 1 ); @@ -177,8 +210,9 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { $count = 0; $result = $this->getResult(); foreach ( $res as $row ) { - if ( ++ $count > $limit ) { - // We've reached the one extra which shows that there are additional pages to be had. Stop here... + if ( ++$count > $limit ) { + // We've reached the one extra which shows that there are + // additional pages to be had. Stop here... if ( $params['unique'] ) { $this->setContinueEnumParameter( 'continue', $row->pl_title ); } else { @@ -196,6 +230,11 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { $title = Title::makeTitle( $namespace, $row->pl_title ); ApiQueryBase::addTitleInfo( $vals, $title ); } + foreach ( $this->props as $name => $field ) { + if ( isset( $prop[$name] ) && $row->$field !== null && $row->$field !== '' ) { + $vals[$name] = $row->$field; + } + } $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals ); if ( !$fit ) { if ( $params['unique'] ) { @@ -231,10 +270,9 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { 'prop' => array( ApiBase::PARAM_ISMULTI => true, ApiBase::PARAM_DFLT => 'title', - ApiBase::PARAM_TYPE => array( - 'ids', - 'title' - ) + ApiBase::PARAM_TYPE => array_merge( + array( 'ids', 'title' ), array_keys( $this->props ) + ), ), 'namespace' => array( ApiBase::PARAM_DFLT => $this->dfltNamespace, @@ -258,6 +296,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { if ( !$this->hasNamespace ) { unset( $allowedParams['namespace'] ); } + return $allowedParams; } @@ -271,68 +310,55 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase { 'to' => "The title of the $what to stop enumerating at", 'prefix' => "Search for all $targets that begin with this value", 'unique' => array( - "Only show distinct $targets. Cannot be used with {$p}prop=ids.", + "Only show distinct $targets. Cannot be used with {$p}prop=" . + join( '|', array_keys( array( 'ids' => 1 ) + $this->props ) ) . '.', 'When used as a generator, yields target pages instead of source pages.', ), 'prop' => array( 'What pieces of information to include', - " ids - Adds the pageid of the $linking page (Cannot be used with {$p}unique)", - " title - Adds the title of the $what", + " ids - Adds the pageid of the $linking page (Cannot be used with {$p}unique)", + " title - Adds the title of the $what", ), 'namespace' => 'The namespace to enumerate', 'limit' => 'How many total items to return', 'continue' => 'When more results are available, use this to continue', 'dir' => 'The direction in which to list', ); + foreach ( $this->propHelp as $help ) { + $paramDescription['prop'][] = "$help (Cannot be used with {$p}unique)"; + } if ( !$this->hasNamespace ) { unset( $paramDescription['namespace'] ); } - return $paramDescription; - } - public function getResultProperties() { - return array( - 'ids' => array( - 'fromid' => 'integer' - ), - 'title' => array( - 'ns' => 'namespace', - 'title' => 'string' - ) - ); + return $paramDescription; } public function getDescription() { return $this->description; } - public function getPossibleErrors() { - $m = $this->getModuleName(); - $what = $this->descriptionWhat; - return array_merge( parent::getPossibleErrors(), array( - array( 'code' => 'params', 'info' => "{$m} cannot return corresponding page ids in unique {$what}s mode" ), - ) ); - } - public function getExamples() { $p = $this->getModulePrefix(); $name = $this->getModuleName(); $what = $this->descriptionWhat; $targets = $this->descriptionTargets; + return array( "api.php?action=query&list={$name}&{$p}from=B&{$p}prop=ids|title" - => "List $targets with page ids they are from, including missing ones. Start at B", + => "List $targets with page ids they are from, including missing ones. Start at B", "api.php?action=query&list={$name}&{$p}unique=&{$p}from=B" - => "List unique $targets", + => "List unique $targets", "api.php?action=query&generator={$name}&g{$p}unique=&g{$p}from=B" - => "Gets all $targets, marking the missing ones", + => "Gets all $targets, marking the missing ones", "api.php?action=query&generator={$name}&g{$p}from=B" - => "Gets pages containing the {$what}s", + => "Gets pages containing the {$what}s", ); } public function getHelpUrls() { $name = ucfirst( $this->getModuleName() ); + return "https://www.mediawiki.org/wiki/API:{$name}"; } } -- cgit v1.2.2