MediaWiki  master
SearchApi.php
Go to the documentation of this file.
1 <?php
2 
4 
29 trait SearchApi {
30 
37  private static $BACKEND_NULL_PARAM = 'database-backed';
38 
47  public function buildCommonApiParams( $isScrollable = true ) {
48  $params = [
49  'search' => [
50  ApiBase::PARAM_TYPE => 'string',
52  ],
53  'namespace' => [
55  ApiBase::PARAM_TYPE => 'namespace',
56  ApiBase::PARAM_ISMULTI => true,
57  ],
58  'limit' => [
59  ApiBase::PARAM_DFLT => 10,
60  ApiBase::PARAM_TYPE => 'limit',
61  ApiBase::PARAM_MIN => 1,
64  ],
65  ];
66  if ( $isScrollable ) {
67  $params['offset'] = [
69  ApiBase::PARAM_TYPE => 'integer',
70  ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
71  ];
72  }
73 
74  $searchConfig = MediaWikiServices::getInstance()->getSearchEngineConfig();
75  $alternatives = $searchConfig->getSearchTypes();
76  if ( count( $alternatives ) > 1 ) {
77  if ( $alternatives[0] === null ) {
78  $alternatives[0] = self::$BACKEND_NULL_PARAM;
79  }
80  $params['backend'] = [
81  ApiBase::PARAM_DFLT => $searchConfig->getSearchType(),
82  ApiBase::PARAM_TYPE => $alternatives,
83  ];
84  // @todo: support profile selection when multiple
85  // backends are available. The solution could be to
86  // merge all possible profiles and let ApiBase
87  // subclasses do the check. Making ApiHelp and ApiSandbox
88  // comprehensive might be more difficult.
89  } else {
90  $params += $this->buildProfileApiParam();
91  }
92 
93  return $params;
94  }
95 
104  private function buildProfileApiParam() {
105  $configs = $this->getSearchProfileParams();
106  $searchEngine = MediaWikiServices::getInstance()->newSearchEngine();
107  $params = [];
108  foreach ( $configs as $paramName => $paramConfig ) {
109  $profiles = $searchEngine->getProfiles( $paramConfig['profile-type'],
110  $this->getContext()->getUser() );
111  if ( !$profiles ) {
112  continue;
113  }
114 
115  $types = [];
116  $helpMessages = [];
117  $defaultProfile = null;
118  foreach ( $profiles as $profile ) {
119  $types[] = $profile['name'];
120  if ( isset( $profile['desc-message'] ) ) {
121  $helpMessages[$profile['name']] = $profile['desc-message'];
122  }
123 
124  if ( !empty( $profile['default'] ) ) {
125  $defaultProfile = $profile['name'];
126  }
127  }
128 
129  $params[$paramName] = [
130  ApiBase::PARAM_TYPE => $types,
131  ApiBase::PARAM_HELP_MSG => $paramConfig['help-message'],
132  ApiBase::PARAM_HELP_MSG_PER_VALUE => $helpMessages,
133  ApiBase::PARAM_DFLT => $defaultProfile,
134  ];
135  }
136 
137  return $params;
138  }
139 
153  public function buildSearchEngine( array $params = null ) {
154  if ( $params != null ) {
155  $type = $params['backend'] ?? null;
156  if ( $type === self::$BACKEND_NULL_PARAM ) {
157  $type = null;
158  }
159  $searchEngine = MediaWikiServices::getInstance()->getSearchEngineFactory()->create( $type );
160  $limit = $params['limit'];
161  $searchEngine->setNamespaces( $params['namespace'] );
162  $offset = $params['offset'] ?? null;
163  $searchEngine->setLimitOffset( $limit, $offset );
164 
165  // Initialize requested search profiles.
166  $configs = $this->getSearchProfileParams();
167  foreach ( $configs as $paramName => $paramConfig ) {
168  if ( isset( $params[$paramName] ) ) {
169  $searchEngine->setFeatureData(
170  $paramConfig['profile-type'],
171  $params[$paramName]
172  );
173  }
174  }
175  } else {
176  $searchEngine = MediaWikiServices::getInstance()->newSearchEngine();
177  }
178  return $searchEngine;
179  }
180 
185  abstract public function getSearchProfileParams();
186 
190  abstract public function getContext();
191 }
const PARAM_TYPE
(string|string[]) Either an array of allowed value strings, or a string type as described below...
Definition: ApiBase.php:94
const LIMIT_BIG2
Fast query, apihighlimits limit.
Definition: ApiBase.php:261
const NS_MAIN
Definition: Defines.php:60
getSearchProfileParams()
const PARAM_DFLT
(null|boolean|integer|string) Default value of the parameter.
Definition: ApiBase.php:55
const LIMIT_BIG1
Fast query, standard limit.
Definition: ApiBase.php:259
buildCommonApiParams( $isScrollable=true)
The set of api parameters that are shared between api calls that call the SearchEngine.
Definition: SearchApi.php:47
const PARAM_MAX
(integer) Max value allowed for the parameter, for PARAM_TYPE &#39;integer&#39; and &#39;limit&#39;.
Definition: ApiBase.php:97
const PARAM_REQUIRED
(boolean) Is the parameter required?
Definition: ApiBase.php:118
const PARAM_HELP_MSG_PER_VALUE
((string|array|Message)[]) When PARAM_TYPE is an array, this is an array mapping those values to $msg...
Definition: ApiBase.php:164
getContext()
const PARAM_MAX2
(integer) Max value allowed for the parameter for users with the apihighlimits right, for PARAM_TYPE &#39;limit&#39;.
Definition: ApiBase.php:103
getUser()
const PARAM_HELP_MSG
(string|array|Message) Specify an alternative i18n documentation message for this parameter...
Definition: ApiBase.php:131
buildSearchEngine(array $params=null)
Build the search engine to use.
Definition: SearchApi.php:153
buildProfileApiParam()
Build the profile api param definitions.
Definition: SearchApi.php:104
const PARAM_ISMULTI
(boolean) Accept multiple pipe-separated values for this parameter (e.g.
Definition: ApiBase.php:58
const PARAM_MIN
(integer) Lowest value allowed for the parameter, for PARAM_TYPE &#39;integer&#39; and &#39;limit&#39;.
Definition: ApiBase.php:106