Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 51 |
|
0.00% |
0 / 8 |
CRAP | |
0.00% |
0 / 1 |
ConfigDump | |
0.00% |
0 / 51 |
|
0.00% |
0 / 8 |
342 | |
0.00% |
0 / 1 |
execute | |
0.00% |
0 / 12 |
|
0.00% |
0 / 1 |
42 | |||
addGlobals | |
0.00% |
0 / 4 |
|
0.00% |
0 / 1 |
12 | |||
addConcreteNamespaceMap | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
6 | |||
addReplicaGroup | |
0.00% |
0 / 2 |
|
0.00% |
0 / 1 |
2 | |||
addProfiles | |
0.00% |
0 / 5 |
|
0.00% |
0 / 1 |
6 | |||
addUserTesting | |
0.00% |
0 / 4 |
|
0.00% |
0 / 1 |
6 | |||
getAllowedParams | |
0.00% |
0 / 13 |
|
0.00% |
0 / 1 |
2 | |||
getExamplesMessages | |
0.00% |
0 / 4 |
|
0.00% |
0 / 1 |
2 |
1 | <?php |
2 | |
3 | namespace CirrusSearch\Api; |
4 | |
5 | use ApiBase; |
6 | use ApiResult; |
7 | use CirrusSearch\Profile\SearchProfileService; |
8 | use CirrusSearch\SearchConfig; |
9 | use CirrusSearch\UserTestingEngine; |
10 | use MediaWiki\MediaWikiServices; |
11 | use Wikimedia\ParamValidator\ParamValidator; |
12 | |
13 | /** |
14 | * Dumps CirrusSearch configuration for easy viewing. |
15 | * |
16 | * This program is free software; you can redistribute it and/or modify |
17 | * it under the terms of the GNU General Public License as published by |
18 | * the Free Software Foundation; either version 2 of the License, or |
19 | * (at your option) any later version. |
20 | * |
21 | * This program is distributed in the hope that it will be useful, |
22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
24 | * GNU General Public License for more details. |
25 | * |
26 | * You should have received a copy of the GNU General Public License along |
27 | * with this program; if not, write to the Free Software Foundation, Inc., |
28 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
29 | * http://www.gnu.org/copyleft/gpl.html |
30 | */ |
31 | class ConfigDump extends ApiBase { |
32 | use ApiTrait; |
33 | |
34 | public static $PUBLICLY_SHAREABLE_CONFIG_VARS = [ |
35 | 'CirrusSearchDisableUpdate', |
36 | 'CirrusSearchServers', |
37 | 'CirrusSearchConnectionAttempts', |
38 | 'CirrusSearchSlowSearch', |
39 | 'CirrusSearchUseExperimentalHighlighter', |
40 | 'CirrusSearchOptimizeIndexForExperimentalHighlighter', |
41 | 'CirrusSearchNamespaceMappings', |
42 | 'CirrusSearchExtraIndexes', |
43 | 'CirrusSearchExtraIndexClusters', |
44 | 'CirrusSearchFetchConfigFromApi', |
45 | 'CirrusSearchUpdateShardTimeout', |
46 | 'CirrusSearchClientSideUpdateTimeout', |
47 | 'CirrusSearchSearchShardTimeout', |
48 | 'CirrusSearchClientSizeSearchTimeout', |
49 | 'CirrusSearchMaintenanceTimeout', |
50 | 'CirrusSearchPrefixSearchStartsWithAnyWord', |
51 | 'CirrusSearchPhraseSlop', |
52 | 'CirrusSearchPhraseRescoreBoost', |
53 | 'CirrusSearchPhraseRescoreWindowSize', |
54 | 'CirrusSearchFunctionRescoreWindowSize', |
55 | 'CirrusSearchMoreAccurateScoringMode', |
56 | 'CirrusSearchPhraseSuggestUseText', |
57 | 'CirrusSearchPhraseSuggestUseOpeningText', |
58 | 'CirrusSearchIndexedRedirects', |
59 | 'CirrusSearchLinkedArticlesToUpdate', |
60 | 'CirrusSearchUnlikedArticlesToUpdate', |
61 | 'CirrusSearchWeights', |
62 | 'CirrusSearchAllFields', |
63 | 'CirrusSearchBoostOpening', |
64 | 'CirrusSearchNearMatchWeight', |
65 | 'CirrusSearchStemmedWeight', |
66 | 'CirrusSearchNamespaceWeights', |
67 | 'CirrusSearchDefaultNamespaceWeight', |
68 | 'CirrusSearchTalkNamespaceWeight', |
69 | 'CirrusSearchLanguageWeight', |
70 | 'CirrusSearchPreferRecentDefaultDecayPortion', |
71 | 'CirrusSearchPreferRecentUnspecifiedDecayPortion', |
72 | 'CirrusSearchPreferRecentDefaultHalfLife', |
73 | 'CirrusSearchMoreLikeThisConfig', |
74 | 'CirrusSearchInterwikiSources', |
75 | 'CirrusSearchRefreshInterval', |
76 | 'CirrusSearchFragmentSize', |
77 | 'CirrusSearchIndexAllocation', |
78 | 'CirrusSearchFullTextQueryBuilderProfile', |
79 | 'CirrusSearchRescoreProfile', |
80 | 'CirrusSearchPrefixSearchRescoreProfile', |
81 | 'CirrusSearchSimilarityProfile', |
82 | 'CirrusSearchCrossProjectProfiles', |
83 | 'CirrusSearchCrossProjectOrder', |
84 | 'CirrusSearchCrossProjectSearchBlockList', |
85 | 'CirrusSearchExtraIndexBoostTemplates', |
86 | 'CirrusSearchEnableCrossProjectSearch', |
87 | 'CirrusSearchEnableAltLanguage', |
88 | 'CirrusSearchEnableArchive', |
89 | 'CirrusSearchUseIcuFolding', |
90 | 'CirrusSearchUseIcuTokenizer', |
91 | 'CirrusSearchPhraseSuggestProfiles', |
92 | 'CirrusSearchCrossProjectBlockScorerProfiles', |
93 | 'CirrusSearchSimilarityProfiles', |
94 | 'CirrusSearchRescoreFunctionChains', |
95 | 'CirrusSearchCompletionProfiles', |
96 | 'CirrusSearchCompletionSettings', |
97 | 'CirrusSearchCompletionSuggesterUseDefaultSort', |
98 | // All the config below was added when moving this data |
99 | // from CirrusSearch config to a static array in this class |
100 | 'CirrusSearchDevelOptions', |
101 | 'CirrusSearchPrefixIds', |
102 | 'CirrusSearchMoreLikeThisFields', |
103 | 'CirrusSearchMoreLikeThisTTL', |
104 | 'CirrusSearchFiletypeAliases', |
105 | 'CirrusSearchDefaultCluster', |
106 | 'CirrusSearchClientSideConnectTimeout', |
107 | 'CirrusSearchClusters', |
108 | 'CirrusSearchReplicaGroup', |
109 | 'CirrusSearchExtraBackendLatency', |
110 | 'CirrusSearchAllowLeadingWildcard', |
111 | 'CirrusSearchClientSideSearchTimeout', |
112 | 'CirrusSearchStripQuestionMarks', |
113 | 'CirrusSearchFullTextQueryBuilderProfiles', |
114 | 'CirrusSearchEnableRegex', |
115 | 'CirrusSearchWikimediaExtraPlugin', |
116 | 'CirrusSearchRegexMaxDeterminizedStates', |
117 | 'CirrusSearchMaxIncategoryOptions', |
118 | 'CirrusSearchEnablePhraseSuggest', |
119 | 'CirrusSearchClusterOverrides', |
120 | 'CirrusSearchRescoreProfiles', |
121 | 'CirrusSearchRescoreFunctionScoreChains', |
122 | 'CirrusSearchNumCrossProjectSearchResults', |
123 | 'CirrusSearchLanguageToWikiMap', |
124 | 'CirrusSearchWikiToNameMap', |
125 | 'CirrusSearchIncLinksAloneW', |
126 | 'CirrusSearchIncLinksAloneK', |
127 | 'CirrusSearchIncLinksAloneA', |
128 | 'CirrusSearchNewCrossProjectPage', |
129 | 'CirrusSearchQueryStringMaxDeterminizedStates', |
130 | 'CirrusSearchElasticQuirks', |
131 | 'CirrusSearchPhraseSuggestMaxErrors', |
132 | 'CirrusSearchPhraseSuggestReverseField', |
133 | 'CirrusSearchBoostTemplates', |
134 | 'CirrusSearchIgnoreOnWikiBoostTemplates', |
135 | 'CirrusSearchAllFieldsForRescore', |
136 | 'CirrusSearchIndexBaseName', |
137 | 'CirrusSearchInterleaveConfig', |
138 | 'CirrusSearchMaxPhraseTokens', |
139 | 'LanguageCode', |
140 | 'ContentNamespaces', |
141 | 'NamespacesToBeSearchedDefault', |
142 | 'CirrusSearchCategoryDepth', |
143 | 'CirrusSearchCategoryMax', |
144 | 'CirrusSearchCategoryEndpoint', |
145 | 'CirrusSearchFallbackProfile', |
146 | 'CirrusSearchFallbackProfiles', |
147 | ]; |
148 | |
149 | public function execute() { |
150 | $result = $this->getResult(); |
151 | $props = array_flip( $this->extractRequestParams()[ 'prop' ] ); |
152 | if ( isset( $props['globals'] ) ) { |
153 | $this->addGlobals( $result ); |
154 | } |
155 | if ( isset( $props['namespacemap'] ) ) { |
156 | $this->addConcreteNamespaceMap( $result ); |
157 | } |
158 | if ( isset( $props['profiles'] ) ) { |
159 | $this->addProfiles( $result ); |
160 | } |
161 | if ( isset( $props['replicagroup'] ) ) { |
162 | $this->addReplicaGroup( $result ); |
163 | } |
164 | if ( isset( $props['usertesting'] ) ) { |
165 | $this->addUserTesting( $result ); |
166 | } |
167 | } |
168 | |
169 | protected function addGlobals( ApiResult $result ) { |
170 | $config = $this->getConfig(); |
171 | foreach ( self::$PUBLICLY_SHAREABLE_CONFIG_VARS as $key ) { |
172 | if ( $config->has( $key ) ) { |
173 | $result->addValue( null, $key, $config->get( $key ) ); |
174 | } |
175 | } |
176 | } |
177 | |
178 | /** |
179 | * Include a complete mapping from namespace id to index containing pages. |
180 | * |
181 | * Intended for external services/users that need to interact |
182 | * with elasticsearch or cirrussearch dumps directly. |
183 | * |
184 | * @param ApiResult $result Impl to write results to |
185 | */ |
186 | private function addConcreteNamespaceMap( ApiResult $result ) { |
187 | $nsInfo = MediaWikiServices::getInstance()->getNamespaceInfo(); |
188 | $conn = $this->getCirrusConnection(); |
189 | $indexBaseName = $conn->getConfig()->get( SearchConfig::INDEX_BASE_NAME ); |
190 | foreach ( $nsInfo->getValidNamespaces() as $ns ) { |
191 | $indexSuffix = $conn->getIndexSuffixForNamespace( $ns ); |
192 | $indexName = $conn->getIndexName( $indexBaseName, $indexSuffix ); |
193 | $result->addValue( 'CirrusSearchConcreteNamespaceMap', $ns, $indexName ); |
194 | } |
195 | } |
196 | |
197 | private function addReplicaGroup( ApiResult $result ) { |
198 | $result->addValue( null, 'CirrusSearchConcreteReplicaGroup', |
199 | $this->getCirrusConnection()->getConfig()->getClusterAssignment()->getCrossClusterName() ); |
200 | } |
201 | |
202 | /** |
203 | * Profile names and types |
204 | * @var string[] |
205 | */ |
206 | private static $PROFILES = [ |
207 | 'CirrusSearchPhraseSuggestProfiles' => SearchProfileService::PHRASE_SUGGESTER, |
208 | 'CirrusSearchCrossProjectBlockScorerProfiles' => SearchProfileService::CROSS_PROJECT_BLOCK_SCORER, |
209 | 'CirrusSearchSimilarityProfiles' => SearchProfileService::SIMILARITY, |
210 | 'CirrusSearchRescoreFunctionChains' => SearchProfileService::RESCORE_FUNCTION_CHAINS, |
211 | 'CirrusSearchCompletionProfiles' => SearchProfileService::COMPLETION, |
212 | 'CirrusSearchFullTextQueryBuilderProfiles' => SearchProfileService::FT_QUERY_BUILDER, |
213 | 'CirrusSearchRescoreProfiles' => SearchProfileService::RESCORE, |
214 | ]; |
215 | |
216 | /** |
217 | * Add data from profiles |
218 | * @param ApiResult $result |
219 | */ |
220 | private function addProfiles( ApiResult $result ) { |
221 | $config = new SearchConfig(); |
222 | $profileService = $config->getProfileService(); |
223 | foreach ( self::$PROFILES as $var => $profileType ) { |
224 | $data = $profileService->listExposedProfiles( $profileType ); |
225 | $this->getResult()->addValue( null, $var, $data, ApiResult::OVERRIDE ); |
226 | } |
227 | } |
228 | |
229 | protected function addUserTesting( ApiResult $result ) { |
230 | // UserTesting only automatically assigns test buckets during web requests. |
231 | // This api call is different from a typical search request though, this is |
232 | // used from non-search pages to find out what bucket to provide to a new |
233 | // autocomplete session. |
234 | $engine = UserTestingEngine::fromConfig( $this->getConfig() ); |
235 | $status = $engine->decideTestByAutoenroll(); |
236 | $result->addValue( null, 'CirrusSearchActiveUserTest', |
237 | $status->isActive() ? $status->getTrigger() : '' ); |
238 | } |
239 | |
240 | public function getAllowedParams() { |
241 | return [ |
242 | 'prop' => [ |
243 | ParamValidator::PARAM_DEFAULT => 'globals|namespacemap|profiles|replicagroup', |
244 | ParamValidator::PARAM_TYPE => [ |
245 | 'globals', |
246 | 'namespacemap', |
247 | 'profiles', |
248 | 'replicagroup', |
249 | 'usertesting', |
250 | ], |
251 | ParamValidator::PARAM_ISMULTI => true, |
252 | ], |
253 | ]; |
254 | } |
255 | |
256 | /** |
257 | * @see ApiBase::getExamplesMessages |
258 | * @return array |
259 | */ |
260 | protected function getExamplesMessages() { |
261 | return [ |
262 | 'action=cirrus-config-dump' => |
263 | 'apihelp-cirrus-config-dump-example' |
264 | ]; |
265 | } |
266 | |
267 | } |