]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - includes/api/ApiQueryRandom.php
MediaWiki 1.15.1-scripts
[autoinstalls/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(&$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                                         $fit = $this->getResult()->addValue(
77                                                         array('query', $this->getModuleName()),
78                                                         null, $this->extractRowInfo($row));
79                                         if(!$fit)
80                                                 # We can't really query-continue a random list.
81                                                 # Return an insanely high value so
82                                                 # $count < $limit is false
83                                                 return 1E9;
84                                         $this->pageIDs[] = $row->page_id;
85                                 }
86                         }
87                         else
88                                 $resultPageSet->processDbRow($row);
89                 }
90                 $db->freeResult($res);
91                 return $count;
92         }
93
94         public function run($resultPageSet = null) {
95                 $params = $this->extractRequestParams();
96                 $result = $this->getResult();
97                 $this->pageIDs = array();
98                 
99                 $this->prepareQuery(wfRandom(), $params['limit'], $params['namespace'], $resultPageSet, $params['redirect']);
100                 $count = $this->runQuery($resultPageSet);
101                 if($count < $params['limit'])
102                 {
103                         /* We got too few pages, we probably picked a high value
104                          * for page_random. We'll just take the lowest ones, see
105                          * also the comment in Title::getRandomTitle()
106                          */
107                          $this->prepareQuery(0, $params['limit'] - $count, $params['namespace'], $resultPageSet, $params['redirect']);
108                          $this->runQuery($resultPageSet);
109                 }
110
111                 if(is_null($resultPageSet)) {
112                         $result->setIndexedTagName_internal(array('query', $this->getModuleName()), 'page');
113                 }
114         }
115
116         private function extractRowInfo($row) {
117                 $title = Title::makeTitle($row->page_namespace, $row->page_title);
118                 $vals = array();
119                 $vals['id'] = intval($row->page_id);
120                 ApiQueryBase::addTitleInfo($vals, $title);
121                 return $vals;
122         }
123
124         public function getAllowedParams() {
125                 return array (
126                         'namespace' => array(
127                                 ApiBase :: PARAM_TYPE => 'namespace',
128                                 ApiBase :: PARAM_ISMULTI => true
129                         ),
130                         'limit' => array (
131                                 ApiBase :: PARAM_TYPE => 'limit',
132                                 ApiBase :: PARAM_DFLT => 1,
133                                 ApiBase :: PARAM_MIN => 1,
134                                 ApiBase :: PARAM_MAX => 10,
135                                 ApiBase :: PARAM_MAX2 => 20
136                         ),
137                         'redirect' => false,
138                 );
139         }
140
141         public function getParamDescription() {
142                 return array (
143                         'namespace' => 'Return pages in these namespaces only',
144                         'limit' => 'Limit how many random pages will be returned',
145                         'redirect' => 'Load a random redirect instead of a random page'
146                 );
147         }
148
149         public function getDescription() {
150                 return array(   'Get a set of random pages',
151                                 '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 ',
152                                 '      random page on your list, "List of fictional monkeys" will *always* be second, "List of people on stamps of Vanuatu" third, etc.',
153                                 '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.'
154                 );
155         }
156
157         protected function getExamples() {
158                 return 'api.php?action=query&list=random&rnnamespace=0&rnlimit=2';
159         }
160
161         public function getVersion() {
162                 return __CLASS__ . ': $Id: ApiQueryRandom.php overlordq$';
163         }
164 }