(bug 12816) Adding list=random module which fetches a list of random pages. Based...
authorRoan Kattouw <catrope@users.mediawiki.org>
Mon, 28 Jan 2008 13:56:20 +0000 (13:56 +0000)
committerRoan Kattouw <catrope@users.mediawiki.org>
Mon, 28 Jan 2008 13:56:20 +0000 (13:56 +0000)
RELEASE-NOTES
includes/AutoLoader.php
includes/api/ApiQuery.php
includes/api/ApiQueryRandom.php [new file with mode: 0644]

index 4488c69..86ad332 100644 (file)
@@ -473,6 +473,7 @@ Full API documentation is available at http://www.mediawiki.org/wiki/API
 * Added format=txt and format=dbg, imported from query.php
 * Added uiprop=editcount to meta=userinfo
 * Added list=users which fetches user information
+* Added list=random which fetches a list of random pages
 
 === Languages updated in 1.12 ===
 
index e7c9f1b..3d34909 100644 (file)
@@ -351,6 +351,7 @@ function __autoload($className) {
                'ApiQueryLangLinks' => 'includes/api/ApiQueryLangLinks.php',
                'ApiQueryLinks' => 'includes/api/ApiQueryLinks.php',
                'ApiQueryLogEvents' => 'includes/api/ApiQueryLogEvents.php',
+               'ApiQueryRandom' => 'includes/api/ApiQueryRandom.php',
                'ApiQueryRecentChanges'=> 'includes/api/ApiQueryRecentChanges.php',
                'ApiQueryRevisions' => 'includes/api/ApiQueryRevisions.php',
                'ApiQuerySearch' => 'includes/api/ApiQuerySearch.php',
index 5f6c88b..57d29bf 100644 (file)
@@ -75,6 +75,7 @@ class ApiQuery extends ApiBase {
                'watchlist' => 'ApiQueryWatchlist',
                'exturlusage' => 'ApiQueryExtLinksUsage',
                'users' => 'ApiQueryUsers',
+               'random' => 'ApiQueryRandom',
        );
 
        private $mQueryMetaModules = array (
diff --git a/includes/api/ApiQueryRandom.php b/includes/api/ApiQueryRandom.php
new file mode 100644 (file)
index 0000000..5741ed5
--- /dev/null
@@ -0,0 +1,129 @@
+<?php\r
+\r
+/*\r
+ * Created on Monday, January 28, 2008\r
+ *\r
+ * API for MediaWiki 1.8+\r
+ *\r
+ * Copyright (C) 2008 Brent Garber\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along\r
+ * with this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+ * http://www.gnu.org/copyleft/gpl.html\r
+ */\r
+\r
+if (!defined('MEDIAWIKI')) {\r
+       // Eclipse helper - will be ignored in production\r
+       require_once ('ApiQueryBase.php');\r
+}\r
+\r
+/**\r
+ * Query module to get list of random pages\r
+ * \r
+ * @addtogroup API\r
+ */\r
\r
+ class ApiQueryRandom extends ApiQueryGeneratorBase {\r
+\r
+       public function __construct($query, $moduleName) {\r
+               parent :: __construct($query, $moduleName, 'rn');\r
+       }\r
+       \r
+       public function execute() {\r
+               $this->run();\r
+       }\r
+       \r
+       public function executeGenerator($resultPageSet) {\r
+               $this->run($resultPageSet);\r
+       }\r
+\r
+       public function run($resultPageSet = null) {\r
+               $params = $this->extractRequestParams();\r
+               $result = $this->getResult();\r
+               $randstr = wfRandom();\r
+               $data = array();\r
+\r
+               $this->addTables('page');\r
+               $this->addOption('LIMIT', $params['limit']);\r
+               $this->addWhereFld('page_namespace', $params['namespace']);\r
+               $this->addWhereRange('page_random', 'newer', $randstr, null);\r
+               $this->addWhere(array('page_is_redirect' => 0));\r
+               $this->addOption('USE INDEX', 'page_random');\r
+               if(is_null($resultPageSet))\r
+                       $this->addFields(array('page_id', 'page_title', 'page_namespace'));\r
+               else\r
+                       $this->addFields($resultPageSet->getPageTableFields());\r
+\r
+               $db = $this->getDB();\r
+               $res = $this->select(__METHOD__);\r
+               while($row = $db->fetchObject($res)) {\r
+                       if(is_null($resultPageSet))\r
+                               $data[] = $this->extractRowInfo($row);\r
+                       else\r
+                               $resultPageSet->processDbRow($row);\r
+               }\r
+               $db->freeResult($res);\r
+\r
+               if(is_null($resultPageSet)) {\r
+                       $result->setIndexedTagName($data, 'page');\r
+                       $result->addValue('query', $this->getModuleName(), $data);\r
+               }               \r
+       }\r
+\r
+       private function extractRowInfo($row) {\r
+               $title = Title::makeTitle($row->page_namespace, $row->page_title);\r
+               $vals = array();\r
+               $vals['title'] = $title->getPrefixedText();\r
+               $vals['ns'] = $row->page_namespace;\r
+               $vals['id'] = $row->page_id;\r
+               return $vals;\r
+       }\r
+               \r
+       protected function getAllowedParams() {\r
+               return array (\r
+                       'namespace' => array(\r
+                               ApiBase :: PARAM_TYPE => 'namespace',\r
+                               ApiBase :: PARAM_ISMULTI => true\r
+                       ),\r
+                       'limit' => array (\r
+                               ApiBase :: PARAM_TYPE => 'limit',\r
+                               ApiBase :: PARAM_DFLT => 1,\r
+                               ApiBase :: PARAM_MIN => 1,\r
+                               ApiBase :: PARAM_MAX => 10,\r
+                               ApiBase :: PARAM_MAX2 => 20\r
+                       ),\r
+               );\r
+       }\r
+\r
+       protected function getParamDescription() {\r
+               return array (\r
+                       'namespace' => 'Return pages in these namespaces only',\r
+                       'limit' => 'Limit how many random pages will be returned'\r
+               );\r
+       }\r
+\r
+       protected function getDescription() {\r
+               return array(   'Get a set of random pages',\r
+                               'NOTE: When using a namespace filter, this module may return an empty result. In that case, retry the request'\r
+               );\r
+       }\r
+\r
+       protected function getExamples() {\r
+               return 'api.php?action=query&list=random&rnnamespace=0&rnlimit=2';\r
+       }\r
+\r
+       public function getVersion() {\r
+               return __CLASS__ . ': $Id: ApiQueryRandom.php overlordq$';\r
+       }\r
+}\r