Merge pull request #20000 from rjernst/search_parser
Consolidate search parser registries
This commit is contained in:
commit
21af485a88
|
@ -347,7 +347,7 @@ public class Node implements Closeable {
|
||||||
client = new NodeClient(settings, threadPool);
|
client = new NodeClient(settings, threadPool);
|
||||||
Collection<Object> pluginComponents = pluginsService.filterPlugins(Plugin.class).stream()
|
Collection<Object> pluginComponents = pluginsService.filterPlugins(Plugin.class).stream()
|
||||||
.flatMap(p -> p.createComponents(client, clusterService, threadPool, resourceWatcherService,
|
.flatMap(p -> p.createComponents(client, clusterService, threadPool, resourceWatcherService,
|
||||||
scriptModule.getScriptService()).stream())
|
scriptModule.getScriptService(), searchModule.getSearchRequestParsers()).stream())
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
modules.add(b -> {
|
modules.add(b -> {
|
||||||
b.bind(PluginsService.class).toInstance(pluginsService);
|
b.bind(PluginsService.class).toInstance(pluginsService);
|
||||||
|
|
|
@ -19,6 +19,10 @@
|
||||||
|
|
||||||
package org.elasticsearch.plugins;
|
package org.elasticsearch.plugins;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.elasticsearch.action.ActionModule;
|
import org.elasticsearch.action.ActionModule;
|
||||||
import org.elasticsearch.client.Client;
|
import org.elasticsearch.client.Client;
|
||||||
import org.elasticsearch.cluster.service.ClusterService;
|
import org.elasticsearch.cluster.service.ClusterService;
|
||||||
|
@ -34,14 +38,11 @@ import org.elasticsearch.indices.analysis.AnalysisModule;
|
||||||
import org.elasticsearch.script.ScriptModule;
|
import org.elasticsearch.script.ScriptModule;
|
||||||
import org.elasticsearch.script.ScriptService;
|
import org.elasticsearch.script.ScriptService;
|
||||||
import org.elasticsearch.search.SearchModule;
|
import org.elasticsearch.search.SearchModule;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.threadpool.ExecutorBuilder;
|
import org.elasticsearch.threadpool.ExecutorBuilder;
|
||||||
import org.elasticsearch.threadpool.ThreadPool;
|
import org.elasticsearch.threadpool.ThreadPool;
|
||||||
import org.elasticsearch.watcher.ResourceWatcherService;
|
import org.elasticsearch.watcher.ResourceWatcherService;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An extension point allowing to plug in custom functionality.
|
* An extension point allowing to plug in custom functionality.
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -83,9 +84,11 @@ public abstract class Plugin {
|
||||||
* @param threadPool A service to allow retrieving an executor to run an async action
|
* @param threadPool A service to allow retrieving an executor to run an async action
|
||||||
* @param resourceWatcherService A service to watch for changes to node local files
|
* @param resourceWatcherService A service to watch for changes to node local files
|
||||||
* @param scriptService A service to allow running scripts on the local node
|
* @param scriptService A service to allow running scripts on the local node
|
||||||
|
* @param searchRequestParsers Parsers for search requests which may be used to templatize search requests
|
||||||
*/
|
*/
|
||||||
public Collection<Object> createComponents(Client client, ClusterService clusterService, ThreadPool threadPool,
|
public Collection<Object> createComponents(Client client, ClusterService clusterService, ThreadPool threadPool,
|
||||||
ResourceWatcherService resourceWatcherService, ScriptService scriptService) {
|
ResourceWatcherService resourceWatcherService, ScriptService scriptService,
|
||||||
|
SearchRequestParsers searchRequestParsers) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,10 @@
|
||||||
|
|
||||||
package org.elasticsearch.rest.action.search;
|
package org.elasticsearch.rest.action.search;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
|
||||||
import org.elasticsearch.ElasticsearchParseException;
|
import org.elasticsearch.ElasticsearchParseException;
|
||||||
import org.elasticsearch.action.search.MultiSearchRequest;
|
import org.elasticsearch.action.search.MultiSearchRequest;
|
||||||
import org.elasticsearch.action.search.SearchRequest;
|
import org.elasticsearch.action.search.SearchRequest;
|
||||||
|
@ -33,20 +37,14 @@ import org.elasticsearch.common.xcontent.XContent;
|
||||||
import org.elasticsearch.common.xcontent.XContentFactory;
|
import org.elasticsearch.common.xcontent.XContentFactory;
|
||||||
import org.elasticsearch.common.xcontent.XContentParser;
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
import org.elasticsearch.index.query.QueryParseContext;
|
import org.elasticsearch.index.query.QueryParseContext;
|
||||||
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
|
||||||
import org.elasticsearch.rest.BaseRestHandler;
|
import org.elasticsearch.rest.BaseRestHandler;
|
||||||
import org.elasticsearch.rest.RestChannel;
|
import org.elasticsearch.rest.RestChannel;
|
||||||
import org.elasticsearch.rest.RestController;
|
import org.elasticsearch.rest.RestController;
|
||||||
import org.elasticsearch.rest.RestRequest;
|
import org.elasticsearch.rest.RestRequest;
|
||||||
import org.elasticsearch.rest.action.RestActions;
|
import org.elasticsearch.rest.action.RestActions;
|
||||||
import org.elasticsearch.rest.action.RestToXContentListener;
|
import org.elasticsearch.rest.action.RestToXContentListener;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
||||||
import org.elasticsearch.search.suggest.Suggesters;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.function.BiConsumer;
|
|
||||||
|
|
||||||
import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue;
|
import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue;
|
||||||
import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeStringArrayValue;
|
import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeStringArrayValue;
|
||||||
|
@ -59,16 +57,12 @@ import static org.elasticsearch.rest.RestRequest.Method.POST;
|
||||||
public class RestMultiSearchAction extends BaseRestHandler {
|
public class RestMultiSearchAction extends BaseRestHandler {
|
||||||
|
|
||||||
private final boolean allowExplicitIndex;
|
private final boolean allowExplicitIndex;
|
||||||
private final IndicesQueriesRegistry indicesQueriesRegistry;
|
private final SearchRequestParsers searchRequestParsers;
|
||||||
private final AggregatorParsers aggParsers;
|
|
||||||
private final Suggesters suggesters;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public RestMultiSearchAction(Settings settings, RestController controller, IndicesQueriesRegistry indicesQueriesRegistry,
|
public RestMultiSearchAction(Settings settings, RestController controller, SearchRequestParsers searchRequestParsers) {
|
||||||
AggregatorParsers aggParsers, Suggesters suggesters) {
|
|
||||||
super(settings);
|
super(settings);
|
||||||
this.aggParsers = aggParsers;
|
this.searchRequestParsers = searchRequestParsers;
|
||||||
this.suggesters = suggesters;
|
|
||||||
|
|
||||||
controller.registerHandler(GET, "/_msearch", this);
|
controller.registerHandler(GET, "/_msearch", this);
|
||||||
controller.registerHandler(POST, "/_msearch", this);
|
controller.registerHandler(POST, "/_msearch", this);
|
||||||
|
@ -78,13 +72,11 @@ public class RestMultiSearchAction extends BaseRestHandler {
|
||||||
controller.registerHandler(POST, "/{index}/{type}/_msearch", this);
|
controller.registerHandler(POST, "/{index}/{type}/_msearch", this);
|
||||||
|
|
||||||
this.allowExplicitIndex = MULTI_ALLOW_EXPLICIT_INDEX.get(settings);
|
this.allowExplicitIndex = MULTI_ALLOW_EXPLICIT_INDEX.get(settings);
|
||||||
this.indicesQueriesRegistry = indicesQueriesRegistry;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleRequest(final RestRequest request, final RestChannel channel, final NodeClient client) throws Exception {
|
public void handleRequest(final RestRequest request, final RestChannel channel, final NodeClient client) throws Exception {
|
||||||
MultiSearchRequest multiSearchRequest = parseRequest(request, allowExplicitIndex, indicesQueriesRegistry, parseFieldMatcher,
|
MultiSearchRequest multiSearchRequest = parseRequest(request, allowExplicitIndex, searchRequestParsers, parseFieldMatcher);
|
||||||
aggParsers, suggesters);
|
|
||||||
client.multiSearch(multiSearchRequest, new RestToXContentListener<>(channel));
|
client.multiSearch(multiSearchRequest, new RestToXContentListener<>(channel));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,8 +84,8 @@ public class RestMultiSearchAction extends BaseRestHandler {
|
||||||
* Parses a {@link RestRequest} body and returns a {@link MultiSearchRequest}
|
* Parses a {@link RestRequest} body and returns a {@link MultiSearchRequest}
|
||||||
*/
|
*/
|
||||||
public static MultiSearchRequest parseRequest(RestRequest restRequest, boolean allowExplicitIndex,
|
public static MultiSearchRequest parseRequest(RestRequest restRequest, boolean allowExplicitIndex,
|
||||||
IndicesQueriesRegistry queriesRegistry, ParseFieldMatcher parseFieldMatcher,
|
SearchRequestParsers searchRequestParsers,
|
||||||
AggregatorParsers aggParsers, Suggesters suggesters) throws IOException {
|
ParseFieldMatcher parseFieldMatcher) throws IOException {
|
||||||
|
|
||||||
MultiSearchRequest multiRequest = new MultiSearchRequest();
|
MultiSearchRequest multiRequest = new MultiSearchRequest();
|
||||||
if (restRequest.hasParam("max_concurrent_searches")) {
|
if (restRequest.hasParam("max_concurrent_searches")) {
|
||||||
|
@ -102,8 +94,10 @@ public class RestMultiSearchAction extends BaseRestHandler {
|
||||||
|
|
||||||
parseMultiLineRequest(restRequest, multiRequest.indicesOptions(), allowExplicitIndex, (searchRequest, bytes) -> {
|
parseMultiLineRequest(restRequest, multiRequest.indicesOptions(), allowExplicitIndex, (searchRequest, bytes) -> {
|
||||||
try (XContentParser requestParser = XContentFactory.xContent(bytes).createParser(bytes)) {
|
try (XContentParser requestParser = XContentFactory.xContent(bytes).createParser(bytes)) {
|
||||||
final QueryParseContext queryParseContext = new QueryParseContext(queriesRegistry, requestParser, parseFieldMatcher);
|
final QueryParseContext queryParseContext = new QueryParseContext(searchRequestParsers.queryParsers,
|
||||||
searchRequest.source(SearchSourceBuilder.fromXContent(queryParseContext, aggParsers, suggesters));
|
requestParser, parseFieldMatcher);
|
||||||
|
searchRequest.source(SearchSourceBuilder.fromXContent(queryParseContext,
|
||||||
|
searchRequestParsers.aggParsers, searchRequestParsers.suggesters));
|
||||||
multiRequest.add(searchRequest);
|
multiRequest.add(searchRequest);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new ElasticsearchParseException("Exception when parsing search request", e);
|
throw new ElasticsearchParseException("Exception when parsing search request", e);
|
||||||
|
|
|
@ -41,6 +41,7 @@ import org.elasticsearch.rest.RestRequest;
|
||||||
import org.elasticsearch.rest.action.RestActions;
|
import org.elasticsearch.rest.action.RestActions;
|
||||||
import org.elasticsearch.rest.action.RestStatusToXContentListener;
|
import org.elasticsearch.rest.action.RestStatusToXContentListener;
|
||||||
import org.elasticsearch.search.Scroll;
|
import org.elasticsearch.search.Scroll;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
||||||
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
||||||
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
|
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
|
||||||
|
@ -63,17 +64,12 @@ import static org.elasticsearch.search.suggest.SuggestBuilders.termSuggestion;
|
||||||
*/
|
*/
|
||||||
public class RestSearchAction extends BaseRestHandler {
|
public class RestSearchAction extends BaseRestHandler {
|
||||||
|
|
||||||
private final IndicesQueriesRegistry queryRegistry;
|
private final SearchRequestParsers searchRequestParsers;
|
||||||
private final AggregatorParsers aggParsers;
|
|
||||||
private final Suggesters suggesters;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public RestSearchAction(Settings settings, RestController controller, IndicesQueriesRegistry queryRegistry,
|
public RestSearchAction(Settings settings, RestController controller, SearchRequestParsers searchRequestParsers) {
|
||||||
AggregatorParsers aggParsers, Suggesters suggesters) {
|
|
||||||
super(settings);
|
super(settings);
|
||||||
this.queryRegistry = queryRegistry;
|
this.searchRequestParsers = searchRequestParsers;
|
||||||
this.aggParsers = aggParsers;
|
|
||||||
this.suggesters = suggesters;
|
|
||||||
controller.registerHandler(GET, "/_search", this);
|
controller.registerHandler(GET, "/_search", this);
|
||||||
controller.registerHandler(POST, "/_search", this);
|
controller.registerHandler(POST, "/_search", this);
|
||||||
controller.registerHandler(GET, "/{index}/_search", this);
|
controller.registerHandler(GET, "/{index}/_search", this);
|
||||||
|
@ -86,7 +82,7 @@ public class RestSearchAction extends BaseRestHandler {
|
||||||
public void handleRequest(final RestRequest request, final RestChannel channel, final NodeClient client) throws IOException {
|
public void handleRequest(final RestRequest request, final RestChannel channel, final NodeClient client) throws IOException {
|
||||||
SearchRequest searchRequest = new SearchRequest();
|
SearchRequest searchRequest = new SearchRequest();
|
||||||
BytesReference restContent = RestActions.hasBodyContent(request) ? RestActions.getRestContent(request) : null;
|
BytesReference restContent = RestActions.hasBodyContent(request) ? RestActions.getRestContent(request) : null;
|
||||||
parseSearchRequest(searchRequest, queryRegistry, request, parseFieldMatcher, aggParsers, suggesters, restContent);
|
parseSearchRequest(searchRequest, request, searchRequestParsers, parseFieldMatcher, restContent);
|
||||||
client.search(searchRequest, new RestStatusToXContentListener<>(channel));
|
client.search(searchRequest, new RestStatusToXContentListener<>(channel));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,9 +95,8 @@ public class RestSearchAction extends BaseRestHandler {
|
||||||
* content is read from the request using
|
* content is read from the request using
|
||||||
* RestAction.hasBodyContent.
|
* RestAction.hasBodyContent.
|
||||||
*/
|
*/
|
||||||
public static void parseSearchRequest(SearchRequest searchRequest, IndicesQueriesRegistry indicesQueriesRegistry, RestRequest request,
|
public static void parseSearchRequest(SearchRequest searchRequest, RestRequest request, SearchRequestParsers searchRequestParsers,
|
||||||
ParseFieldMatcher parseFieldMatcher, AggregatorParsers aggParsers, Suggesters suggesters, BytesReference restContent)
|
ParseFieldMatcher parseFieldMatcher, BytesReference restContent) throws IOException {
|
||||||
throws IOException {
|
|
||||||
|
|
||||||
if (searchRequest.source() == null) {
|
if (searchRequest.source() == null) {
|
||||||
searchRequest.source(new SearchSourceBuilder());
|
searchRequest.source(new SearchSourceBuilder());
|
||||||
|
@ -109,8 +104,8 @@ public class RestSearchAction extends BaseRestHandler {
|
||||||
searchRequest.indices(Strings.splitStringByCommaToArray(request.param("index")));
|
searchRequest.indices(Strings.splitStringByCommaToArray(request.param("index")));
|
||||||
if (restContent != null) {
|
if (restContent != null) {
|
||||||
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
||||||
QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, parseFieldMatcher);
|
QueryParseContext context = new QueryParseContext(searchRequestParsers.queryParsers, parser, parseFieldMatcher);
|
||||||
searchRequest.source().parseXContent(context, aggParsers, suggesters);
|
searchRequest.source().parseXContent(context, searchRequestParsers.aggParsers, searchRequestParsers.suggesters);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
|
|
||||||
package org.elasticsearch.rest.action.search;
|
package org.elasticsearch.rest.action.search;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.elasticsearch.action.search.SearchRequest;
|
import org.elasticsearch.action.search.SearchRequest;
|
||||||
import org.elasticsearch.action.search.SearchResponse;
|
import org.elasticsearch.action.search.SearchResponse;
|
||||||
import org.elasticsearch.action.support.IndicesOptions;
|
import org.elasticsearch.action.support.IndicesOptions;
|
||||||
|
@ -31,7 +33,6 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
import org.elasticsearch.common.xcontent.XContentFactory;
|
import org.elasticsearch.common.xcontent.XContentFactory;
|
||||||
import org.elasticsearch.common.xcontent.XContentParser;
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
import org.elasticsearch.index.query.QueryParseContext;
|
import org.elasticsearch.index.query.QueryParseContext;
|
||||||
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
|
||||||
import org.elasticsearch.rest.BaseRestHandler;
|
import org.elasticsearch.rest.BaseRestHandler;
|
||||||
import org.elasticsearch.rest.BytesRestResponse;
|
import org.elasticsearch.rest.BytesRestResponse;
|
||||||
import org.elasticsearch.rest.RestChannel;
|
import org.elasticsearch.rest.RestChannel;
|
||||||
|
@ -41,12 +42,10 @@ import org.elasticsearch.rest.RestResponse;
|
||||||
import org.elasticsearch.rest.RestStatus;
|
import org.elasticsearch.rest.RestStatus;
|
||||||
import org.elasticsearch.rest.action.RestActions;
|
import org.elasticsearch.rest.action.RestActions;
|
||||||
import org.elasticsearch.rest.action.RestBuilderListener;
|
import org.elasticsearch.rest.action.RestBuilderListener;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
||||||
import org.elasticsearch.search.suggest.Suggest;
|
import org.elasticsearch.search.suggest.Suggest;
|
||||||
import org.elasticsearch.search.suggest.SuggestBuilder;
|
import org.elasticsearch.search.suggest.SuggestBuilder;
|
||||||
import org.elasticsearch.search.suggest.Suggesters;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import static org.elasticsearch.rest.RestRequest.Method.GET;
|
import static org.elasticsearch.rest.RestRequest.Method.GET;
|
||||||
import static org.elasticsearch.rest.RestRequest.Method.POST;
|
import static org.elasticsearch.rest.RestRequest.Method.POST;
|
||||||
|
@ -54,15 +53,13 @@ import static org.elasticsearch.rest.action.RestActions.buildBroadcastShardsHead
|
||||||
|
|
||||||
public class RestSuggestAction extends BaseRestHandler {
|
public class RestSuggestAction extends BaseRestHandler {
|
||||||
|
|
||||||
private final IndicesQueriesRegistry queryRegistry;
|
private final SearchRequestParsers searchRequestParsers;
|
||||||
private final Suggesters suggesters;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public RestSuggestAction(Settings settings, RestController controller,
|
public RestSuggestAction(Settings settings, RestController controller,
|
||||||
IndicesQueriesRegistry queryRegistry, Suggesters suggesters) {
|
SearchRequestParsers searchRequestParsers) {
|
||||||
super(settings);
|
super(settings);
|
||||||
this.queryRegistry = queryRegistry;
|
this.searchRequestParsers = searchRequestParsers;
|
||||||
this.suggesters = suggesters;
|
|
||||||
controller.registerHandler(POST, "/_suggest", this);
|
controller.registerHandler(POST, "/_suggest", this);
|
||||||
controller.registerHandler(GET, "/_suggest", this);
|
controller.registerHandler(GET, "/_suggest", this);
|
||||||
controller.registerHandler(POST, "/{index}/_suggest", this);
|
controller.registerHandler(POST, "/{index}/_suggest", this);
|
||||||
|
@ -77,8 +74,8 @@ public class RestSuggestAction extends BaseRestHandler {
|
||||||
if (RestActions.hasBodyContent(request)) {
|
if (RestActions.hasBodyContent(request)) {
|
||||||
final BytesReference sourceBytes = RestActions.getRestContent(request);
|
final BytesReference sourceBytes = RestActions.getRestContent(request);
|
||||||
try (XContentParser parser = XContentFactory.xContent(sourceBytes).createParser(sourceBytes)) {
|
try (XContentParser parser = XContentFactory.xContent(sourceBytes).createParser(sourceBytes)) {
|
||||||
final QueryParseContext context = new QueryParseContext(queryRegistry, parser, parseFieldMatcher);
|
final QueryParseContext context = new QueryParseContext(searchRequestParsers.queryParsers, parser, parseFieldMatcher);
|
||||||
searchRequest.source().suggest(SuggestBuilder.fromXContent(context, suggesters));
|
searchRequest.source().suggest(SuggestBuilder.fromXContent(context, searchRequestParsers.suggesters));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException("no content or source provided to execute suggestion");
|
throw new IllegalArgumentException("no content or source provided to execute suggestion");
|
||||||
|
|
|
@ -309,6 +309,7 @@ public class SearchModule extends AbstractModule {
|
||||||
|
|
||||||
private final Settings settings;
|
private final Settings settings;
|
||||||
private final List<Entry> namedWriteables = new ArrayList<>();
|
private final List<Entry> namedWriteables = new ArrayList<>();
|
||||||
|
private final SearchRequestParsers searchRequestParsers;
|
||||||
|
|
||||||
public SearchModule(Settings settings, boolean transportClient, List<SearchPlugin> plugins) {
|
public SearchModule(Settings settings, boolean transportClient, List<SearchPlugin> plugins) {
|
||||||
this.settings = settings;
|
this.settings = settings;
|
||||||
|
@ -326,6 +327,7 @@ public class SearchModule extends AbstractModule {
|
||||||
registerPipelineAggregations(plugins);
|
registerPipelineAggregations(plugins);
|
||||||
registerFetchSubPhases(plugins);
|
registerFetchSubPhases(plugins);
|
||||||
registerShapes();
|
registerShapes();
|
||||||
|
searchRequestParsers = new SearchRequestParsers(queryParserRegistry, aggregatorParsers, getSuggesters());
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Entry> getNamedWriteables() {
|
public List<Entry> getNamedWriteables() {
|
||||||
|
@ -340,6 +342,10 @@ public class SearchModule extends AbstractModule {
|
||||||
return queryParserRegistry;
|
return queryParserRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SearchRequestParsers getSearchRequestParsers() {
|
||||||
|
return searchRequestParsers;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the {@link Highlighter} registry
|
* Returns the {@link Highlighter} registry
|
||||||
*/
|
*/
|
||||||
|
@ -372,14 +378,9 @@ public class SearchModule extends AbstractModule {
|
||||||
@Override
|
@Override
|
||||||
protected void configure() {
|
protected void configure() {
|
||||||
if (false == transportClient) {
|
if (false == transportClient) {
|
||||||
/*
|
|
||||||
* Nothing is bound for transport client *but* SearchModule is still responsible for settings up the things like the
|
|
||||||
* NamedWriteableRegistry.
|
|
||||||
*/
|
|
||||||
bind(IndicesQueriesRegistry.class).toInstance(queryParserRegistry);
|
bind(IndicesQueriesRegistry.class).toInstance(queryParserRegistry);
|
||||||
bind(Suggesters.class).toInstance(getSuggesters());
|
bind(SearchRequestParsers.class).toInstance(searchRequestParsers);
|
||||||
configureSearch();
|
configureSearch();
|
||||||
bind(AggregatorParsers.class).toInstance(aggregatorParsers);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch under one or more contributor
|
||||||
|
* license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright
|
||||||
|
* ownership. Elasticsearch licenses this file to you under
|
||||||
|
* the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.elasticsearch.search;
|
||||||
|
|
||||||
|
import org.elasticsearch.index.query.QueryParseContext;
|
||||||
|
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
||||||
|
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
||||||
|
import org.elasticsearch.search.suggest.Suggesters;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A container for all parsers used to parse
|
||||||
|
* {@link org.elasticsearch.action.search.SearchRequest} objects from a rest request.
|
||||||
|
*/
|
||||||
|
public class SearchRequestParsers {
|
||||||
|
// TODO: this class should be renamed to SearchRequestParser, and all the parse
|
||||||
|
// methods split across RestSearchAction and SearchSourceBuilder should be moved here
|
||||||
|
// TODO: make all members private once parsing functions are moved here
|
||||||
|
|
||||||
|
// TODO: IndicesQueriesRegistry should be removed and just have the map of query parsers here
|
||||||
|
/**
|
||||||
|
* Query parsers that may be used in search requests.
|
||||||
|
* @see org.elasticsearch.index.query.QueryParseContext
|
||||||
|
* @see org.elasticsearch.search.builder.SearchSourceBuilder#fromXContent(QueryParseContext, AggregatorParsers, Suggesters)
|
||||||
|
*/
|
||||||
|
public final IndicesQueriesRegistry queryParsers;
|
||||||
|
|
||||||
|
// TODO: AggregatorParsers should be removed and the underlying maps of agg
|
||||||
|
// and pipeline agg parsers should be here
|
||||||
|
/**
|
||||||
|
* Agg and pipeline agg parsers that may be used in search requests.
|
||||||
|
* @see org.elasticsearch.search.builder.SearchSourceBuilder#fromXContent(QueryParseContext, AggregatorParsers, Suggesters)
|
||||||
|
*/
|
||||||
|
public final AggregatorParsers aggParsers;
|
||||||
|
|
||||||
|
// TODO: Suggesters should be removed and the underlying map moved here
|
||||||
|
/**
|
||||||
|
* Suggesters that may be used in search requests.
|
||||||
|
* @see org.elasticsearch.search.builder.SearchSourceBuilder#fromXContent(QueryParseContext, AggregatorParsers, Suggesters)
|
||||||
|
*/
|
||||||
|
public final Suggesters suggesters;
|
||||||
|
|
||||||
|
public SearchRequestParsers(IndicesQueriesRegistry queryParsers, AggregatorParsers aggParsers, Suggesters suggesters) {
|
||||||
|
this.queryParsers = queryParsers;
|
||||||
|
this.aggParsers = aggParsers;
|
||||||
|
this.suggesters = suggesters;
|
||||||
|
}
|
||||||
|
}
|
|
@ -31,6 +31,7 @@ import org.elasticsearch.index.query.QueryParser;
|
||||||
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
||||||
import org.elasticsearch.rest.RestRequest;
|
import org.elasticsearch.rest.RestRequest;
|
||||||
import org.elasticsearch.rest.action.search.RestMultiSearchAction;
|
import org.elasticsearch.rest.action.search.RestMultiSearchAction;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.test.ESTestCase;
|
import org.elasticsearch.test.ESTestCase;
|
||||||
import org.elasticsearch.test.StreamsUtils;
|
import org.elasticsearch.test.StreamsUtils;
|
||||||
import org.elasticsearch.test.rest.FakeRestRequest;
|
import org.elasticsearch.test.rest.FakeRestRequest;
|
||||||
|
@ -167,13 +168,13 @@ public class MultiSearchRequestTests extends ESTestCase {
|
||||||
private MultiSearchRequest parseMultiSearchRequest(String sample) throws IOException {
|
private MultiSearchRequest parseMultiSearchRequest(String sample) throws IOException {
|
||||||
byte[] data = StreamsUtils.copyToBytesFromClasspath(sample);
|
byte[] data = StreamsUtils.copyToBytesFromClasspath(sample);
|
||||||
RestRequest restRequest = new FakeRestRequest.Builder().withContent(new BytesArray(data)).build();
|
RestRequest restRequest = new FakeRestRequest.Builder().withContent(new BytesArray(data)).build();
|
||||||
return RestMultiSearchAction.parseRequest(restRequest, true, registry(), ParseFieldMatcher.EMPTY, null, null);
|
return RestMultiSearchAction.parseRequest(restRequest, true, parsers(), ParseFieldMatcher.EMPTY);
|
||||||
}
|
}
|
||||||
|
|
||||||
private IndicesQueriesRegistry registry() {
|
private SearchRequestParsers parsers() {
|
||||||
IndicesQueriesRegistry registry = new IndicesQueriesRegistry();
|
IndicesQueriesRegistry registry = new IndicesQueriesRegistry();
|
||||||
QueryParser<MatchAllQueryBuilder> parser = MatchAllQueryBuilder::fromXContent;
|
QueryParser<MatchAllQueryBuilder> parser = MatchAllQueryBuilder::fromXContent;
|
||||||
registry.register(parser, MatchAllQueryBuilder.NAME);
|
registry.register(parser, MatchAllQueryBuilder.NAME);
|
||||||
return registry;
|
return new SearchRequestParsers(registry, null, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ import org.elasticsearch.common.xcontent.json.JsonXContent;
|
||||||
import org.elasticsearch.index.IndexService;
|
import org.elasticsearch.index.IndexService;
|
||||||
import org.elasticsearch.index.query.QueryParseContext;
|
import org.elasticsearch.index.query.QueryParseContext;
|
||||||
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.search.aggregations.support.AggregationContext;
|
import org.elasticsearch.search.aggregations.support.AggregationContext;
|
||||||
import org.elasticsearch.search.internal.SearchContext;
|
import org.elasticsearch.search.internal.SearchContext;
|
||||||
import org.elasticsearch.test.ESSingleNodeTestCase;
|
import org.elasticsearch.test.ESSingleNodeTestCase;
|
||||||
|
@ -60,7 +61,7 @@ public class AggregationCollectorTests extends ESSingleNodeTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean needsScores(IndexService index, String agg) throws IOException {
|
private boolean needsScores(IndexService index, String agg) throws IOException {
|
||||||
AggregatorParsers parser = getInstanceFromNode(AggregatorParsers.class);
|
AggregatorParsers parser = getInstanceFromNode(SearchRequestParsers.class).aggParsers;
|
||||||
IndicesQueriesRegistry queriesRegistry = getInstanceFromNode(IndicesQueriesRegistry.class);
|
IndicesQueriesRegistry queriesRegistry = getInstanceFromNode(IndicesQueriesRegistry.class);
|
||||||
XContentParser aggParser = JsonXContent.jsonXContent.createParser(agg);
|
XContentParser aggParser = JsonXContent.jsonXContent.createParser(agg);
|
||||||
QueryParseContext parseContext = new QueryParseContext(queriesRegistry, aggParser, ParseFieldMatcher.STRICT);
|
QueryParseContext parseContext = new QueryParseContext(queriesRegistry, aggParser, ParseFieldMatcher.STRICT);
|
||||||
|
|
|
@ -38,6 +38,7 @@ import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
import org.elasticsearch.common.xcontent.json.JsonXContent;
|
import org.elasticsearch.common.xcontent.json.JsonXContent;
|
||||||
import org.elasticsearch.env.Environment;
|
import org.elasticsearch.env.Environment;
|
||||||
import org.elasticsearch.index.Index;
|
import org.elasticsearch.index.Index;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.test.AbstractQueryTestCase;
|
import org.elasticsearch.test.AbstractQueryTestCase;
|
||||||
import org.elasticsearch.index.query.QueryParseContext;
|
import org.elasticsearch.index.query.QueryParseContext;
|
||||||
import org.elasticsearch.indices.IndicesModule;
|
import org.elasticsearch.indices.IndicesModule;
|
||||||
|
@ -144,7 +145,7 @@ public class AggregatorParsingTests extends ESTestCase {
|
||||||
bind(NamedWriteableRegistry.class).toInstance(namedWriteableRegistry);
|
bind(NamedWriteableRegistry.class).toInstance(namedWriteableRegistry);
|
||||||
}
|
}
|
||||||
}).createInjector();
|
}).createInjector();
|
||||||
aggParsers = injector.getInstance(AggregatorParsers.class);
|
aggParsers = injector.getInstance(SearchRequestParsers.class).aggParsers;
|
||||||
// create some random type with some default field, those types will
|
// create some random type with some default field, those types will
|
||||||
// stick around for all of the subclasses
|
// stick around for all of the subclasses
|
||||||
currentTypes = new String[randomIntBetween(0, 5)];
|
currentTypes = new String[randomIntBetween(0, 5)];
|
||||||
|
|
|
@ -42,6 +42,7 @@ import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
import org.elasticsearch.common.xcontent.XContentType;
|
import org.elasticsearch.common.xcontent.XContentType;
|
||||||
import org.elasticsearch.env.Environment;
|
import org.elasticsearch.env.Environment;
|
||||||
import org.elasticsearch.index.Index;
|
import org.elasticsearch.index.Index;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.test.AbstractQueryTestCase;
|
import org.elasticsearch.test.AbstractQueryTestCase;
|
||||||
import org.elasticsearch.index.query.QueryParseContext;
|
import org.elasticsearch.index.query.QueryParseContext;
|
||||||
import org.elasticsearch.indices.IndicesModule;
|
import org.elasticsearch.indices.IndicesModule;
|
||||||
|
@ -106,7 +107,7 @@ public abstract class BaseAggregationTestCase<AB extends AbstractAggregationBuil
|
||||||
index = new Index(randomAsciiOfLengthBetween(1, 10), "_na_");
|
index = new Index(randomAsciiOfLengthBetween(1, 10), "_na_");
|
||||||
injector = buildInjector(index);
|
injector = buildInjector(index);
|
||||||
namedWriteableRegistry = injector.getInstance(NamedWriteableRegistry.class);
|
namedWriteableRegistry = injector.getInstance(NamedWriteableRegistry.class);
|
||||||
aggParsers = injector.getInstance(AggregatorParsers.class);
|
aggParsers = injector.getInstance(SearchRequestParsers.class).aggParsers;
|
||||||
//create some random type with some default field, those types will stick around for all of the subclasses
|
//create some random type with some default field, those types will stick around for all of the subclasses
|
||||||
currentTypes = new String[randomIntBetween(0, 5)];
|
currentTypes = new String[randomIntBetween(0, 5)];
|
||||||
for (int i = 0; i < currentTypes.length; i++) {
|
for (int i = 0; i < currentTypes.length; i++) {
|
||||||
|
|
|
@ -35,6 +35,7 @@ import org.elasticsearch.common.xcontent.XContentType;
|
||||||
import org.elasticsearch.index.Index;
|
import org.elasticsearch.index.Index;
|
||||||
import org.elasticsearch.index.query.QueryParseContext;
|
import org.elasticsearch.index.query.QueryParseContext;
|
||||||
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.search.aggregations.pipeline.AbstractPipelineAggregationBuilder;
|
import org.elasticsearch.search.aggregations.pipeline.AbstractPipelineAggregationBuilder;
|
||||||
import org.elasticsearch.test.ESTestCase;
|
import org.elasticsearch.test.ESTestCase;
|
||||||
import org.elasticsearch.threadpool.ThreadPool;
|
import org.elasticsearch.threadpool.ThreadPool;
|
||||||
|
@ -77,7 +78,7 @@ public abstract class BasePipelineAggregationTestCase<AF extends AbstractPipelin
|
||||||
index = new Index(randomAsciiOfLengthBetween(1, 10), "_na_");
|
index = new Index(randomAsciiOfLengthBetween(1, 10), "_na_");
|
||||||
injector = BaseAggregationTestCase.buildInjector(index);
|
injector = BaseAggregationTestCase.buildInjector(index);
|
||||||
namedWriteableRegistry = injector.getInstance(NamedWriteableRegistry.class);
|
namedWriteableRegistry = injector.getInstance(NamedWriteableRegistry.class);
|
||||||
aggParsers = injector.getInstance(AggregatorParsers.class);
|
aggParsers = injector.getInstance(SearchRequestParsers.class).aggParsers;
|
||||||
//create some random type with some default field, those types will stick around for all of the subclasses
|
//create some random type with some default field, those types will stick around for all of the subclasses
|
||||||
currentTypes = new String[randomIntBetween(0, 5)];
|
currentTypes = new String[randomIntBetween(0, 5)];
|
||||||
for (int i = 0; i < currentTypes.length; i++) {
|
for (int i = 0; i < currentTypes.length; i++) {
|
||||||
|
|
|
@ -58,6 +58,7 @@ import org.elasticsearch.script.Script;
|
||||||
import org.elasticsearch.script.ScriptModule;
|
import org.elasticsearch.script.ScriptModule;
|
||||||
import org.elasticsearch.script.ScriptService;
|
import org.elasticsearch.script.ScriptService;
|
||||||
import org.elasticsearch.search.SearchModule;
|
import org.elasticsearch.search.SearchModule;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.search.aggregations.AggregationBuilders;
|
import org.elasticsearch.search.aggregations.AggregationBuilders;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
||||||
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
|
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
|
||||||
|
@ -99,14 +100,10 @@ public class SearchSourceBuilderTests extends ESTestCase {
|
||||||
|
|
||||||
private static NamedWriteableRegistry namedWriteableRegistry;
|
private static NamedWriteableRegistry namedWriteableRegistry;
|
||||||
|
|
||||||
private static IndicesQueriesRegistry indicesQueriesRegistry;
|
private static SearchRequestParsers searchRequestParsers;
|
||||||
|
|
||||||
private static Index index;
|
private static Index index;
|
||||||
|
|
||||||
private static AggregatorParsers aggParsers;
|
|
||||||
|
|
||||||
private static Suggesters suggesters;
|
|
||||||
|
|
||||||
private static String[] currentTypes;
|
private static String[] currentTypes;
|
||||||
|
|
||||||
private static ParseFieldMatcher parseFieldMatcher;
|
private static ParseFieldMatcher parseFieldMatcher;
|
||||||
|
@ -165,8 +162,7 @@ public class SearchSourceBuilderTests extends ESTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
).createInjector();
|
).createInjector();
|
||||||
aggParsers = injector.getInstance(AggregatorParsers.class);
|
searchRequestParsers = injector.getInstance(SearchRequestParsers.class);
|
||||||
suggesters = injector.getInstance(Suggesters.class);
|
|
||||||
// create some random type with some default field, those types will
|
// create some random type with some default field, those types will
|
||||||
// stick around for all of the subclasses
|
// stick around for all of the subclasses
|
||||||
currentTypes = new String[randomIntBetween(0, 5)];
|
currentTypes = new String[randomIntBetween(0, 5)];
|
||||||
|
@ -174,7 +170,6 @@ public class SearchSourceBuilderTests extends ESTestCase {
|
||||||
String type = randomAsciiOfLengthBetween(1, 10);
|
String type = randomAsciiOfLengthBetween(1, 10);
|
||||||
currentTypes[i] = type;
|
currentTypes[i] = type;
|
||||||
}
|
}
|
||||||
indicesQueriesRegistry = injector.getInstance(IndicesQueriesRegistry.class);
|
|
||||||
parseFieldMatcher = ParseFieldMatcher.STRICT;
|
parseFieldMatcher = ParseFieldMatcher.STRICT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,8 +179,7 @@ public class SearchSourceBuilderTests extends ESTestCase {
|
||||||
terminate(injector.getInstance(ThreadPool.class));
|
terminate(injector.getInstance(ThreadPool.class));
|
||||||
injector = null;
|
injector = null;
|
||||||
index = null;
|
index = null;
|
||||||
aggParsers = null;
|
searchRequestParsers = null;
|
||||||
suggesters = null;
|
|
||||||
currentTypes = null;
|
currentTypes = null;
|
||||||
namedWriteableRegistry = null;
|
namedWriteableRegistry = null;
|
||||||
}
|
}
|
||||||
|
@ -428,19 +422,20 @@ public class SearchSourceBuilderTests extends ESTestCase {
|
||||||
private static void assertParseSearchSource(SearchSourceBuilder testBuilder, BytesReference searchSourceAsBytes, ParseFieldMatcher pfm)
|
private static void assertParseSearchSource(SearchSourceBuilder testBuilder, BytesReference searchSourceAsBytes, ParseFieldMatcher pfm)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
XContentParser parser = XContentFactory.xContent(searchSourceAsBytes).createParser(searchSourceAsBytes);
|
XContentParser parser = XContentFactory.xContent(searchSourceAsBytes).createParser(searchSourceAsBytes);
|
||||||
QueryParseContext parseContext = new QueryParseContext(indicesQueriesRegistry, parser, pfm);
|
QueryParseContext parseContext = new QueryParseContext(searchRequestParsers.queryParsers, parser, pfm);
|
||||||
if (randomBoolean()) {
|
if (randomBoolean()) {
|
||||||
parser.nextToken(); // sometimes we move it on the START_OBJECT to
|
parser.nextToken(); // sometimes we move it on the START_OBJECT to
|
||||||
// test the embedded case
|
// test the embedded case
|
||||||
}
|
}
|
||||||
SearchSourceBuilder newBuilder = SearchSourceBuilder.fromXContent(parseContext, aggParsers, suggesters);
|
SearchSourceBuilder newBuilder = SearchSourceBuilder.fromXContent(parseContext, searchRequestParsers.aggParsers,
|
||||||
|
searchRequestParsers.suggesters);
|
||||||
assertNull(parser.nextToken());
|
assertNull(parser.nextToken());
|
||||||
assertEquals(testBuilder, newBuilder);
|
assertEquals(testBuilder, newBuilder);
|
||||||
assertEquals(testBuilder.hashCode(), newBuilder.hashCode());
|
assertEquals(testBuilder.hashCode(), newBuilder.hashCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static QueryParseContext createParseContext(XContentParser parser) {
|
private static QueryParseContext createParseContext(XContentParser parser) {
|
||||||
QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, parseFieldMatcher);
|
QueryParseContext context = new QueryParseContext(searchRequestParsers.queryParsers, parser, parseFieldMatcher);
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -499,7 +494,7 @@ public class SearchSourceBuilderTests extends ESTestCase {
|
||||||
String restContent = " { \"_source\": { \"includes\": \"include\", \"excludes\": \"*.field2\"}}";
|
String restContent = " { \"_source\": { \"includes\": \"include\", \"excludes\": \"*.field2\"}}";
|
||||||
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
||||||
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser),
|
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser),
|
||||||
aggParsers, suggesters);
|
searchRequestParsers.aggParsers, searchRequestParsers.suggesters);
|
||||||
assertArrayEquals(new String[]{"*.field2"}, searchSourceBuilder.fetchSource().excludes());
|
assertArrayEquals(new String[]{"*.field2"}, searchSourceBuilder.fetchSource().excludes());
|
||||||
assertArrayEquals(new String[]{"include"}, searchSourceBuilder.fetchSource().includes());
|
assertArrayEquals(new String[]{"include"}, searchSourceBuilder.fetchSource().includes());
|
||||||
}
|
}
|
||||||
|
@ -508,7 +503,7 @@ public class SearchSourceBuilderTests extends ESTestCase {
|
||||||
String restContent = " { \"_source\": false}";
|
String restContent = " { \"_source\": false}";
|
||||||
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
||||||
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser),
|
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser),
|
||||||
aggParsers, suggesters);
|
searchRequestParsers.aggParsers, searchRequestParsers.suggesters);
|
||||||
assertArrayEquals(new String[]{}, searchSourceBuilder.fetchSource().excludes());
|
assertArrayEquals(new String[]{}, searchSourceBuilder.fetchSource().excludes());
|
||||||
assertArrayEquals(new String[]{}, searchSourceBuilder.fetchSource().includes());
|
assertArrayEquals(new String[]{}, searchSourceBuilder.fetchSource().includes());
|
||||||
assertFalse(searchSourceBuilder.fetchSource().fetchSource());
|
assertFalse(searchSourceBuilder.fetchSource().fetchSource());
|
||||||
|
@ -521,7 +516,7 @@ public class SearchSourceBuilderTests extends ESTestCase {
|
||||||
String restContent = " { \"sort\": \"foo\"}";
|
String restContent = " { \"sort\": \"foo\"}";
|
||||||
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
||||||
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser),
|
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser),
|
||||||
aggParsers, suggesters);
|
searchRequestParsers.aggParsers, searchRequestParsers.suggesters);
|
||||||
assertEquals(1, searchSourceBuilder.sorts().size());
|
assertEquals(1, searchSourceBuilder.sorts().size());
|
||||||
assertEquals(new FieldSortBuilder("foo"), searchSourceBuilder.sorts().get(0));
|
assertEquals(new FieldSortBuilder("foo"), searchSourceBuilder.sorts().get(0));
|
||||||
}
|
}
|
||||||
|
@ -537,7 +532,7 @@ public class SearchSourceBuilderTests extends ESTestCase {
|
||||||
" ]}";
|
" ]}";
|
||||||
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
||||||
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser),
|
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser),
|
||||||
aggParsers, suggesters);
|
searchRequestParsers.aggParsers, searchRequestParsers.suggesters);
|
||||||
assertEquals(5, searchSourceBuilder.sorts().size());
|
assertEquals(5, searchSourceBuilder.sorts().size());
|
||||||
assertEquals(new FieldSortBuilder("post_date"), searchSourceBuilder.sorts().get(0));
|
assertEquals(new FieldSortBuilder("post_date"), searchSourceBuilder.sorts().get(0));
|
||||||
assertEquals(new FieldSortBuilder("user"), searchSourceBuilder.sorts().get(1));
|
assertEquals(new FieldSortBuilder("user"), searchSourceBuilder.sorts().get(1));
|
||||||
|
@ -560,8 +555,8 @@ public class SearchSourceBuilderTests extends ESTestCase {
|
||||||
" }\n" +
|
" }\n" +
|
||||||
"}\n";
|
"}\n";
|
||||||
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
||||||
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser), aggParsers,
|
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser),
|
||||||
suggesters);
|
searchRequestParsers.aggParsers, searchRequestParsers.suggesters);
|
||||||
assertEquals(1, searchSourceBuilder.aggregations().count());
|
assertEquals(1, searchSourceBuilder.aggregations().count());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -576,8 +571,8 @@ public class SearchSourceBuilderTests extends ESTestCase {
|
||||||
" }\n" +
|
" }\n" +
|
||||||
"}\n";
|
"}\n";
|
||||||
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
||||||
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser), aggParsers,
|
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser),
|
||||||
suggesters);
|
searchRequestParsers.aggParsers, searchRequestParsers.suggesters);
|
||||||
assertEquals(1, searchSourceBuilder.aggregations().count());
|
assertEquals(1, searchSourceBuilder.aggregations().count());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -603,7 +598,7 @@ public class SearchSourceBuilderTests extends ESTestCase {
|
||||||
"}\n";
|
"}\n";
|
||||||
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
||||||
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser),
|
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser),
|
||||||
aggParsers, suggesters);
|
searchRequestParsers.aggParsers, searchRequestParsers.suggesters);
|
||||||
assertEquals(1, searchSourceBuilder.rescores().size());
|
assertEquals(1, searchSourceBuilder.rescores().size());
|
||||||
assertEquals(new QueryRescorerBuilder(QueryBuilders.matchQuery("content", "baz")).windowSize(50),
|
assertEquals(new QueryRescorerBuilder(QueryBuilders.matchQuery("content", "baz")).windowSize(50),
|
||||||
searchSourceBuilder.rescores().get(0));
|
searchSourceBuilder.rescores().get(0));
|
||||||
|
@ -626,7 +621,7 @@ public class SearchSourceBuilderTests extends ESTestCase {
|
||||||
"}\n";
|
"}\n";
|
||||||
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
||||||
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser),
|
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser),
|
||||||
aggParsers, suggesters);
|
searchRequestParsers.aggParsers, searchRequestParsers.suggesters);
|
||||||
assertEquals(1, searchSourceBuilder.rescores().size());
|
assertEquals(1, searchSourceBuilder.rescores().size());
|
||||||
assertEquals(new QueryRescorerBuilder(QueryBuilders.matchQuery("content", "baz")).windowSize(50),
|
assertEquals(new QueryRescorerBuilder(QueryBuilders.matchQuery("content", "baz")).windowSize(50),
|
||||||
searchSourceBuilder.rescores().get(0));
|
searchSourceBuilder.rescores().get(0));
|
||||||
|
@ -638,7 +633,8 @@ public class SearchSourceBuilderTests extends ESTestCase {
|
||||||
final String timeout = randomTimeValue();
|
final String timeout = randomTimeValue();
|
||||||
final String query = "{ \"query\": { \"match_all\": {}}, \"timeout\": \"" + timeout + "\"}";
|
final String query = "{ \"query\": { \"match_all\": {}}, \"timeout\": \"" + timeout + "\"}";
|
||||||
try (XContentParser parser = XContentFactory.xContent(query).createParser(query)) {
|
try (XContentParser parser = XContentFactory.xContent(query).createParser(query)) {
|
||||||
final SearchSourceBuilder builder = SearchSourceBuilder.fromXContent(createParseContext(parser), aggParsers, suggesters);
|
final SearchSourceBuilder builder = SearchSourceBuilder.fromXContent(createParseContext(parser),
|
||||||
|
searchRequestParsers.aggParsers, searchRequestParsers.suggesters);
|
||||||
assertThat(builder.timeout(), equalTo(TimeValue.parseTimeValue(timeout, null, "timeout")));
|
assertThat(builder.timeout(), equalTo(TimeValue.parseTimeValue(timeout, null, "timeout")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -650,7 +646,8 @@ public class SearchSourceBuilderTests extends ESTestCase {
|
||||||
final ElasticsearchParseException e =
|
final ElasticsearchParseException e =
|
||||||
expectThrows(
|
expectThrows(
|
||||||
ElasticsearchParseException.class,
|
ElasticsearchParseException.class,
|
||||||
() -> SearchSourceBuilder.fromXContent(createParseContext(parser), aggParsers, suggesters));
|
() -> SearchSourceBuilder.fromXContent(createParseContext(parser),
|
||||||
|
searchRequestParsers.aggParsers, searchRequestParsers.suggesters));
|
||||||
assertThat(e, hasToString(containsString("unit is missing or unrecognized")));
|
assertThat(e, hasToString(containsString("unit is missing or unrecognized")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,7 @@ import org.elasticsearch.rest.action.RestActions;
|
||||||
import org.elasticsearch.rest.action.RestStatusToXContentListener;
|
import org.elasticsearch.rest.action.RestStatusToXContentListener;
|
||||||
import org.elasticsearch.rest.action.search.RestSearchAction;
|
import org.elasticsearch.rest.action.search.RestSearchAction;
|
||||||
import org.elasticsearch.script.ScriptService;
|
import org.elasticsearch.script.ScriptService;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
||||||
import org.elasticsearch.search.suggest.Suggesters;
|
import org.elasticsearch.search.suggest.Suggesters;
|
||||||
|
|
||||||
|
@ -81,17 +82,12 @@ public class RestSearchTemplateAction extends BaseRestHandler {
|
||||||
}, new ParseField("inline", "template"), ObjectParser.ValueType.OBJECT_OR_STRING);
|
}, new ParseField("inline", "template"), ObjectParser.ValueType.OBJECT_OR_STRING);
|
||||||
}
|
}
|
||||||
|
|
||||||
private final IndicesQueriesRegistry queryRegistry;
|
private final SearchRequestParsers searchRequestParsers;
|
||||||
private final AggregatorParsers aggParsers;
|
|
||||||
private final Suggesters suggesters;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public RestSearchTemplateAction(Settings settings, RestController controller, IndicesQueriesRegistry queryRegistry,
|
public RestSearchTemplateAction(Settings settings, RestController controller, SearchRequestParsers searchRequestParsers) {
|
||||||
AggregatorParsers aggregatorParsers, Suggesters suggesters) {
|
|
||||||
super(settings);
|
super(settings);
|
||||||
this.queryRegistry = queryRegistry;
|
this.searchRequestParsers = searchRequestParsers;
|
||||||
this.aggParsers = aggregatorParsers;
|
|
||||||
this.suggesters = suggesters;
|
|
||||||
|
|
||||||
controller.registerHandler(GET, "/_search/template", this);
|
controller.registerHandler(GET, "/_search/template", this);
|
||||||
controller.registerHandler(POST, "/_search/template", this);
|
controller.registerHandler(POST, "/_search/template", this);
|
||||||
|
@ -109,7 +105,7 @@ public class RestSearchTemplateAction extends BaseRestHandler {
|
||||||
|
|
||||||
// Creates the search request with all required params
|
// Creates the search request with all required params
|
||||||
SearchRequest searchRequest = new SearchRequest();
|
SearchRequest searchRequest = new SearchRequest();
|
||||||
RestSearchAction.parseSearchRequest(searchRequest, queryRegistry, request, parseFieldMatcher, aggParsers, suggesters, null);
|
RestSearchAction.parseSearchRequest(searchRequest, request, searchRequestParsers, parseFieldMatcher, null);
|
||||||
|
|
||||||
// Creates the search template request
|
// Creates the search template request
|
||||||
SearchTemplateRequest searchTemplateRequest = parse(RestActions.getRestContent(request));
|
SearchTemplateRequest searchTemplateRequest = parse(RestActions.getRestContent(request));
|
||||||
|
|
|
@ -36,6 +36,7 @@ import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
||||||
import org.elasticsearch.script.ExecutableScript;
|
import org.elasticsearch.script.ExecutableScript;
|
||||||
import org.elasticsearch.script.Script;
|
import org.elasticsearch.script.Script;
|
||||||
import org.elasticsearch.script.ScriptService;
|
import org.elasticsearch.script.ScriptService;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
||||||
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
||||||
import org.elasticsearch.search.suggest.Suggesters;
|
import org.elasticsearch.search.suggest.Suggesters;
|
||||||
|
@ -51,22 +52,17 @@ public class TransportSearchTemplateAction extends HandledTransportAction<Search
|
||||||
|
|
||||||
private final ScriptService scriptService;
|
private final ScriptService scriptService;
|
||||||
private final TransportSearchAction searchAction;
|
private final TransportSearchAction searchAction;
|
||||||
private final IndicesQueriesRegistry queryRegistry;
|
private final SearchRequestParsers searchRequestParsers;
|
||||||
private final AggregatorParsers aggsParsers;
|
|
||||||
private final Suggesters suggesters;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public TransportSearchTemplateAction(Settings settings, ThreadPool threadPool, TransportService transportService,
|
public TransportSearchTemplateAction(Settings settings, ThreadPool threadPool, TransportService transportService,
|
||||||
ActionFilters actionFilters, IndexNameExpressionResolver resolver,
|
ActionFilters actionFilters, IndexNameExpressionResolver resolver,
|
||||||
ScriptService scriptService,
|
ScriptService scriptService,
|
||||||
TransportSearchAction searchAction, IndicesQueriesRegistry indicesQueryRegistry,
|
TransportSearchAction searchAction, SearchRequestParsers searchRequestParsers) {
|
||||||
AggregatorParsers aggregatorParsers, Suggesters suggesters) {
|
|
||||||
super(settings, SearchTemplateAction.NAME, threadPool, transportService, actionFilters, resolver, SearchTemplateRequest::new);
|
super(settings, SearchTemplateAction.NAME, threadPool, transportService, actionFilters, resolver, SearchTemplateRequest::new);
|
||||||
this.scriptService = scriptService;
|
this.scriptService = scriptService;
|
||||||
this.searchAction = searchAction;
|
this.searchAction = searchAction;
|
||||||
this.queryRegistry = indicesQueryRegistry;
|
this.searchRequestParsers = searchRequestParsers;
|
||||||
this.aggsParsers = aggregatorParsers;
|
|
||||||
this.suggesters = suggesters;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -89,7 +85,8 @@ public class TransportSearchTemplateAction extends HandledTransportAction<Search
|
||||||
|
|
||||||
try (XContentParser parser = XContentFactory.xContent(source).createParser(source)) {
|
try (XContentParser parser = XContentFactory.xContent(source).createParser(source)) {
|
||||||
SearchSourceBuilder builder = SearchSourceBuilder.searchSource();
|
SearchSourceBuilder builder = SearchSourceBuilder.searchSource();
|
||||||
builder.parseXContent(new QueryParseContext(queryRegistry, parser, parseFieldMatcher), aggsParsers, suggesters);
|
builder.parseXContent(new QueryParseContext(searchRequestParsers.queryParsers, parser, parseFieldMatcher),
|
||||||
|
searchRequestParsers.aggParsers, searchRequestParsers.suggesters);
|
||||||
searchRequest.source(builder);
|
searchRequest.source(builder);
|
||||||
|
|
||||||
searchAction.execute(searchRequest, new ActionListener<SearchResponse>() {
|
searchAction.execute(searchRequest, new ActionListener<SearchResponse>() {
|
||||||
|
|
|
@ -38,6 +38,7 @@ import org.elasticsearch.common.collect.Tuple;
|
||||||
import org.elasticsearch.common.inject.Inject;
|
import org.elasticsearch.common.inject.Inject;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
||||||
import org.elasticsearch.threadpool.ThreadPool;
|
import org.elasticsearch.threadpool.ThreadPool;
|
||||||
import org.elasticsearch.transport.TransportService;
|
import org.elasticsearch.transport.TransportService;
|
||||||
|
@ -54,18 +55,17 @@ public class TransportMultiPercolateAction extends HandledTransportAction<MultiP
|
||||||
|
|
||||||
private final Client client;
|
private final Client client;
|
||||||
private final ParseFieldMatcher parseFieldMatcher;
|
private final ParseFieldMatcher parseFieldMatcher;
|
||||||
private final IndicesQueriesRegistry queryRegistry;
|
private final SearchRequestParsers searchRequestParsers;
|
||||||
private final AggregatorParsers aggParsers;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public TransportMultiPercolateAction(Settings settings, ThreadPool threadPool, TransportService transportService, ActionFilters actionFilters,
|
public TransportMultiPercolateAction(Settings settings, ThreadPool threadPool, TransportService transportService,
|
||||||
IndexNameExpressionResolver indexNameExpressionResolver, Client client, IndicesQueriesRegistry queryRegistry,
|
ActionFilters actionFilters, IndexNameExpressionResolver indexNameExpressionResolver,
|
||||||
AggregatorParsers aggParsers) {
|
Client client, SearchRequestParsers searchRequestParsers) {
|
||||||
super(settings, MultiPercolateAction.NAME, threadPool, transportService, actionFilters, indexNameExpressionResolver, MultiPercolateRequest::new);
|
super(settings, MultiPercolateAction.NAME, threadPool, transportService, actionFilters,
|
||||||
|
indexNameExpressionResolver, MultiPercolateRequest::new);
|
||||||
this.client = client;
|
this.client = client;
|
||||||
this.aggParsers = aggParsers;
|
this.searchRequestParsers = searchRequestParsers;
|
||||||
this.parseFieldMatcher = new ParseFieldMatcher(settings);
|
this.parseFieldMatcher = new ParseFieldMatcher(settings);
|
||||||
this.queryRegistry = queryRegistry;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -159,7 +159,8 @@ public class TransportMultiPercolateAction extends HandledTransportAction<MultiP
|
||||||
BytesReference docSource = getResponseSources.get(i);
|
BytesReference docSource = getResponseSources.get(i);
|
||||||
try {
|
try {
|
||||||
SearchRequest searchRequest = TransportPercolateAction.createSearchRequest(
|
SearchRequest searchRequest = TransportPercolateAction.createSearchRequest(
|
||||||
percolateRequest, docSource, queryRegistry, aggParsers, parseFieldMatcher
|
percolateRequest, docSource, searchRequestParsers.queryParsers,
|
||||||
|
searchRequestParsers.aggParsers, parseFieldMatcher
|
||||||
);
|
);
|
||||||
multiSearchRequest.add(searchRequest);
|
multiSearchRequest.add(searchRequest);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
|
@ -47,6 +47,7 @@ import org.elasticsearch.index.query.QueryParseContext;
|
||||||
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
||||||
import org.elasticsearch.search.SearchHit;
|
import org.elasticsearch.search.SearchHit;
|
||||||
import org.elasticsearch.search.SearchHits;
|
import org.elasticsearch.search.SearchHits;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
||||||
import org.elasticsearch.search.aggregations.InternalAggregations;
|
import org.elasticsearch.search.aggregations.InternalAggregations;
|
||||||
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
import org.elasticsearch.search.builder.SearchSourceBuilder;
|
||||||
|
@ -62,18 +63,16 @@ public class TransportPercolateAction extends HandledTransportAction<PercolateRe
|
||||||
|
|
||||||
private final Client client;
|
private final Client client;
|
||||||
private final ParseFieldMatcher parseFieldMatcher;
|
private final ParseFieldMatcher parseFieldMatcher;
|
||||||
private final IndicesQueriesRegistry queryRegistry;
|
private final SearchRequestParsers searchRequestParsers;
|
||||||
private final AggregatorParsers aggParsers;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public TransportPercolateAction(Settings settings, ThreadPool threadPool, TransportService transportService,
|
public TransportPercolateAction(Settings settings, ThreadPool threadPool, TransportService transportService,
|
||||||
ActionFilters actionFilters, IndexNameExpressionResolver indexNameExpressionResolver,
|
ActionFilters actionFilters, IndexNameExpressionResolver indexNameExpressionResolver,
|
||||||
Client client, IndicesQueriesRegistry indicesQueriesRegistry, AggregatorParsers aggParsers) {
|
Client client, SearchRequestParsers searchRequestParsers) {
|
||||||
super(settings, PercolateAction.NAME, threadPool, transportService, actionFilters, indexNameExpressionResolver, PercolateRequest::new);
|
super(settings, PercolateAction.NAME, threadPool, transportService, actionFilters, indexNameExpressionResolver, PercolateRequest::new);
|
||||||
this.client = client;
|
this.client = client;
|
||||||
this.aggParsers = aggParsers;
|
this.searchRequestParsers = searchRequestParsers;
|
||||||
this.parseFieldMatcher = new ParseFieldMatcher(settings);
|
this.parseFieldMatcher = new ParseFieldMatcher(settings);
|
||||||
this.queryRegistry = indicesQueriesRegistry;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -102,7 +101,8 @@ public class TransportPercolateAction extends HandledTransportAction<PercolateRe
|
||||||
private void innerDoExecute(PercolateRequest request, BytesReference docSource, ActionListener<PercolateResponse> listener) {
|
private void innerDoExecute(PercolateRequest request, BytesReference docSource, ActionListener<PercolateResponse> listener) {
|
||||||
SearchRequest searchRequest;
|
SearchRequest searchRequest;
|
||||||
try {
|
try {
|
||||||
searchRequest = createSearchRequest(request, docSource, queryRegistry, aggParsers, parseFieldMatcher);
|
searchRequest = createSearchRequest(request, docSource, searchRequestParsers.queryParsers,
|
||||||
|
searchRequestParsers.aggParsers, parseFieldMatcher);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
listener.onFailure(e);
|
listener.onFailure(e);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -32,6 +32,7 @@ import org.elasticsearch.rest.BytesRestResponse;
|
||||||
import org.elasticsearch.rest.RestChannel;
|
import org.elasticsearch.rest.RestChannel;
|
||||||
import org.elasticsearch.rest.RestRequest;
|
import org.elasticsearch.rest.RestRequest;
|
||||||
import org.elasticsearch.rest.RestStatus;
|
import org.elasticsearch.rest.RestStatus;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
||||||
import org.elasticsearch.search.suggest.Suggesters;
|
import org.elasticsearch.search.suggest.Suggesters;
|
||||||
import org.elasticsearch.tasks.LoggingTaskListener;
|
import org.elasticsearch.tasks.LoggingTaskListener;
|
||||||
|
@ -46,19 +47,14 @@ public abstract class AbstractBaseReindexRestHandler<
|
||||||
A extends GenericAction<Request, BulkIndexByScrollResponse>
|
A extends GenericAction<Request, BulkIndexByScrollResponse>
|
||||||
> extends BaseRestHandler {
|
> extends BaseRestHandler {
|
||||||
|
|
||||||
protected final IndicesQueriesRegistry indicesQueriesRegistry;
|
protected final SearchRequestParsers searchRequestParsers;
|
||||||
protected final AggregatorParsers aggParsers;
|
|
||||||
protected final Suggesters suggesters;
|
|
||||||
private final ClusterService clusterService;
|
private final ClusterService clusterService;
|
||||||
private final A action;
|
private final A action;
|
||||||
|
|
||||||
protected AbstractBaseReindexRestHandler(Settings settings, IndicesQueriesRegistry indicesQueriesRegistry,
|
protected AbstractBaseReindexRestHandler(Settings settings, SearchRequestParsers searchRequestParsers,
|
||||||
AggregatorParsers aggParsers, Suggesters suggesters,
|
|
||||||
ClusterService clusterService, A action) {
|
ClusterService clusterService, A action) {
|
||||||
super(settings);
|
super(settings);
|
||||||
this.indicesQueriesRegistry = indicesQueriesRegistry;
|
this.searchRequestParsers = searchRequestParsers;
|
||||||
this.aggParsers = aggParsers;
|
|
||||||
this.suggesters = suggesters;
|
|
||||||
this.clusterService = clusterService;
|
this.clusterService = clusterService;
|
||||||
this.action = action;
|
this.action = action;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,10 @@
|
||||||
|
|
||||||
package org.elasticsearch.index.reindex;
|
package org.elasticsearch.index.reindex;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
import org.elasticsearch.action.GenericAction;
|
import org.elasticsearch.action.GenericAction;
|
||||||
import org.elasticsearch.action.search.SearchRequest;
|
import org.elasticsearch.action.search.SearchRequest;
|
||||||
import org.elasticsearch.cluster.service.ClusterService;
|
import org.elasticsearch.cluster.service.ClusterService;
|
||||||
|
@ -29,16 +33,10 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
import org.elasticsearch.common.xcontent.XContentFactory;
|
import org.elasticsearch.common.xcontent.XContentFactory;
|
||||||
import org.elasticsearch.common.xcontent.XContentHelper;
|
import org.elasticsearch.common.xcontent.XContentHelper;
|
||||||
import org.elasticsearch.common.xcontent.XContentType;
|
import org.elasticsearch.common.xcontent.XContentType;
|
||||||
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
|
||||||
import org.elasticsearch.rest.RestRequest;
|
import org.elasticsearch.rest.RestRequest;
|
||||||
import org.elasticsearch.rest.action.RestActions;
|
import org.elasticsearch.rest.action.RestActions;
|
||||||
import org.elasticsearch.rest.action.search.RestSearchAction;
|
import org.elasticsearch.rest.action.search.RestSearchAction;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.search.suggest.Suggesters;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
import static org.elasticsearch.index.reindex.AbstractBulkByScrollRequest.SIZE_ALL_MATCHES;
|
import static org.elasticsearch.index.reindex.AbstractBulkByScrollRequest.SIZE_ALL_MATCHES;
|
||||||
|
|
||||||
|
@ -49,10 +47,9 @@ public abstract class AbstractBulkByQueryRestHandler<
|
||||||
Request extends AbstractBulkByScrollRequest<Request>,
|
Request extends AbstractBulkByScrollRequest<Request>,
|
||||||
A extends GenericAction<Request, BulkIndexByScrollResponse>> extends AbstractBaseReindexRestHandler<Request, A> {
|
A extends GenericAction<Request, BulkIndexByScrollResponse>> extends AbstractBaseReindexRestHandler<Request, A> {
|
||||||
|
|
||||||
protected AbstractBulkByQueryRestHandler(Settings settings, IndicesQueriesRegistry indicesQueriesRegistry,
|
protected AbstractBulkByQueryRestHandler(Settings settings, SearchRequestParsers searchRequestParsers,
|
||||||
AggregatorParsers aggParsers, Suggesters suggesters, ClusterService clusterService,
|
ClusterService clusterService, A action) {
|
||||||
A action) {
|
super(settings, searchRequestParsers, clusterService, action);
|
||||||
super(settings, indicesQueriesRegistry, aggParsers, suggesters, clusterService, action);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void parseInternalRequest(Request internal, RestRequest restRequest,
|
protected void parseInternalRequest(Request internal, RestRequest restRequest,
|
||||||
|
@ -111,7 +108,6 @@ public abstract class AbstractBulkByQueryRestHandler<
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RestSearchAction.parseSearchRequest(searchRequest, indicesQueriesRegistry, restRequest, parseFieldMatcher, aggParsers,
|
RestSearchAction.parseSearchRequest(searchRequest, restRequest, searchRequestParsers, parseFieldMatcher, content);
|
||||||
suggesters, content);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@ import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
||||||
import org.elasticsearch.rest.RestChannel;
|
import org.elasticsearch.rest.RestChannel;
|
||||||
import org.elasticsearch.rest.RestController;
|
import org.elasticsearch.rest.RestController;
|
||||||
import org.elasticsearch.rest.RestRequest;
|
import org.elasticsearch.rest.RestRequest;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
||||||
import org.elasticsearch.search.suggest.Suggesters;
|
import org.elasticsearch.search.suggest.Suggesters;
|
||||||
|
|
||||||
|
@ -43,9 +44,8 @@ public class RestDeleteByQueryAction extends AbstractBulkByQueryRestHandler<Dele
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public RestDeleteByQueryAction(Settings settings, RestController controller,
|
public RestDeleteByQueryAction(Settings settings, RestController controller,
|
||||||
IndicesQueriesRegistry indicesQueriesRegistry, AggregatorParsers aggParsers, Suggesters suggesters,
|
SearchRequestParsers searchRequestParsers, ClusterService clusterService) {
|
||||||
ClusterService clusterService) {
|
super(settings, searchRequestParsers, clusterService, DeleteByQueryAction.INSTANCE);
|
||||||
super(settings, indicesQueriesRegistry, aggParsers, suggesters, clusterService, DeleteByQueryAction.INSTANCE);
|
|
||||||
controller.registerHandler(POST, "/{index}/_delete_by_query", this);
|
controller.registerHandler(POST, "/{index}/_delete_by_query", this);
|
||||||
controller.registerHandler(POST, "/{index}/{type}/_delete_by_query", this);
|
controller.registerHandler(POST, "/{index}/{type}/_delete_by_query", this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,7 @@ import org.elasticsearch.rest.RestChannel;
|
||||||
import org.elasticsearch.rest.RestController;
|
import org.elasticsearch.rest.RestController;
|
||||||
import org.elasticsearch.rest.RestRequest;
|
import org.elasticsearch.rest.RestRequest;
|
||||||
import org.elasticsearch.script.Script;
|
import org.elasticsearch.script.Script;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
||||||
import org.elasticsearch.search.suggest.Suggesters;
|
import org.elasticsearch.search.suggest.Suggesters;
|
||||||
|
|
||||||
|
@ -85,8 +86,8 @@ public class RestReindexAction extends AbstractBaseReindexRestHandler<ReindexReq
|
||||||
XContentBuilder builder = XContentFactory.contentBuilder(parser.contentType());
|
XContentBuilder builder = XContentFactory.contentBuilder(parser.contentType());
|
||||||
builder.map(source);
|
builder.map(source);
|
||||||
try (XContentParser innerParser = parser.contentType().xContent().createParser(builder.bytes())) {
|
try (XContentParser innerParser = parser.contentType().xContent().createParser(builder.bytes())) {
|
||||||
request.getSearchRequest().source().parseXContent(context.queryParseContext(innerParser), context.aggParsers,
|
request.getSearchRequest().source().parseXContent(context.queryParseContext(innerParser),
|
||||||
context.suggesters);
|
context.searchRequestParsers.aggParsers, context.searchRequestParsers.suggesters);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -113,9 +114,8 @@ public class RestReindexAction extends AbstractBaseReindexRestHandler<ReindexReq
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public RestReindexAction(Settings settings, RestController controller,
|
public RestReindexAction(Settings settings, RestController controller,
|
||||||
IndicesQueriesRegistry indicesQueriesRegistry, AggregatorParsers aggParsers, Suggesters suggesters,
|
SearchRequestParsers searchRequestParsers, ClusterService clusterService) {
|
||||||
ClusterService clusterService) {
|
super(settings, searchRequestParsers, clusterService, ReindexAction.INSTANCE);
|
||||||
super(settings, indicesQueriesRegistry, aggParsers, suggesters, clusterService, ReindexAction.INSTANCE);
|
|
||||||
controller.registerHandler(POST, "/_reindex", this);
|
controller.registerHandler(POST, "/_reindex", this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,7 +131,7 @@ public class RestReindexAction extends AbstractBaseReindexRestHandler<ReindexReq
|
||||||
protected ReindexRequest buildRequest(RestRequest request) throws IOException {
|
protected ReindexRequest buildRequest(RestRequest request) throws IOException {
|
||||||
ReindexRequest internal = new ReindexRequest(new SearchRequest(), new IndexRequest());
|
ReindexRequest internal = new ReindexRequest(new SearchRequest(), new IndexRequest());
|
||||||
try (XContentParser xcontent = XContentFactory.xContent(request.content()).createParser(request.content())) {
|
try (XContentParser xcontent = XContentFactory.xContent(request.content()).createParser(request.content())) {
|
||||||
PARSER.parse(xcontent, internal, new ReindexParseContext(indicesQueriesRegistry, aggParsers, suggesters, parseFieldMatcher));
|
PARSER.parse(xcontent, internal, new ReindexParseContext(searchRequestParsers, parseFieldMatcher));
|
||||||
}
|
}
|
||||||
return internal;
|
return internal;
|
||||||
}
|
}
|
||||||
|
@ -225,21 +225,16 @@ public class RestReindexAction extends AbstractBaseReindexRestHandler<ReindexReq
|
||||||
}
|
}
|
||||||
|
|
||||||
static class ReindexParseContext implements ParseFieldMatcherSupplier {
|
static class ReindexParseContext implements ParseFieldMatcherSupplier {
|
||||||
private final IndicesQueriesRegistry indicesQueryRegistry;
|
private final SearchRequestParsers searchRequestParsers;
|
||||||
private final ParseFieldMatcher parseFieldMatcher;
|
private final ParseFieldMatcher parseFieldMatcher;
|
||||||
private final AggregatorParsers aggParsers;
|
|
||||||
private final Suggesters suggesters;
|
|
||||||
|
|
||||||
public ReindexParseContext(IndicesQueriesRegistry indicesQueryRegistry, AggregatorParsers aggParsers,
|
ReindexParseContext(SearchRequestParsers searchRequestParsers, ParseFieldMatcher parseFieldMatcher) {
|
||||||
Suggesters suggesters, ParseFieldMatcher parseFieldMatcher) {
|
this.searchRequestParsers = searchRequestParsers;
|
||||||
this.indicesQueryRegistry = indicesQueryRegistry;
|
|
||||||
this.aggParsers = aggParsers;
|
|
||||||
this.suggesters = suggesters;
|
|
||||||
this.parseFieldMatcher = parseFieldMatcher;
|
this.parseFieldMatcher = parseFieldMatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
public QueryParseContext queryParseContext(XContentParser parser) {
|
QueryParseContext queryParseContext(XContentParser parser) {
|
||||||
return new QueryParseContext(indicesQueryRegistry, parser, parseFieldMatcher);
|
return new QueryParseContext(searchRequestParsers.queryParsers, parser, parseFieldMatcher);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -32,6 +32,7 @@ import org.elasticsearch.rest.RestController;
|
||||||
import org.elasticsearch.rest.RestRequest;
|
import org.elasticsearch.rest.RestRequest;
|
||||||
import org.elasticsearch.script.Script;
|
import org.elasticsearch.script.Script;
|
||||||
import org.elasticsearch.script.ScriptService;
|
import org.elasticsearch.script.ScriptService;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
import org.elasticsearch.search.aggregations.AggregatorParsers;
|
||||||
import org.elasticsearch.search.suggest.Suggesters;
|
import org.elasticsearch.search.suggest.Suggesters;
|
||||||
|
|
||||||
|
@ -48,9 +49,8 @@ public class RestUpdateByQueryAction extends AbstractBulkByQueryRestHandler<Upda
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public RestUpdateByQueryAction(Settings settings, RestController controller,
|
public RestUpdateByQueryAction(Settings settings, RestController controller,
|
||||||
IndicesQueriesRegistry indicesQueriesRegistry, AggregatorParsers aggParsers, Suggesters suggesters,
|
SearchRequestParsers searchRequestParsers, ClusterService clusterService) {
|
||||||
ClusterService clusterService) {
|
super(settings, searchRequestParsers, clusterService, UpdateByQueryAction.INSTANCE);
|
||||||
super(settings, indicesQueriesRegistry, aggParsers, suggesters, clusterService, UpdateByQueryAction.INSTANCE);
|
|
||||||
controller.registerHandler(POST, "/{index}/_update_by_query", this);
|
controller.registerHandler(POST, "/{index}/_update_by_query", this);
|
||||||
controller.registerHandler(POST, "/{index}/{type}/_update_by_query", this);
|
controller.registerHandler(POST, "/{index}/{type}/_update_by_query", this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@ import org.elasticsearch.common.xcontent.json.JsonXContent;
|
||||||
import org.elasticsearch.index.reindex.RestReindexAction.ReindexParseContext;
|
import org.elasticsearch.index.reindex.RestReindexAction.ReindexParseContext;
|
||||||
import org.elasticsearch.index.reindex.remote.RemoteInfo;
|
import org.elasticsearch.index.reindex.remote.RemoteInfo;
|
||||||
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
|
||||||
|
import org.elasticsearch.search.SearchRequestParsers;
|
||||||
import org.elasticsearch.test.ESTestCase;
|
import org.elasticsearch.test.ESTestCase;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -109,8 +110,8 @@ public class RestReindexActionTests extends ESTestCase {
|
||||||
}
|
}
|
||||||
try (XContentParser p = JsonXContent.jsonXContent.createParser(request)) {
|
try (XContentParser p = JsonXContent.jsonXContent.createParser(request)) {
|
||||||
ReindexRequest r = new ReindexRequest(new SearchRequest(), new IndexRequest());
|
ReindexRequest r = new ReindexRequest(new SearchRequest(), new IndexRequest());
|
||||||
RestReindexAction.PARSER.parse(p, r,
|
SearchRequestParsers searchParsers = new SearchRequestParsers(new IndicesQueriesRegistry(), null, null);
|
||||||
new ReindexParseContext(new IndicesQueriesRegistry(), null, null, ParseFieldMatcher.STRICT));
|
RestReindexAction.PARSER.parse(p, r, new ReindexParseContext(searchParsers, ParseFieldMatcher.STRICT));
|
||||||
assertEquals("localhost", r.getRemoteInfo().getHost());
|
assertEquals("localhost", r.getRemoteInfo().getHost());
|
||||||
assertArrayEquals(new String[] {"source"}, r.getSearchRequest().indices());
|
assertArrayEquals(new String[] {"source"}, r.getSearchRequest().indices());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue