]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - includes/api/ApiQueryRandom.php
MediaWiki 1.14.0
[autoinstallsdev/mediawiki.git] / includes / api / ApiQueryRandom.php
1 <?php
2
3 /*
4  * Created on Monday, January 28, 2008
5  *
6  * API for MediaWiki 1.8+
7  *
8  * Copyright (C) 2008 Brent Garber
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License along
21  * with this program; if not, write to the Free Software Foundation, Inc.,
22  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23  * http://www.gnu.org/copyleft/gpl.html
24  */
25
26 if (!defined('MEDIAWIKI')) {
27         // Eclipse helper - will be ignored in production
28         require_once ('ApiQueryBase.php');
29 }
30
31 /**
32  * Query module to get list of random pages
33  *
34  * @ingroup API
35  */
36
37  class ApiQueryRandom extends ApiQueryGeneratorBase {
38
39         public function __construct($query, $moduleName) {
40                 parent :: __construct($query, $moduleName, 'rn');
41         }
42
43         public function execute() {
44                 $this->run();
45         }
46
47         public function executeGenerator($resultPageSet) {
48                 $this->run($resultPageSet);
49         }
50
51         protected function prepareQuery($randstr, $limit, $namespace, &$resultPageSet, $redirect) {
52                 $this->resetQueryParams();
53                 $this->addTables('page');
54                 $this->addOption('LIMIT', $limit);
55                 $this->addWhereFld('page_namespace', $namespace);
56                 $this->addWhereRange('page_random', 'newer', $randstr, null);
57                 $this->addWhereFld('page_is_redirect', $redirect);
58                 $this->addOption('USE INDEX', 'page_random');
59                 if(is_null($resultPageSet))
60                         $this->addFields(array('page_id', 'page_title', 'page_namespace'));
61                 else
62                         $this->addFields($resultPageSet->getPageTableFields());
63         }
64
65         protected function runQuery(&$data, &$resultPageSet) {
66                 $db = $this->getDB();
67                 $res = $this->select(__METHOD__);
68                 $count = 0;
69                 while($row = $db->fetchObject($res)) {
70                         $count++;
71                         if(is_null($resultPageSet))
72                         {
73                                 // Prevent duplicates
74                                 if(!in_array($row->page_id, $this->pageIDs))
75                                 {
76                                         $data[] = $this->extractRowInfo($row);
77                                         $this->pageIDs[] = $row->page_id;
78                                 }
79                         }
80                         else
81                                 $resultPageSet->processDbRow($row);
82                 }
83                 $db->freeResult($res);
84                 return $count;
85         }
86
87         public function run($resultPageSet = null) {
88                 $params = $this->extractRequestParams();
89                 $result = $this->getResult();
90                 $data = array();
91                 $this->pageIDs = array();
92                 
93                 $this->prepareQuery(wfRandom(), $params['limit'], $params['namespace'], $resultPageSet, $params['redirect']);
94                 $count = $this->runQuery($data, $resultPageSet);
95                 if($count < $params['limit'])
96                 {
97                         /* We got too few pages, we probably picked a high value
98                          * for page_random. We'll just take the lowest ones, see
99                          * also the comment in Title::getRandomTitle()
100                          */
101                          $this->prepareQuery(0, $params['limit'] - $count, $params['namespace'], $resultPageSet, $params['redirect']);
102                          $this->runQuery($data, $resultPageSet);
103                 }
104
105                 if(is_null($resultPageSet)) {
106                         $result->setIndexedTagName($data, 'page');
107                         $result->addValue('query', $this->getModuleName(), $data);
108                 }
109         }
110
111         private function extractRowInfo($row) {
112                 $title = Title::makeTitle($row->page_namespace, $row->page_title);
113                 $vals = array();
114                 $vals['title'] = $title->getPrefixedText();
115                 $vals['ns'] = $row->page_namespace;
116                 $vals['id'] = $row->page_id;
117                 return $vals;
118         }
119
120         public function getAllowedParams() {
121                 return array (
122                         'namespace' => array(
123                                 ApiBase :: PARAM_TYPE => 'namespace',
124                                 ApiBase :: PARAM_ISMULTI => true
125                         ),
126                         'limit' => array (
127                                 ApiBase :: PARAM_TYPE => 'limit',
128                                 ApiBase :: PARAM_DFLT => 1,
129                                 ApiBase :: PARAM_MIN => 1,
130                                 ApiBase :: PARAM_MAX => 10,
131                                 ApiBase :: PARAM_MAX2 => 20
132                         ),
133                         'redirect' => false,
134                 );
135         }
136
137         public function getParamDescription() {
138                 return array (
139                         'namespace' => 'Return pages in these namespaces only',
140                         'limit' => 'Limit how many random pages will be returned',
141                         'redirect' => 'Load a random redirect instead of a random page'
142                 );
143         }
144
145         public function getDescription() {
146                 return array(   'Get a set of random pages',
147                                 'NOTE: Pages are listed in a fixed sequence, only the starting point is random. This means that if, for example, "Main Page" is the first ',
148                                 '      random page on your list, "List of fictional monkeys" will *always* be second, "List of people on stamps of Vanuatu" third, etc.',
149                                 'NOTE: If the number of pages in the namespace is lower than rnlimit, you will get fewer pages. You will not get the same page twice.'
150                 );
151         }
152
153         protected function getExamples() {
154                 return 'api.php?action=query&list=random&rnnamespace=0&rnlimit=2';
155         }
156
157         public function getVersion() {
158                 return __CLASS__ . ': $Id: ApiQueryRandom.php overlordq$';
159         }
160 }