]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - includes/api/ApiQuerySearch.php
MediaWiki 1.14.0
[autoinstalls/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                 $data = 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                                 $data[] = array(
106                                         'ns' => intval($title->getNamespace()),
107                                         'title' => $title->getPrefixedText());
108                         } else {
109                                 $data[] = $title;
110                         }
111                 }
112
113                 if (is_null($resultPageSet)) {
114                         $result = $this->getResult();
115                         $result->setIndexedTagName($data, 'p');
116                         $result->addValue('query', $this->getModuleName(), $data);
117                 } else {
118                         $resultPageSet->populateFromTitles($data);
119                 }
120         }
121
122         public function getAllowedParams() {
123                 return array (
124                         'search' => null,
125                         'namespace' => array (
126                                 ApiBase :: PARAM_DFLT => 0,
127                                 ApiBase :: PARAM_TYPE => 'namespace',
128                                 ApiBase :: PARAM_ISMULTI => true,
129                         ),
130                         'what' => array (
131                                 ApiBase :: PARAM_DFLT => null,
132                                 ApiBase :: PARAM_TYPE => array (
133                                         'title',
134                                         'text',
135                                 )
136                         ),
137                         'redirects' => false,
138                         'offset' => 0,
139                         'limit' => array (
140                                 ApiBase :: PARAM_DFLT => 10,
141                                 ApiBase :: PARAM_TYPE => 'limit',
142                                 ApiBase :: PARAM_MIN => 1,
143                                 ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1,
144                                 ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
145                         )
146                 );
147         }
148
149         public function getParamDescription() {
150                 return array (
151                         'search' => 'Search for all page titles (or content) that has this value.',
152                         'namespace' => 'The namespace(s) to enumerate.',
153                         'what' => 'Search inside the text or titles.',
154                         'redirects' => 'Include redirect pages in the search.',
155                         'offset' => 'Use this value to continue paging (return by query)',
156                         'limit' => 'How many total pages to return.'
157                 );
158         }
159
160         public function getDescription() {
161                 return 'Perform a full text search';
162         }
163
164         protected function getExamples() {
165                 return array (
166                         'api.php?action=query&list=search&srsearch=meaning',
167                         'api.php?action=query&list=search&srwhat=text&srsearch=meaning',
168                         'api.php?action=query&generator=search&gsrsearch=meaning&prop=info',
169                 );
170         }
171
172         public function getVersion() {
173                 return __CLASS__ . ': $Id: ApiQuerySearch.php 44186 2008-12-03 19:33:57Z catrope $';
174         }
175 }