From a048101d7604543e8f502b9971c0517a0bba4a1a Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Mon, 21 May 2007 05:25:36 +0000 Subject: [PATCH] API: added query parameter indexpageids to list the page ids of all returned page items (bug 9121) --- RELEASE-NOTES | 1 + includes/api/ApiQuery.php | 105 ++++++++++++++++++++-------------- includes/api/ApiQueryBase.php | 2 +- 3 files changed, 64 insertions(+), 44 deletions(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index e3b11d7788..81546e1d23 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -104,6 +104,7 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN the textid (rev_text_id) is no longer being exposed * breaking change: backlinks, embeddedin & imageusage now return lists in json instead of a map, and do not return anything when titles do not exist. (bug 9970) +* added query parameter indexpageids to list the page ids of all returned page items (bug 9121) == Maintenance script changes since 1.10 == diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php index b3e05672db..e028481cfa 100644 --- a/includes/api/ApiQuery.php +++ b/includes/api/ApiQuery.php @@ -43,6 +43,7 @@ class ApiQuery extends ApiBase { private $mPropModuleNames, $mListModuleNames, $mMetaModuleNames; private $mPageSet; + private $params, $redirect; private $mQueryPropModules = array ( 'info' => 'ApiQueryInfo', @@ -86,22 +87,9 @@ class ApiQuery extends ApiBase { // Allow custom modules to be added in LocalSettings.php global $wgApiQueryPropModules, $wgApiQueryListModules, $wgApiQueryMetaModules; - - if (is_array( $wgApiQueryPropModules )) { - foreach ( $wgApiQueryPropModules as $moduleName => $moduleClass) { - $this->mQueryPropModules[$moduleName] = $moduleClass; - } - } - if (is_array( $wgApiQueryListModules )) { - foreach ( $wgApiQueryListModules as $moduleName => $moduleClass) { - $this->mQueryListModules[$moduleName] = $moduleClass; - } - } - if (is_array( $wgApiQueryMetaModules )) { - foreach ( $wgApiQueryMetaModules as $moduleName => $moduleClass) { - $this->mQueryMetaModules[$moduleName] = $moduleClass; - } - } + self :: appendUserModules($this->mQueryPropModules, $wgApiQueryPropModules); + self :: appendUserModules($this->mQueryListModules, $wgApiQueryListModules); + self :: appendUserModules($this->mQueryMetaModules, $wgApiQueryMetaModules); $this->mPropModuleNames = array_keys($this->mQueryPropModules); $this->mListModuleNames = array_keys($this->mQueryListModules); @@ -112,6 +100,14 @@ class ApiQuery extends ApiBase { $this->mAllowedGenerators = array_merge($this->mListModuleNames, $this->mPropModuleNames); } + private static function appendUserModules(&$modules, $newModules) { + if (is_array( $newModules )) { + foreach ( $newModules as $moduleName => $moduleClass) { + $modules[$moduleName] = $moduleClass; + } + } + } + public function getDB() { if (!isset ($this->mSlaveDB)) { $this->profileDBIn(); @@ -151,25 +147,21 @@ class ApiQuery extends ApiBase { * #5 Execute all requested modules */ public function execute() { - $prop = $list = $meta = $generator = $redirects = null; - extract($this->extractRequestParams()); - + + $this->params = $this->extractRequestParams(); + // // Create PageSet // - $this->mPageSet = new ApiPageSet($this, $redirects); + $this->mPageSet = new ApiPageSet($this, $this->redirects); - // Instantiate required modules + // + // Instantiate requested modules + // $modules = array (); - if (isset ($prop)) - foreach ($prop as $moduleName) - $modules[] = new $this->mQueryPropModules[$moduleName] ($this, $moduleName); - if (isset ($list)) - foreach ($list as $moduleName) - $modules[] = new $this->mQueryListModules[$moduleName] ($this, $moduleName); - if (isset ($meta)) - foreach ($meta as $moduleName) - $modules[] = new $this->mQueryMetaModules[$moduleName] ($this, $moduleName); + $this->InstantiateModules($modules, 'prop', $this->mQueryPropModules); + $this->InstantiateModules($modules, 'list', $this->mQueryListModules); + $this->InstantiateModules($modules, 'meta', $this->mQueryMetaModules); // Modules may optimize data requests through the $this->getPageSet() object // Execute all requested modules. @@ -185,8 +177,8 @@ class ApiQuery extends ApiBase { // // If given, execute generator to substitute user supplied data with generated data. // - if (isset ($generator)) - $this->executeGeneratorModule($generator, $redirects); + if (isset ($this->params['generator'])) + $this->executeGeneratorModule($this->params['generator']); // // Record page information (title, namespace, if exists, etc) @@ -203,6 +195,16 @@ class ApiQuery extends ApiBase { } } + /** + * Create instances of all modules requested by the client + */ + private function InstantiateModules(&$modules, $param, $moduleList) { + $list = $this->params[$param]; + if (isset ($list)) + foreach ($list as $moduleName) + $modules[] = new $moduleList[$moduleName] ($this, $moduleName); + } + private function outputGeneralPageInfo() { $pageSet = $this->getPageSet(); @@ -259,8 +261,10 @@ class ApiQuery extends ApiBase { // Report any missing titles $fakepageid = -1; foreach ($pageSet->getMissingTitles() as $title) { - $pages[$fakepageid--] = array ( - 'ns' => $title->getNamespace(), 'title' => $title->getPrefixedText(), 'missing' => ''); + $vals = array(); + ApiQueryBase :: addTitleInfo($vals, $title, true); + $vals['missing'] = ''; + $pages[$fakepageid--] = $vals; } // Report any missing page ids @@ -273,31 +277,40 @@ class ApiQuery extends ApiBase { // Output general page information for found titles foreach ($pageSet->getGoodTitles() as $pageid => $title) { - $pages[$pageid] = array ( - 'pageid' => $pageid, - 'ns' => $title->getNamespace(), 'title' => $title->getPrefixedText()); + $vals = array(); + $vals['pageid'] = $pageid; + ApiQueryBase :: addTitleInfo($vals, $title, true); + $pages[$pageid] = $vals; } if (!empty ($pages)) { + + if ($this->params['indexpageids']) { + $pageIDs = array_keys($pages); + // json treats all map keys as strings - converting to match + $pageIDs = array_map('strval', $pageIDs); + $result->setIndexedTagName($pageIDs, 'id'); + $result->addValue('query', 'pageids', $pageIDs); + } + $result->setIndexedTagName($pages, 'page'); $result->addValue('query', 'pages', $pages); } } - protected function executeGeneratorModule($generatorName, $redirects) { + protected function executeGeneratorModule($generatorName) { // Find class that implements requested generator if (isset ($this->mQueryListModules[$generatorName])) { $className = $this->mQueryListModules[$generatorName]; - } - elseif (isset ($this->mQueryPropModules[$generatorName])) { + } elseif (isset ($this->mQueryPropModules[$generatorName])) { $className = $this->mQueryPropModules[$generatorName]; } else { ApiBase :: dieDebug(__METHOD__, "Unknown generator=$generatorName"); } // Generator results - $resultPageSet = new ApiPageSet($this, $redirects); + $resultPageSet = new ApiPageSet($this, $this->redirects); // Create and execute the generator $generator = new $className ($this, $generatorName); @@ -317,6 +330,10 @@ class ApiQuery extends ApiBase { $this->mPageSet = $resultPageSet; } + /** + * Returns the list of allowed parameters for this module. + * Qurey module also lists all ApiPageSet parameters as its own. + */ protected function getAllowedParams() { return array ( 'prop' => array ( @@ -334,7 +351,8 @@ class ApiQuery extends ApiBase { 'generator' => array ( ApiBase :: PARAM_TYPE => $this->mAllowedGenerators ), - 'redirects' => false + 'redirects' => false, + 'indexpageids' => false, ); } @@ -393,7 +411,8 @@ class ApiQuery extends ApiBase { 'list' => 'Which lists to get', 'meta' => 'Which meta data to get about the site', 'generator' => 'Use the output of a list as the input for other prop/list/meta items', - 'redirects' => 'Automatically resolve redirects' + 'redirects' => 'Automatically resolve redirects', + 'indexpageids' => 'Include an additional pageids section listing all returned page IDs.' ); } diff --git a/includes/api/ApiQueryBase.php b/includes/api/ApiQueryBase.php index 75185df09e..d74822051d 100644 --- a/includes/api/ApiQueryBase.php +++ b/includes/api/ApiQueryBase.php @@ -128,7 +128,7 @@ abstract class ApiQueryBase extends ApiBase { return $res; } - protected static function addTitleInfo(&$arr, $title, $includeRestricted=false, $prefix='') { + public static function addTitleInfo(&$arr, $title, $includeRestricted=false, $prefix='') { if ($includeRestricted || $title->userCanRead()) { $arr[$prefix . 'ns'] = intval($title->getNamespace()); $arr[$prefix . 'title'] = $title->getPrefixedText(); -- 2.20.1