Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 51
0.00% covered (danger)
0.00%
0 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
ConfigDump
0.00% covered (danger)
0.00%
0 / 51
0.00% covered (danger)
0.00%
0 / 8
342
0.00% covered (danger)
0.00%
0 / 1
 execute
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
42
 addGlobals
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
12
 addConcreteNamespaceMap
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
6
 addReplicaGroup
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 addProfiles
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
 addUserTesting
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 getAllowedParams
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
2
 getExamplesMessages
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace CirrusSearch\Api;
4
5use ApiBase;
6use ApiResult;
7use CirrusSearch\Profile\SearchProfileService;
8use CirrusSearch\SearchConfig;
9use CirrusSearch\UserTestingEngine;
10use MediaWiki\MediaWikiServices;
11use 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 */
31class 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}