]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - includes/api/ApiQuerySearch.php
MediaWiki 1.15.5
[autoinstallsdev/mediawiki.git] / includes / api / ApiQuerySearch.php
1 <?php
2
3 /*
4  * Created on July 30, 2007
5  *
6  * API for MediaWiki 1.8+
7  *
8  * Copyright (C) 2007 Yuri Astrakhan <Firstname><Lastname>@gmail.com
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 perform full text search within wiki titles and content
33  *
34  * @ingroup API
35  */
36 class ApiQuerySearch extends ApiQueryGeneratorBase {
37
38         public function __construct($query, $moduleName) {
39                 parent :: __construct($query, $moduleName, 'sr');
40         }
41
42         public function execute() {
43                 $this->run();
44         }
45
46         public function executeGenerator($resultPageSet) {
47                 $this->run($resultPageSet);
48         }
49
50         private function run($resultPageSet = null) {
51
52                 $params = $this->extractRequestParams();
53
54                 $limit = $params['limit'];
55                 $query = $params['search'];
56                 $what = $params['what'];
57                 if (strval($query) === '')
58                         $this->dieUsage("empty search string is not allowed", 'param-search');
59
60                 $search = SearchEngine::create();
61                 $search->setLimitOffset( $limit+1, $params['offset'] );
62                 $search->setNamespaces( $params['namespace'] );
63                 $search->showRedirects = $params['redirects'];
64
65                 if ($what == 'text') {
66                         $matches = $search->searchText( $query );
67                 } elseif( $what == 'title' ) {
68                         $matches = $search->searchTitle( $query );
69                 } else {
70                         // We default to title searches; this is a terrible legacy
71                         // of the way we initially set up the MySQL fulltext-based
72                         // search engine with separate title and text fields.
73                         // In the future, the default should be for a combined index.
74                         $what = 'title';
75                         $matches = $search->searchTitle( $query );
76                         
77                         // Not all search engines support a separate title search,
78                         // for instance the Lucene-based engine we use on Wikipedia.
79                         // In this case, fall back to full-text search (which will
80                         // include titles in it!)
81                         if( is_null( $matches ) ) {
82                                 $what = 'text';
83                                 $matches = $search->searchText( $query );
84                         }
85                 }
86                 if (is_null($matches))
87                         $this->dieUsage("{$what} search is disabled",
88                                         "search-{$what}-disabled");
89
90                 $titles = array ();
91                 $count = 0;
92                 while( $result = $matches->next() ) {
93                         if (++ $count > $limit) {
94                                 // We've reached the one extra which shows that there are additional items to be had. Stop here...
95                                 $this->setContinueEnumParameter('offset', $params['offset'] + $params['limit']);
96                                 break;
97                         }
98
99                         // Silently skip broken and missing titles
100                         if ($result->isBrokenTitle() || $result->isMissingRevision())
101                                 continue;
102                         
103                         $title = $result->getTitle();
104                         if (is_null($resultPageSet)) {
105                                 $vals = array();
106                                 ApiQueryBase::addTitleInfo($vals, $title);
107                                 $fit = $this->getResult()->addValue(array('query', $this->getModuleName()), null, $vals);
108                                 if(!$fit)
109                                 {
110                                         $this->setContinueEnumParameter('offset', $params['offset'] + $count - 1);
111                                         break;
112                                 }
113                         } else {
114                                 $titles[] = $title;
115                         }
116                 }
117
118                 if (is_null($resultPageSet)) {
119                         $this->getResult()->setIndexedTagName_internal(array('query', $this->getModuleName()), 'p');
120                 } else {
121                         $resultPageSet->populateFromTitles($titles);
122                 }
123         }
124
125         public function getCacheMode( $params ) {
126                 return 'public';
127         }
128
129         public function getAllowedParams() {
130                 return array (
131                         'search' => null,
132                         'namespace' => array (
133                                 ApiBase :: PARAM_DFLT => 0,
134                                 ApiBase :: PARAM_TYPE => 'namespace',
135                                 ApiBase :: PARAM_ISMULTI => true,
136                         ),
137                         'what' => array (
138                                 ApiBase :: PARAM_DFLT => null,
139                                 ApiBase :: PARAM_TYPE => array (
140                                         'title',
141                                         'text',
142                                 )
143                         ),
144                         'redirects' => false,
145                         'offset' => 0,
146                         'limit' => array (
147                                 ApiBase :: PARAM_DFLT => 10,
148                                 ApiBase :: PARAM_TYPE => 'limit',
149                                 ApiBase :: PARAM_MIN => 1,
150                                 ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1,
151                                 ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
152                         )
153                 );
154         }
155
156         public function getParamDescription() {
157                 return array (
158                         'search' => 'Search for all page titles (or content) that has this value.',
159                         'namespace' => 'The namespace(s) to enumerate.',
160                         'what' => 'Search inside the text or titles.',
161                         'redirects' => 'Include redirect pages in the search.',
162                         'offset' => 'Use this value to continue paging (return by query)',
163                         'limit' => 'How many total pages to return.'
164                 );
165         }
166
167         public function getDescription() {
168                 return 'Perform a full text search';
169         }
170
171         protected function getExamples() {
172                 return array (
173                         'api.php?action=query&list=search&srsearch=meaning',
174                         'api.php?action=query&list=search&srwhat=text&srsearch=meaning',
175                         'api.php?action=query&generator=search&gsrsearch=meaning&prop=info',
176                 );
177         }
178
179         public function getVersion() {
180                 return __CLASS__ . ': $Id: ApiQuerySearch.php 69986 2010-07-27 03:57:39Z tstarling $';
181         }
182 }