diff --git a/core/src/main/java/org/elasticsearch/action/count/CountRequest.java b/core/src/main/java/org/elasticsearch/action/count/CountRequest.java index dccae11908d..80c03e6f073 100644 --- a/core/src/main/java/org/elasticsearch/action/count/CountRequest.java +++ b/core/src/main/java/org/elasticsearch/action/count/CountRequest.java @@ -33,6 +33,7 @@ import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentHelper; +import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.io.IOException; @@ -44,9 +45,6 @@ import static org.elasticsearch.search.internal.SearchContext.DEFAULT_TERMINATE_ /** * A request to count the number of documents matching a specific query. Best created with * {@link org.elasticsearch.client.Requests#countRequest(String...)}. - *

- * The request requires the query source to be set either using {@link #source(QuerySourceBuilder)}, - * or {@link #source(byte[])}. * * @see CountResponse * @see org.elasticsearch.client.Client#count(CountRequest) @@ -64,12 +62,12 @@ public class CountRequest extends BroadcastRequest { @Nullable private String preference; - private BytesReference source; - private String[] types = Strings.EMPTY_ARRAY; private int terminateAfter = DEFAULT_TERMINATE_AFTER; + private SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + /** * Constructs a new count request against the provided indices. No indices provided means it will * run against all indices. @@ -94,67 +92,21 @@ public class CountRequest extends BroadcastRequest { return this; } - /** - * The source to execute. - */ - public BytesReference source() { - return source; - } /** - * The source to execute. + * The query to execute */ - public CountRequest source(QuerySourceBuilder sourceBuilder) { - this.source = sourceBuilder.buildAsBytes(Requests.CONTENT_TYPE); + public CountRequest query(QueryBuilder queryBuilder) { + this.searchSourceBuilder = new SearchSourceBuilder().query(queryBuilder); return this; } - /** - * The source to execute in the form of a map. - */ - @SuppressWarnings("unchecked") - public CountRequest source(Map querySource) { - try { - XContentBuilder builder = XContentFactory.contentBuilder(Requests.CONTENT_TYPE); - builder.map(querySource); - return source(builder); - } catch (IOException e) { - throw new ElasticsearchGenerationException("Failed to generate [" + querySource + "]", e); - } - } - - public CountRequest source(XContentBuilder builder) { - this.source = builder.bytes(); + public CountRequest searchSource(SearchSourceBuilder searchSourceBuilder) { + this.searchSourceBuilder = searchSourceBuilder; return this; } - /** - * The source to execute. It is preferable to use either {@link #source(byte[])} - * or {@link #source(QuerySourceBuilder)}. - */ - public CountRequest source(String querySource) { - this.source = new BytesArray(querySource); - return this; - } - /** - * The source to execute. - */ - public CountRequest source(byte[] querySource) { - return source(querySource, 0, querySource.length); - } - - /** - * The source to execute. - */ - public CountRequest source(byte[] querySource, int offset, int length) { - return source(new BytesArray(querySource, offset, length)); - } - - public CountRequest source(BytesReference querySource) { - this.source = querySource; - return this; - } /** * The types of documents the query will run against. Defaults to all types. @@ -232,7 +184,7 @@ public class CountRequest extends BroadcastRequest { public String toString() { String sSource = "_na_"; try { - sSource = XContentHelper.convertToJson(source, false); + sSource = XContentHelper.toString(searchSourceBuilder); } catch (Exception e) { // ignore } @@ -240,13 +192,6 @@ public class CountRequest extends BroadcastRequest { } public SearchRequest toSearchRequest() { - SearchRequest searchRequest = new SearchRequest(indices()); - searchRequest.indicesOptions(indicesOptions()); - searchRequest.types(types()); - searchRequest.routing(routing()); - searchRequest.preference(preference()); - // searchRequest.source(source()); NOCOMMIT fix this - SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.size(0); if (minScore() != DEFAULT_MIN_SCORE) { searchSourceBuilder.minScore(minScore()); @@ -254,7 +199,16 @@ public class CountRequest extends BroadcastRequest { if (terminateAfter() != DEFAULT_TERMINATE_AFTER) { searchSourceBuilder.terminateAfter(terminateAfter()); } - searchRequest.extraSource(searchSourceBuilder); + SearchRequest searchRequest = new SearchRequest(indices()); + searchRequest.source(searchSourceBuilder); + searchRequest.indicesOptions(indicesOptions()); + searchRequest.types(types()); + searchRequest.routing(routing()); + searchRequest.preference(preference()); return searchRequest; } + + SearchSourceBuilder sourceBuilder() { + return searchSourceBuilder; + } } diff --git a/core/src/main/java/org/elasticsearch/action/count/CountRequestBuilder.java b/core/src/main/java/org/elasticsearch/action/count/CountRequestBuilder.java index 54c60e5736a..068e197eefd 100644 --- a/core/src/main/java/org/elasticsearch/action/count/CountRequestBuilder.java +++ b/core/src/main/java/org/elasticsearch/action/count/CountRequestBuilder.java @@ -31,14 +31,13 @@ import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.search.builder.SearchSourceBuilder; /** * A count action request builder. */ public class CountRequestBuilder extends BroadcastOperationRequestBuilder { - private QuerySourceBuilder sourceBuilder; - public CountRequestBuilder(ElasticsearchClient client, CountAction action) { super(client, action, new CountRequest()); } @@ -87,45 +86,19 @@ public class CountRequestBuilder extends BroadcastOperationRequestBuilder builder) { + request.query(builder); return this; } @@ -134,21 +107,6 @@ public class CountRequestBuilder extends BroadcastOperationRequestBuilder listener) { CountRequest countRequest = beforeExecute(request); @@ -162,15 +120,8 @@ public class CountRequestBuilder extends BroadcastOperationRequestBuilder implem return this; } - public MultiSearchRequest add(byte[] data, int from, int length, - boolean isTemplateRequest, @Nullable String[] indices, @Nullable String[] types, @Nullable String searchType) throws Exception { - return add(new BytesArray(data, from, length), isTemplateRequest, indices, types, searchType, null, IndicesOptions.strictExpandOpenAndForbidClosed(), true); - } - - public MultiSearchRequest add(BytesReference data, boolean isTemplateRequest, @Nullable String[] indices, @Nullable String[] types, @Nullable String searchType, IndicesOptions indicesOptions) throws Exception { - return add(data, isTemplateRequest, indices, types, searchType, null, indicesOptions, true); - } - - public MultiSearchRequest add(BytesReference data, boolean isTemplateRequest, @Nullable String[] indices, @Nullable String[] types, @Nullable String searchType, @Nullable String routing, IndicesOptions indicesOptions, boolean allowExplicitIndex) throws Exception { - XContent xContent = XContentFactory.xContent(data); - int from = 0; - int length = data.length(); - byte marker = xContent.streamSeparator(); - while (true) { - int nextMarker = findNextMarker(marker, from, data, length); - if (nextMarker == -1) { - break; - } - // support first line with \n - if (nextMarker == 0) { - from = nextMarker + 1; - continue; - } - - SearchRequest searchRequest = new SearchRequest(); - if (indices != null) { - searchRequest.indices(indices); - } - if (indicesOptions != null) { - searchRequest.indicesOptions(indicesOptions); - } - if (types != null && types.length > 0) { - searchRequest.types(types); - } - if (routing != null) { - searchRequest.routing(routing); - } - searchRequest.searchType(searchType); - - IndicesOptions defaultOptions = IndicesOptions.strictExpandOpenAndForbidClosed(); - - - // now parse the action - if (nextMarker - from > 0) { - try (XContentParser parser = xContent.createParser(data.slice(from, nextMarker - from))) { - Map source = parser.map(); - for (Map.Entry entry : source.entrySet()) { - Object value = entry.getValue(); - if ("index".equals(entry.getKey()) || "indices".equals(entry.getKey())) { - if (!allowExplicitIndex) { - throw new IllegalArgumentException("explicit index in multi percolate is not allowed"); - } - searchRequest.indices(nodeStringArrayValue(value)); - } else if ("type".equals(entry.getKey()) || "types".equals(entry.getKey())) { - searchRequest.types(nodeStringArrayValue(value)); - } else if ("search_type".equals(entry.getKey()) || "searchType".equals(entry.getKey())) { - searchRequest.searchType(nodeStringValue(value, null)); - } else if ("request_cache".equals(entry.getKey()) || "requestCache".equals(entry.getKey())) { - searchRequest.requestCache(nodeBooleanValue(value)); - } else if ("preference".equals(entry.getKey())) { - searchRequest.preference(nodeStringValue(value, null)); - } else if ("routing".equals(entry.getKey())) { - searchRequest.routing(nodeStringValue(value, null)); - } - } - defaultOptions = IndicesOptions.fromMap(source, defaultOptions); - } - } - searchRequest.indicesOptions(defaultOptions); - - // move pointers - from = nextMarker + 1; - // now for the body - nextMarker = findNextMarker(marker, from, data, length); - if (nextMarker == -1) { - break; - } - if (isTemplateRequest) { - searchRequest.templateSource(data.slice(from, nextMarker - from)); - } else { - // searchRequest.source(data.slice(from, nextMarker - from)); - // NOCOMMIT fix this - } - // move pointers - from = nextMarker + 1; - - add(searchRequest); - } - - return this; - } - - private int findNextMarker(byte marker, int from, BytesReference data, int length) { - for (int i = from; i < length; i++) { - if (data.get(i) == marker) { - return i; - } - } - return -1; - } - public List requests() { return this.requests; } diff --git a/core/src/main/java/org/elasticsearch/action/search/SearchRequest.java b/core/src/main/java/org/elasticsearch/action/search/SearchRequest.java index 6a11cd0721d..538fb05469d 100644 --- a/core/src/main/java/org/elasticsearch/action/search/SearchRequest.java +++ b/core/src/main/java/org/elasticsearch/action/search/SearchRequest.java @@ -32,15 +32,11 @@ import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.unit.TimeValue; -import org.elasticsearch.script.ScriptService; -import org.elasticsearch.script.ScriptService.ScriptType; import org.elasticsearch.script.Template; -import org.elasticsearch.script.mustache.MustacheScriptEngineService; import org.elasticsearch.search.Scroll; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.io.IOException; -import java.util.Map; import static org.elasticsearch.search.Scroll.readScroll; @@ -50,9 +46,7 @@ import static org.elasticsearch.search.Scroll.readScroll; *

* Note, the search {@link #source(org.elasticsearch.search.builder.SearchSourceBuilder)} * is required. The search source is the different search options, including aggregations and such. - *

- * There is an option to specify an addition search source using the {@link #extraSource(org.elasticsearch.search.builder.SearchSourceBuilder)}. - * + *

* @see org.elasticsearch.client.Requests#searchRequest(String...) * @see org.elasticsearch.client.Client#search(SearchRequest) * @see SearchResponse @@ -68,12 +62,8 @@ public class SearchRequest extends ActionRequest implements Indic @Nullable private String preference; - private BytesReference templateSource; - private Template template; - private SearchSourceBuilder source; - private BytesReference extraSource; private Boolean requestCache; private Scroll scroll; @@ -84,6 +74,8 @@ public class SearchRequest extends ActionRequest implements Indic private IndicesOptions indicesOptions = DEFAULT_INDICES_OPTIONS; + private Template template; + public SearchRequest() { } @@ -97,10 +89,8 @@ public class SearchRequest extends ActionRequest implements Indic this.indices = searchRequest.indices; this.routing = searchRequest.routing; this.preference = searchRequest.preference; - this.templateSource = searchRequest.templateSource; this.template = searchRequest.template; this.source = searchRequest.source; - this.extraSource = searchRequest.extraSource; this.requestCache = searchRequest.requestCache; this.scroll = searchRequest.scroll; this.types = searchRequest.types; @@ -248,7 +238,6 @@ public class SearchRequest extends ActionRequest implements Indic return this; } - /** * The search source to execute. */ @@ -256,40 +245,6 @@ public class SearchRequest extends ActionRequest implements Indic return source; } - /** - * The search source template to execute. - */ - public BytesReference templateSource() { - return templateSource; - } - - /** - * Allows to provide additional source that will be used as well. - */ - public SearchRequest extraSource(SearchSourceBuilder sourceBuilder) { - if (sourceBuilder == null) { - extraSource = null; - return this; - } - this.extraSource = sourceBuilder.buildAsBytes(Requests.CONTENT_TYPE); - return this; - } - - /** - * Allows to provide template as source. - */ - public SearchRequest templateSource(BytesReference template) { - this.templateSource = template; - return this; - } - - /** - * The template of the search request. - */ - public SearchRequest templateSource(String template) { - this.templateSource = new BytesArray(template); - return this; - } /** * The stored template @@ -305,88 +260,6 @@ public class SearchRequest extends ActionRequest implements Indic return template; } - /** - * The name of the stored template - * - * @deprecated use {@link #template(Template)} instead. - */ - @Deprecated - public void templateName(String templateName) { - updateOrCreateScript(templateName, null, null, null); - } - - /** - * The type of the stored template - * - * @deprecated use {@link #template(Template)} instead. - */ - @Deprecated - public void templateType(ScriptService.ScriptType templateType) { - updateOrCreateScript(null, templateType, null, null); - } - - /** - * Template parameters used for rendering - * - * @deprecated use {@link #template(Template)} instead. - */ - @Deprecated - public void templateParams(Map params) { - updateOrCreateScript(null, null, null, params); - } - - /** - * The name of the stored template - * - * @deprecated use {@link #template()} instead. - */ - @Deprecated - public String templateName() { - return template == null ? null : template.getScript(); - } - - /** - * The name of the stored template - * - * @deprecated use {@link #template()} instead. - */ - @Deprecated - public ScriptService.ScriptType templateType() { - return template == null ? null : template.getType(); - } - - /** - * Template parameters used for rendering - * - * @deprecated use {@link #template()} instead. - */ - @Deprecated - public Map templateParams() { - return template == null ? null : template.getParams(); - } - - private void updateOrCreateScript(String templateContent, ScriptType type, String lang, Map params) { - Template template = template(); - if (template == null) { - template = new Template(templateContent == null ? "" : templateContent, type == null ? ScriptType.INLINE : type, lang, null, - params); - } else { - String newTemplateContent = templateContent == null ? template.getScript() : templateContent; - ScriptType newTemplateType = type == null ? template.getType() : type; - String newTemplateLang = lang == null ? template.getLang() : lang; - Map newTemplateParams = params == null ? template.getParams() : params; - template = new Template(newTemplateContent, newTemplateType, MustacheScriptEngineService.NAME, null, newTemplateParams); - } - template(template); - } - - /** - * Additional search source to execute. - */ - public BytesReference extraSource() { - return this.extraSource; - } - /** * The tye of search to execute. */ @@ -463,16 +336,12 @@ public class SearchRequest extends ActionRequest implements Indic } source = SearchSourceBuilder.PROTOTYPE.readFrom(in); - extraSource = in.readBytesReference(); types = in.readStringArray(); indicesOptions = IndicesOptions.readIndicesOptions(in); - templateSource = in.readBytesReference(); - if (in.readBoolean()) { - template = Template.readTemplate(in); - } requestCache = in.readOptionalBoolean(); + template = in.readOptionalStreamable(new Template()); } @Override @@ -495,17 +364,9 @@ public class SearchRequest extends ActionRequest implements Indic scroll.writeTo(out); } source.writeTo(out); - out.writeBytesReference(extraSource); out.writeStringArray(types); indicesOptions.writeIndicesOptions(out); - - out.writeBytesReference(templateSource); - boolean hasTemplate = template != null; - out.writeBoolean(hasTemplate); - if (hasTemplate) { - template.writeTo(out); - } - out.writeOptionalBoolean(requestCache); + out.writeOptionalStreamable(template); } } diff --git a/core/src/main/java/org/elasticsearch/action/search/SearchRequestBuilder.java b/core/src/main/java/org/elasticsearch/action/search/SearchRequestBuilder.java index af8ad8657a5..75392c7a68b 100644 --- a/core/src/main/java/org/elasticsearch/action/search/SearchRequestBuilder.java +++ b/core/src/main/java/org/elasticsearch/action/search/SearchRequestBuilder.java @@ -455,25 +455,13 @@ public class SearchRequestBuilder extends ActionRequestBuilder { public TemplateQueryBuilder getBuilderPrototype() { return TemplateQueryBuilder.PROTOTYPE; } + + } diff --git a/core/src/main/java/org/elasticsearch/index/search/stats/SearchSlowLog.java b/core/src/main/java/org/elasticsearch/index/search/stats/SearchSlowLog.java index 72aaa33c3d7..108dab449a3 100644 --- a/core/src/main/java/org/elasticsearch/index/search/stats/SearchSlowLog.java +++ b/core/src/main/java/org/elasticsearch/index/search/stats/SearchSlowLog.java @@ -194,15 +194,6 @@ public final class SearchSlowLog{ } else { sb.append("source[], "); } - if (context.request().extraSource() != null && context.request().extraSource().length() > 0) { - try { - sb.append("extra_source[").append(XContentHelper.convertToJson(context.request().extraSource(), reformat)).append("], "); - } catch (IOException e) { - sb.append("extra_source[_failed_to_convert_], "); - } - } else { - sb.append("extra_source[], "); - } return sb.toString(); } } diff --git a/core/src/main/java/org/elasticsearch/indices/cache/request/IndicesRequestCache.java b/core/src/main/java/org/elasticsearch/indices/cache/request/IndicesRequestCache.java index 4ab4691c166..5048c7dc1fc 100644 --- a/core/src/main/java/org/elasticsearch/indices/cache/request/IndicesRequestCache.java +++ b/core/src/main/java/org/elasticsearch/indices/cache/request/IndicesRequestCache.java @@ -207,11 +207,6 @@ public class IndicesRequestCache extends AbstractComponent implements RemovalLis * Can the shard request be cached at all? */ public boolean canCache(ShardSearchRequest request, SearchContext context) { - // TODO: for now, template is not supported, though we could use the generated bytes as the key - if (hasLength(request.templateSource())) { - return false; - } - // for now, only enable it for requests with no hits if (context.size() != 0) { return false; diff --git a/core/src/main/java/org/elasticsearch/rest/action/cat/RestCountAction.java b/core/src/main/java/org/elasticsearch/rest/action/cat/RestCountAction.java index ce094d0c8d8..86029e5343f 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/cat/RestCountAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/cat/RestCountAction.java @@ -19,36 +19,48 @@ package org.elasticsearch.rest.action.cat; +import org.elasticsearch.ElasticsearchException; import org.elasticsearch.action.count.CountRequest; import org.elasticsearch.action.count.CountResponse; import org.elasticsearch.action.support.QuerySourceBuilder; +import org.elasticsearch.bootstrap.Elasticsearch; import org.elasticsearch.client.Client; import org.elasticsearch.common.Strings; import org.elasticsearch.common.Table; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryParseContext; +import org.elasticsearch.indices.query.IndicesQueriesRegistry; import org.elasticsearch.rest.RestChannel; import org.elasticsearch.rest.RestController; import org.elasticsearch.rest.RestRequest; import org.elasticsearch.rest.RestResponse; +import org.elasticsearch.rest.action.search.RestSearchAction; import org.elasticsearch.rest.action.support.RestActions; import org.elasticsearch.rest.action.support.RestResponseListener; import org.elasticsearch.rest.action.support.RestTable; +import org.elasticsearch.search.builder.SearchSourceBuilder; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; +import java.io.IOException; import java.util.concurrent.TimeUnit; import static org.elasticsearch.rest.RestRequest.Method.GET; public class RestCountAction extends AbstractCatAction { + private final IndicesQueriesRegistry indicesQueriesRegistry; + @Inject - public RestCountAction(Settings settings, RestController restController, RestController controller, Client client) { + public RestCountAction(Settings settings, RestController restController, RestController controller, Client client, IndicesQueriesRegistry indicesQueriesRegistry) { super(settings, controller, client); restController.registerHandler(GET, "/_cat/count", this); restController.registerHandler(GET, "/_cat/count/{index}", this); + this.indicesQueriesRegistry = indicesQueriesRegistry; } @Override @@ -63,16 +75,22 @@ public class RestCountAction extends AbstractCatAction { CountRequest countRequest = new CountRequest(indices); String source = request.param("source"); if (source != null) { - countRequest.source(source); + try (XContentParser requestParser = XContentFactory.xContent(source).createParser(source)) { + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); + context.reset(requestParser); + final SearchSourceBuilder builder = SearchSourceBuilder.PROTOTYPE.fromXContent(requestParser, context); + countRequest.searchSource(builder); + } catch (IOException e) { + throw new ElasticsearchException("failed to parse source", e); + } } else { QueryBuilder queryBuilder = RestActions.parseQuerySource(request); if (queryBuilder != null) { QuerySourceBuilder querySourceBuilder = new QuerySourceBuilder(); querySourceBuilder.setQuery(queryBuilder); - countRequest.source(querySourceBuilder.buildAsBytes()); + countRequest.query(queryBuilder); } } - client.count(countRequest, new RestResponseListener(channel) { @Override public RestResponse buildResponse(CountResponse countResponse) throws Exception { diff --git a/core/src/main/java/org/elasticsearch/rest/action/count/RestCountAction.java b/core/src/main/java/org/elasticsearch/rest/action/count/RestCountAction.java index 512b3b7d5bf..c0548cefcb1 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/count/RestCountAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/count/RestCountAction.java @@ -19,16 +19,22 @@ package org.elasticsearch.rest.action.count; +import org.elasticsearch.ElasticsearchException; import org.elasticsearch.action.count.CountRequest; import org.elasticsearch.action.count.CountResponse; import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.support.QuerySourceBuilder; import org.elasticsearch.client.Client; import org.elasticsearch.common.Strings; +import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryParseContext; +import org.elasticsearch.indices.query.IndicesQueriesRegistry; import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.BytesRestResponse; import org.elasticsearch.rest.RestChannel; @@ -37,6 +43,9 @@ import org.elasticsearch.rest.RestRequest; import org.elasticsearch.rest.RestResponse; import org.elasticsearch.rest.action.support.RestActions; import org.elasticsearch.rest.action.support.RestBuilderListener; +import org.elasticsearch.search.builder.SearchSourceBuilder; + +import java.io.IOException; import static org.elasticsearch.action.count.CountRequest.DEFAULT_MIN_SCORE; import static org.elasticsearch.rest.RestRequest.Method.GET; @@ -49,8 +58,10 @@ import static org.elasticsearch.search.internal.SearchContext.DEFAULT_TERMINATE_ */ public class RestCountAction extends BaseRestHandler { + private final IndicesQueriesRegistry indicesQueriesRegistry; + @Inject - public RestCountAction(Settings settings, RestController controller, Client client) { + public RestCountAction(Settings settings, RestController controller, Client client, IndicesQueriesRegistry indicesQueriesRegistry) { super(settings, controller, client); controller.registerHandler(POST, "/_count", this); controller.registerHandler(GET, "/_count", this); @@ -58,6 +69,7 @@ public class RestCountAction extends BaseRestHandler { controller.registerHandler(GET, "/{index}/_count", this); controller.registerHandler(POST, "/{index}/{type}/_count", this); controller.registerHandler(GET, "/{index}/{type}/_count", this); + this.indicesQueriesRegistry = indicesQueriesRegistry; } @Override @@ -65,13 +77,19 @@ public class RestCountAction extends BaseRestHandler { CountRequest countRequest = new CountRequest(Strings.splitStringByCommaToArray(request.param("index"))); countRequest.indicesOptions(IndicesOptions.fromRequest(request, countRequest.indicesOptions())); if (RestActions.hasBodyContent(request)) { - countRequest.source(RestActions.getRestContent(request)); + BytesReference restContent = RestActions.getRestContent(request); + try (XContentParser requestParser = XContentFactory.xContent(restContent).createParser(restContent)) { + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); + context.reset(requestParser); + final SearchSourceBuilder builder = SearchSourceBuilder.PROTOTYPE.fromXContent(requestParser, context); + countRequest.searchSource(builder); + } catch (IOException e) { + throw new ElasticsearchException("failed to parse source", e); + } } else { QueryBuilder queryBuilder = RestActions.parseQuerySource(request); if (queryBuilder != null) { - QuerySourceBuilder querySourceBuilder = new QuerySourceBuilder(); - querySourceBuilder.setQuery(queryBuilder); - countRequest.source(querySourceBuilder.buildAsBytes()); + countRequest.query(queryBuilder); } } countRequest.routing(request.param("routing")); diff --git a/core/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java b/core/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java index af1f2f464a7..31bf0ab3022 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/search/RestMultiSearchAction.java @@ -20,16 +20,31 @@ package org.elasticsearch.rest.action.search; import org.elasticsearch.action.search.MultiSearchRequest; -import org.elasticsearch.action.search.MultiSearchResponse; +import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.client.Client; +import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Strings; +import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContent; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.index.query.QueryParseContext; +import org.elasticsearch.index.query.TemplateQueryParser; +import org.elasticsearch.indices.query.IndicesQueriesRegistry; import org.elasticsearch.rest.*; import org.elasticsearch.rest.action.support.RestActions; import org.elasticsearch.rest.action.support.RestToXContentListener; +import org.elasticsearch.script.Template; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import java.util.Map; + +import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeBooleanValue; +import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeStringArrayValue; +import static org.elasticsearch.common.xcontent.support.XContentMapValues.nodeStringValue; import static org.elasticsearch.rest.RestRequest.Method.GET; import static org.elasticsearch.rest.RestRequest.Method.POST; @@ -38,9 +53,11 @@ import static org.elasticsearch.rest.RestRequest.Method.POST; public class RestMultiSearchAction extends BaseRestHandler { private final boolean allowExplicitIndex; + private final IndicesQueriesRegistry indicesQueriesRegistry; + @Inject - public RestMultiSearchAction(Settings settings, RestController controller, Client client) { + public RestMultiSearchAction(Settings settings, RestController controller, Client client, IndicesQueriesRegistry indicesQueriesRegistry) { super(settings, controller, client); controller.registerHandler(GET, "/_msearch", this); @@ -58,6 +75,7 @@ public class RestMultiSearchAction extends BaseRestHandler { controller.registerHandler(POST, "/{index}/{type}/_msearch/template", this); this.allowExplicitIndex = settings.getAsBoolean("rest.action.multi.allow_explicit_index", true); + this.indicesQueriesRegistry = indicesQueriesRegistry; } @Override @@ -69,12 +87,117 @@ public class RestMultiSearchAction extends BaseRestHandler { String path = request.path(); boolean isTemplateRequest = isTemplateRequest(path); IndicesOptions indicesOptions = IndicesOptions.fromRequest(request, multiSearchRequest.indicesOptions()); - multiSearchRequest.add(RestActions.getRestContent(request), isTemplateRequest, indices, types, request.param("search_type"), request.param("routing"), indicesOptions, allowExplicitIndex); - - client.multiSearch(multiSearchRequest, new RestToXContentListener(channel)); + parseRequest(multiSearchRequest, RestActions.getRestContent(request), isTemplateRequest, indices, types, request.param("search_type"), request.param("routing"), indicesOptions, allowExplicitIndex, indicesQueriesRegistry); + client.multiSearch(multiSearchRequest, new RestToXContentListener<>(channel)); } private boolean isTemplateRequest(String path) { return (path != null && path.endsWith("/template")); } + + public static MultiSearchRequest parseRequest(MultiSearchRequest msr, BytesReference data, boolean isTemplateRequest, + @Nullable String[] indices, + @Nullable String[] types, + @Nullable String searchType, + @Nullable String routing, + IndicesOptions indicesOptions, + boolean allowExplicitIndex, IndicesQueriesRegistry indicesQueriesRegistry) throws Exception { + XContent xContent = XContentFactory.xContent(data); + int from = 0; + int length = data.length(); + byte marker = xContent.streamSeparator(); + final QueryParseContext queryParseContext = new QueryParseContext(indicesQueriesRegistry); + while (true) { + int nextMarker = findNextMarker(marker, from, data, length); + if (nextMarker == -1) { + break; + } + // support first line with \n + if (nextMarker == 0) { + from = nextMarker + 1; + continue; + } + + SearchRequest searchRequest = new SearchRequest(); + if (indices != null) { + searchRequest.indices(indices); + } + if (indicesOptions != null) { + searchRequest.indicesOptions(indicesOptions); + } + if (types != null && types.length > 0) { + searchRequest.types(types); + } + if (routing != null) { + searchRequest.routing(routing); + } + searchRequest.searchType(searchType); + + IndicesOptions defaultOptions = IndicesOptions.strictExpandOpenAndForbidClosed(); + + + // now parse the action + if (nextMarker - from > 0) { + try (XContentParser parser = xContent.createParser(data.slice(from, nextMarker - from))) { + Map source = parser.map(); + for (Map.Entry entry : source.entrySet()) { + Object value = entry.getValue(); + if ("index".equals(entry.getKey()) || "indices".equals(entry.getKey())) { + if (!allowExplicitIndex) { + throw new IllegalArgumentException("explicit index in multi percolate is not allowed"); + } + searchRequest.indices(nodeStringArrayValue(value)); + } else if ("type".equals(entry.getKey()) || "types".equals(entry.getKey())) { + searchRequest.types(nodeStringArrayValue(value)); + } else if ("search_type".equals(entry.getKey()) || "searchType".equals(entry.getKey())) { + searchRequest.searchType(nodeStringValue(value, null)); + } else if ("request_cache".equals(entry.getKey()) || "requestCache".equals(entry.getKey())) { + searchRequest.requestCache(nodeBooleanValue(value)); + } else if ("preference".equals(entry.getKey())) { + searchRequest.preference(nodeStringValue(value, null)); + } else if ("routing".equals(entry.getKey())) { + searchRequest.routing(nodeStringValue(value, null)); + } + } + defaultOptions = IndicesOptions.fromMap(source, defaultOptions); + } + } + searchRequest.indicesOptions(defaultOptions); + + // move pointers + from = nextMarker + 1; + // now for the body + nextMarker = findNextMarker(marker, from, data, length); + if (nextMarker == -1) { + break; + } + final BytesReference slice = data.slice(from, nextMarker - from); + if (isTemplateRequest) { + try (XContentParser parser = XContentFactory.xContent(slice).createParser(slice)) { + queryParseContext.reset(parser); + Template template = TemplateQueryParser.parse(parser, queryParseContext.parseFieldMatcher(), "params", "template"); + searchRequest.template(template); + } + } else { + try (XContentParser requestParser = XContentFactory.xContent(slice).createParser(slice)) { + queryParseContext.reset(requestParser); + searchRequest.source(SearchSourceBuilder.PROTOTYPE.fromXContent(requestParser, queryParseContext)); + } + } + // move pointers + from = nextMarker + 1; + + msr.add(searchRequest); + } + return msr; + } + + private static int findNextMarker(byte marker, int from, BytesReference data, int length) { + for (int i = from; i < length; i++) { + if (data.get(i) == marker) { + return i; + } + } + return -1; + } } diff --git a/core/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java b/core/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java index 093db18b9fd..091c71df786 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java @@ -20,7 +20,6 @@ package org.elasticsearch.rest.action.search; import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchType; import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.client.Client; @@ -31,8 +30,10 @@ import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.index.Index; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryParseContext; +import org.elasticsearch.index.query.TemplateQueryParser; import org.elasticsearch.indices.query.IndicesQueriesRegistry; import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.RestChannel; @@ -41,6 +42,8 @@ import org.elasticsearch.rest.RestRequest; import org.elasticsearch.rest.action.exists.RestExistsAction; import org.elasticsearch.rest.action.support.RestActions; import org.elasticsearch.rest.action.support.RestStatusToXContentListener; +import org.elasticsearch.script.ScriptService; +import org.elasticsearch.script.Template; import org.elasticsearch.search.Scroll; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.fetch.source.FetchSourceContext; @@ -91,26 +94,36 @@ public class RestSearchAction extends BaseRestHandler { @Override public void handleRequest(final RestRequest request, final RestChannel channel, final Client client) throws IOException { SearchRequest searchRequest; - searchRequest = RestSearchAction.parseSearchRequest(request, parseFieldMatcher, queryRegistry); - client.search(searchRequest, new RestStatusToXContentListener(channel)); + searchRequest = RestSearchAction.parseSearchRequest(queryRegistry, request, parseFieldMatcher); + client.search(searchRequest, new RestStatusToXContentListener<>(channel)); } - public static SearchRequest parseSearchRequest(RestRequest request, ParseFieldMatcher parseFieldMatcher, IndicesQueriesRegistry queryRegistry) throws IOException { + public static SearchRequest parseSearchRequest(IndicesQueriesRegistry indicesQueriesRegistry, RestRequest request, ParseFieldMatcher parseFieldMatcher) throws IOException { String[] indices = Strings.splitStringByCommaToArray(request.param("index")); SearchRequest searchRequest = new SearchRequest(indices); // get the content, and put it in the body // add content/source as template if template flag is set boolean isTemplateRequest = request.path().endsWith("/template"); + final SearchSourceBuilder builder; if (RestActions.hasBodyContent(request)) { + BytesReference restContent = RestActions.getRestContent(request); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); + System.out.println(restContent.toUtf8()); if (isTemplateRequest) { - searchRequest.templateSource(RestActions.getRestContent(request)); + try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) { + context.reset(parser); + Template template = TemplateQueryParser.parse(parser, context.parseFieldMatcher(), "params", "template"); + searchRequest.template(template); + } + builder = null; } else { - BytesReference sourceBytes = RestActions.getRestContent(request); - XContentParser parser = XContentFactory.xContent(sourceBytes).createParser(sourceBytes); - QueryParseContext queryParseContext = new QueryParseContext(queryRegistry); - queryParseContext.reset(parser); - searchRequest.source(SearchSourceBuilder.PROTOTYPE.fromXContent(parser, queryParseContext)); + try (XContentParser requestParser = XContentFactory.xContent(restContent).createParser(restContent)) { + context.reset(requestParser); + builder = SearchSourceBuilder.PROTOTYPE.fromXContent(requestParser, context); + } } + } else { + builder = null; } // do not allow 'query_and_fetch' or 'dfs_query_and_fetch' search types @@ -123,8 +136,15 @@ public class RestSearchAction extends BaseRestHandler { } else { searchRequest.searchType(searchType); } - - searchRequest.extraSource(parseSearchSource(request)); + if (builder == null) { + SearchSourceBuilder extraBuilder = new SearchSourceBuilder(); + if (parseSearchSource(extraBuilder, request)) { + searchRequest.source(extraBuilder); + } + } else { + parseSearchSource(builder, request); + searchRequest.source(builder); + } searchRequest.requestCache(request.paramAsBoolean("request_cache", null)); String scroll = request.param("scroll"); @@ -140,111 +160,89 @@ public class RestSearchAction extends BaseRestHandler { return searchRequest; } - public static SearchSourceBuilder parseSearchSource(RestRequest request) { - SearchSourceBuilder searchSourceBuilder = null; + public static boolean parseSearchSource(final SearchSourceBuilder searchSourceBuilder, RestRequest request) { + boolean modified = false; QueryBuilder queryBuilder = RestActions.parseQuerySource(request); if (queryBuilder != null) { - searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(queryBuilder); + modified = true; } int from = request.paramAsInt("from", -1); if (from != -1) { - if (searchSourceBuilder == null) { - searchSourceBuilder = new SearchSourceBuilder(); - } searchSourceBuilder.from(from); + modified = true; } int size = request.paramAsInt("size", -1); if (size != -1) { - if (searchSourceBuilder == null) { - searchSourceBuilder = new SearchSourceBuilder(); - } searchSourceBuilder.size(size); + modified = true; } if (request.hasParam("explain")) { - if (searchSourceBuilder == null) { - searchSourceBuilder = new SearchSourceBuilder(); - } searchSourceBuilder.explain(request.paramAsBoolean("explain", null)); + modified = true; } if (request.hasParam("version")) { - if (searchSourceBuilder == null) { - searchSourceBuilder = new SearchSourceBuilder(); - } searchSourceBuilder.version(request.paramAsBoolean("version", null)); + modified = true; } if (request.hasParam("timeout")) { - if (searchSourceBuilder == null) { - searchSourceBuilder = new SearchSourceBuilder(); - } searchSourceBuilder.timeout(request.paramAsTime("timeout", null)); + modified = true; } if (request.hasParam("terminate_after")) { - if (searchSourceBuilder == null) { - searchSourceBuilder = new SearchSourceBuilder(); - } int terminateAfter = request.paramAsInt("terminate_after", SearchContext.DEFAULT_TERMINATE_AFTER); if (terminateAfter < 0) { throw new IllegalArgumentException("terminateAfter must be > 0"); } else if (terminateAfter > 0) { searchSourceBuilder.terminateAfter(terminateAfter); + modified = true; } } String sField = request.param("fields"); if (sField != null) { - if (searchSourceBuilder == null) { - searchSourceBuilder = new SearchSourceBuilder(); - } if (!Strings.hasText(sField)) { searchSourceBuilder.noFields(); + modified = true; } else { String[] sFields = Strings.splitStringByCommaToArray(sField); if (sFields != null) { for (String field : sFields) { searchSourceBuilder.field(field); + modified = true; } } } } String sFieldDataFields = request.param("fielddata_fields"); if (sFieldDataFields != null) { - if (searchSourceBuilder == null) { - searchSourceBuilder = new SearchSourceBuilder(); - } if (Strings.hasText(sFieldDataFields)) { String[] sFields = Strings.splitStringByCommaToArray(sFieldDataFields); if (sFields != null) { for (String field : sFields) { searchSourceBuilder.fieldDataField(field); + modified = true; } } } } FetchSourceContext fetchSourceContext = FetchSourceContext.parseFromRestRequest(request); if (fetchSourceContext != null) { - if (searchSourceBuilder == null) { - searchSourceBuilder = new SearchSourceBuilder(); - } searchSourceBuilder.fetchSource(fetchSourceContext); + modified = true; } if (request.hasParam("track_scores")) { - if (searchSourceBuilder == null) { - searchSourceBuilder = new SearchSourceBuilder(); - } searchSourceBuilder.trackScores(request.paramAsBoolean("track_scores", false)); + modified = true; } String sSorts = request.param("sort"); if (sSorts != null) { - if (searchSourceBuilder == null) { - searchSourceBuilder = new SearchSourceBuilder(); - } String[] sorts = Strings.splitStringByCommaToArray(sSorts); for (String sort : sorts) { int delimiter = sort.lastIndexOf(":"); @@ -253,37 +251,33 @@ public class RestSearchAction extends BaseRestHandler { String reverse = sort.substring(delimiter + 1); if ("asc".equals(reverse)) { searchSourceBuilder.sort(sortField, SortOrder.ASC); + modified = true; } else if ("desc".equals(reverse)) { searchSourceBuilder.sort(sortField, SortOrder.DESC); + modified = true; } } else { searchSourceBuilder.sort(sort); + modified = true; } } } String sStats = request.param("stats"); if (sStats != null) { - if (searchSourceBuilder == null) { - searchSourceBuilder = new SearchSourceBuilder(); - } searchSourceBuilder.stats(Strings.splitStringByCommaToArray(sStats)); + modified = true; } String suggestField = request.param("suggest_field"); if (suggestField != null) { String suggestText = request.param("suggest_text", request.param("q")); int suggestSize = request.paramAsInt("suggest_size", 5); - if (searchSourceBuilder == null) { - searchSourceBuilder = new SearchSourceBuilder(); - } String suggestMode = request.param("suggest_mode"); searchSourceBuilder.suggest(new SuggestBuilder().addSuggestion( - termSuggestion(suggestField).field(suggestField).text(suggestText).size(suggestSize) -.suggestMode(suggestMode)) - ); + termSuggestion(suggestField).field(suggestField).text(suggestText).size(suggestSize).suggestMode(suggestMode))); + modified = true; } - - return searchSourceBuilder; + return modified; } } diff --git a/core/src/main/java/org/elasticsearch/search/SearchService.java b/core/src/main/java/org/elasticsearch/search/SearchService.java index d7530e6f0aa..483854f8b1f 100644 --- a/core/src/main/java/org/elasticsearch/search/SearchService.java +++ b/core/src/main/java/org/elasticsearch/search/SearchService.java @@ -34,6 +34,7 @@ import org.elasticsearch.action.search.SearchType; import org.elasticsearch.cache.recycler.PageCacheRecycler; import org.elasticsearch.cluster.ClusterService; import org.elasticsearch.cluster.metadata.IndexMetaData; +import org.elasticsearch.common.HasContextAndHeaders; import org.elasticsearch.common.Nullable; import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.bytes.BytesReference; @@ -50,6 +51,7 @@ import org.elasticsearch.common.util.concurrent.FutureUtils; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentLocation; import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.Index; import org.elasticsearch.index.IndexService; import org.elasticsearch.index.engine.Engine; @@ -62,6 +64,7 @@ import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MappedFieldType.Loading; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.mapper.internal.ParentFieldMapper; +import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.index.query.TemplateQueryParser; import org.elasticsearch.index.search.stats.ShardSearchStats; import org.elasticsearch.index.search.stats.StatsGroupsParseElement; @@ -578,10 +581,15 @@ public class SearchService extends AbstractLifecycleComponent { context.scrollContext(new ScrollContext()); context.scrollContext().scroll = request.scroll(); } - - parseTemplate(request, context); + if (request.template() != null) { + ExecutableScript executable = this.scriptService.executable(request.template(), ScriptContext.Standard.SEARCH, context); + BytesReference run = (BytesReference) executable.run(); + try (XContentParser parser = XContentFactory.xContent(run).createParser(run)) { + // NOCOMMIT this override the source entirely + request.source(SearchSourceBuilder.PROTOTYPE.fromXContent(parser, new QueryParseContext(indexService.queryParserService().indicesQueriesRegistry()))); + } + } parseSource(context, request.source()); - // parseSource(context, request.extraSource()); NOCOMMIT fix this // if the from and size are still not set, default them if (context.from() == -1) { @@ -670,70 +678,6 @@ public class SearchService extends AbstractLifecycleComponent { } } - private void parseTemplate(ShardSearchRequest request, SearchContext searchContext) { - - BytesReference processedQuery; - if (request.template() != null) { - ExecutableScript executable = this.scriptService.executable(request.template(), ScriptContext.Standard.SEARCH, searchContext); - processedQuery = (BytesReference) executable.run(); - } else { - if (!hasLength(request.templateSource())) { - return; - } - XContentParser parser = null; - Template template = null; - - try { - parser = XContentFactory.xContent(request.templateSource()).createParser(request.templateSource()); - template = TemplateQueryParser.parse(parser, searchContext.parseFieldMatcher(), "params", "template"); - - if (template.getType() == ScriptService.ScriptType.INLINE) { - //Try to double parse for nested template id/file - parser = null; - try { - ExecutableScript executable = this.scriptService.executable(template, ScriptContext.Standard.SEARCH, searchContext); - processedQuery = (BytesReference) executable.run(); - parser = XContentFactory.xContent(processedQuery).createParser(processedQuery); - } catch (ElasticsearchParseException epe) { - //This was an non-nested template, the parse failure was due to this, it is safe to assume this refers to a file - //for backwards compatibility and keep going - template = new Template(template.getScript(), ScriptService.ScriptType.FILE, MustacheScriptEngineService.NAME, - null, template.getParams()); - ExecutableScript executable = this.scriptService.executable(template, ScriptContext.Standard.SEARCH, searchContext); - processedQuery = (BytesReference) executable.run(); - } - if (parser != null) { - try { - Template innerTemplate = TemplateQueryParser.parse(parser, searchContext.parseFieldMatcher()); - if (hasLength(innerTemplate.getScript()) && !innerTemplate.getType().equals(ScriptService.ScriptType.INLINE)) { - //An inner template referring to a filename or id - template = new Template(innerTemplate.getScript(), innerTemplate.getType(), - MustacheScriptEngineService.NAME, null, template.getParams()); - ExecutableScript executable = this.scriptService.executable(template, ScriptContext.Standard.SEARCH, - searchContext); - processedQuery = (BytesReference) executable.run(); - } - } catch (ScriptParseException e) { - // No inner template found, use original template from above - } - } - } else { - ExecutableScript executable = this.scriptService.executable(template, ScriptContext.Standard.SEARCH, searchContext); - processedQuery = (BytesReference) executable.run(); - } - } catch (IOException e) { - throw new ElasticsearchParseException("Failed to parse template", e); - } finally { - Releasables.closeWhileHandlingException(parser); - } - - if (!hasLength(template.getScript())) { - throw new ElasticsearchParseException("Template must have [template] field configured"); - } - } - // request.source(processedQuery); NOCOMMIT fix this - } - private void parseSource(SearchContext context, SearchSourceBuilder source) throws SearchParseException { // nothing to parse... if (source == null) { diff --git a/core/src/main/java/org/elasticsearch/search/builder/OldSearchSourceBuilder.java b/core/src/main/java/org/elasticsearch/search/builder/OldSearchSourceBuilder.java index 8e8f2316860..949628bd040 100644 --- a/core/src/main/java/org/elasticsearch/search/builder/OldSearchSourceBuilder.java +++ b/core/src/main/java/org/elasticsearch/search/builder/OldSearchSourceBuilder.java @@ -57,9 +57,6 @@ import java.util.Map; * A search source builder allowing to easily build search source. Simple * construction using * {@link org.elasticsearch.search.builder.OldSearchSourceBuilder#searchSource()} - * . - * - * @see org.elasticsearch.action.search.SearchRequest#source(OldSearchSourceBuilder) */ public class OldSearchSourceBuilder extends ToXContentToBytes { diff --git a/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java b/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java index d2040c2b89e..1cee4965a46 100644 --- a/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java +++ b/core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java @@ -40,6 +40,7 @@ import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.script.Script; +import org.elasticsearch.script.Template; import org.elasticsearch.search.aggregations.AbstractAggregationBuilder; import org.elasticsearch.search.fetch.innerhits.InnerHitsBuilder; import org.elasticsearch.search.fetch.source.FetchSourceContext; @@ -87,7 +88,7 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ public static final ParseField SORT_FIELD = new ParseField("sort"); public static final ParseField TRACK_SCORES_FIELD = new ParseField("track_scores"); public static final ParseField INDICES_BOOST_FIELD = new ParseField("indices_boost"); - public static final ParseField AGGREGATIONS_FIELD = new ParseField("aggregations"); + public static final ParseField AGGREGATIONS_FIELD = new ParseField("aggregations", "aggs"); public static final ParseField HIGHLIGHT_FIELD = new ParseField("highlight"); public static final ParseField INNER_HITS_FIELD = new ParseField("inner_hits"); public static final ParseField SUGGEST_FIELD = new ParseField("suggest"); @@ -321,7 +322,6 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ * * @param name * The name of the field to sort by - * @throws IOException */ public SearchSourceBuilder sort(String name) { return sort(SortBuilders.fieldSort(name)); @@ -687,8 +687,8 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ XContentParser.Token token; String currentFieldName = null; if ((token = parser.nextToken()) != XContentParser.Token.START_OBJECT) { - throw new ParsingException(parser.getTokenLocation(), "Expected [" + XContentParser.Token.START_OBJECT + "] but found [" - + token + "]"); + throw new ParsingException(parser.getTokenLocation(), "Expected [" + XContentParser.Token.START_OBJECT + "] but found [" + token + "]", + parser.getTokenLocation()); } while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { @@ -717,8 +717,11 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ List fieldNames = new ArrayList<>(); fieldNames.add(parser.text()); builder.fieldNames = fieldNames; + } else if (context.parseFieldMatcher().match(currentFieldName, SORT_FIELD)) { + builder.sort(parser.text()); } else { - throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + "]."); + throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + "].", + parser.getTokenLocation()); } } else if (token == XContentParser.Token.START_OBJECT) { if (context.parseFieldMatcher().match(currentFieldName, QUERY_FIELD)) { @@ -742,25 +745,24 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ scriptFields .add(new ScriptField(scriptFieldName, Script.parse(parser, context.parseFieldMatcher()))); } else { - throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" - + currentFieldName + "]."); + throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + + "].", parser.getTokenLocation()); } } else if (token == XContentParser.Token.START_OBJECT) { if (context.parseFieldMatcher().match(currentFieldName, SCRIPT_FIELD)) { scriptFields .add(new ScriptField(scriptFieldName, Script.parse(parser, context.parseFieldMatcher()))); } else { - throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" - + currentFieldName + "]."); + throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + + "].", parser.getTokenLocation()); } } else { - throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" - + currentFieldName + "]."); + throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + + "].", parser.getTokenLocation()); } } } else { - throw new ParsingException(parser.getTokenLocation(), "Expected [" + XContentParser.Token.START_OBJECT - + "] in [" + throw new ParsingException(parser.getTokenLocation(), "Expected [" + XContentParser.Token.START_OBJECT + "] in [" + currentFieldName + "] but found [" + token + "]", parser.getTokenLocation()); } } @@ -773,8 +775,8 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ } else if (token.isValue()) { indexBoost.put(currentFieldName, parser.floatValue()); } else { - throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName - + "]."); + throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + "].", + parser.getTokenLocation()); } } builder.indexBoost = indexBoost; @@ -791,8 +793,8 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ xContentBuilder.endObject(); aggregations.add(xContentBuilder.bytes()); } else { - throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName - + "]."); + throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + "].", + parser.getTokenLocation()); } } builder.aggregations = aggregations; @@ -806,17 +808,19 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ XContentBuilder xContentBuilder = XContentFactory.contentBuilder(parser.contentType()).copyCurrentStructure(parser); builder.suggestBuilder = xContentBuilder.bytes(); } else { - throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + "]."); + throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + "].", + parser.getTokenLocation()); } } else if (token == XContentParser.Token.START_ARRAY) { + if (context.parseFieldMatcher().match(currentFieldName, FIELDS_FIELD)) { List fieldNames = new ArrayList<>(); while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { if (token == XContentParser.Token.VALUE_STRING) { fieldNames.add(parser.text()); } else { - throw new ParsingException(parser.getTokenLocation(), "Expected [" + XContentParser.Token.VALUE_STRING - + "] in [" + currentFieldName + "] but found [" + token + "]"); + throw new ParsingException(parser.getTokenLocation(), "Expected [" + XContentParser.Token.VALUE_STRING + "] in [" + + currentFieldName + "] but found [" + token + "]", parser.getTokenLocation()); } } builder.fieldNames = fieldNames; @@ -826,8 +830,8 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ if (token == XContentParser.Token.VALUE_STRING) { fieldDataFields.add(parser.text()); } else { - throw new ParsingException(parser.getTokenLocation(), "Expected [" + XContentParser.Token.VALUE_STRING - + "] in [" + currentFieldName + "] but found [" + token + "]"); + throw new ParsingException(parser.getTokenLocation(), "Expected [" + XContentParser.Token.VALUE_STRING + "] in [" + + currentFieldName + "] but found [" + token + "]", parser.getTokenLocation()); } } builder.fieldDataFields = fieldDataFields; @@ -851,16 +855,21 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ if (token == XContentParser.Token.VALUE_STRING) { stats.add(parser.text()); } else { - throw new ParsingException(parser.getTokenLocation(), "Expected [" + XContentParser.Token.VALUE_STRING - + "] in [" + currentFieldName + "] but found [" + token + "]"); + throw new ParsingException(parser.getTokenLocation(), "Expected [" + XContentParser.Token.VALUE_STRING + "] in [" + + currentFieldName + "] but found [" + token + "]", parser.getTokenLocation()); } } builder.stats = stats.toArray(new String[stats.size()]); + } else if (context.parseFieldMatcher().match(currentFieldName, _SOURCE_FIELD)) { + FetchSourceContext fetchSourceContext = FetchSourceContext.parse(parser, context); + builder.fetchSourceContext = fetchSourceContext; } else { - throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + "]."); + throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + "].", + parser.getTokenLocation()); } } else { - throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + "]."); + throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + "].", + parser.getTokenLocation()); } } return builder; diff --git a/core/src/main/java/org/elasticsearch/search/fetch/source/FetchSourceContext.java b/core/src/main/java/org/elasticsearch/search/fetch/source/FetchSourceContext.java index 27ec93e7b08..ae0a71d8c5c 100644 --- a/core/src/main/java/org/elasticsearch/search/fetch/source/FetchSourceContext.java +++ b/core/src/main/java/org/elasticsearch/search/fetch/source/FetchSourceContext.java @@ -41,8 +41,8 @@ import java.util.List; */ public class FetchSourceContext implements Streamable, ToXContent { - public static final ParseField INCLUDES_FIELD = new ParseField("includes"); - public static final ParseField EXCLUDES_FIELD = new ParseField("excludes"); + public static final ParseField INCLUDES_FIELD = new ParseField("includes", "include"); + public static final ParseField EXCLUDES_FIELD = new ParseField("excludes", "exclude"); public static final FetchSourceContext FETCH_SOURCE = new FetchSourceContext(true); public static final FetchSourceContext DO_NOT_FETCH_SOURCE = new FetchSourceContext(false); @@ -194,6 +194,14 @@ public class FetchSourceContext implements Streamable, ToXContent { String[] excludes = Strings.EMPTY_ARRAY; if (token == XContentParser.Token.VALUE_BOOLEAN) { fetchSource = parser.booleanValue(); + } else if (token == XContentParser.Token.VALUE_STRING) { + includes = new String[]{parser.text()}; + } else if (token == XContentParser.Token.START_ARRAY) { + ArrayList list = new ArrayList<>(); + while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { + list.add(parser.text()); + } + includes = list.toArray(new String[list.size()]); } else if (token == XContentParser.Token.START_OBJECT) { String currentFieldName = null; while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { @@ -206,8 +214,8 @@ public class FetchSourceContext implements Streamable, ToXContent { if (token == XContentParser.Token.VALUE_STRING) { includesList.add(parser.text()); } else { - throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" - + currentFieldName + "]."); + throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + "].", + parser.getTokenLocation()); } } includes = includesList.toArray(new String[includesList.size()]); @@ -217,22 +225,29 @@ public class FetchSourceContext implements Streamable, ToXContent { if (token == XContentParser.Token.VALUE_STRING) { excludesList.add(parser.text()); } else { - throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" - + currentFieldName + "]."); + throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + "].", + parser.getTokenLocation()); } } excludes = excludesList.toArray(new String[excludesList.size()]); } else { - throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName - + "]."); + throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + "].", + parser.getTokenLocation()); + } + } else if (token == XContentParser.Token.VALUE_STRING) { + if (context.parseFieldMatcher().match(currentFieldName, INCLUDES_FIELD)) { + includes = new String[] {parser.text()}; + } else if (context.parseFieldMatcher().match(currentFieldName, EXCLUDES_FIELD)) { + excludes = new String[] {parser.text()}; } } else { - throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + "]."); + throw new ParsingException(parser.getTokenLocation(), "Unknown key for a " + token + " in [" + currentFieldName + "].", + parser.getTokenLocation()); } } } else { throw new ParsingException(parser.getTokenLocation(), "Expected one of [" + XContentParser.Token.VALUE_BOOLEAN + ", " - + XContentParser.Token.START_OBJECT + "] but found [" + token + "]"); + + XContentParser.Token.START_OBJECT + "] but found [" + token + "]", parser.getTokenLocation()); } this.fetchSource = fetchSource; this.includes = includes; diff --git a/core/src/main/java/org/elasticsearch/search/internal/ShardSearchLocalRequest.java b/core/src/main/java/org/elasticsearch/search/internal/ShardSearchLocalRequest.java index 992833cf0ef..a5efc49ab82 100644 --- a/core/src/main/java/org/elasticsearch/search/internal/ShardSearchLocalRequest.java +++ b/core/src/main/java/org/elasticsearch/search/internal/ShardSearchLocalRequest.java @@ -67,8 +67,6 @@ public class ShardSearchLocalRequest extends ContextAndHeaderHolder implements S private String[] types = Strings.EMPTY_ARRAY; private String[] filteringAliases; private SearchSourceBuilder source; - private BytesReference extraSource; - private BytesReference templateSource; private Template template; private Boolean requestCache; private long nowInMillis; @@ -80,8 +78,6 @@ public class ShardSearchLocalRequest extends ContextAndHeaderHolder implements S String[] filteringAliases, long nowInMillis) { this(shardRouting.shardId(), numberOfShards, searchRequest.searchType(), searchRequest.source(), searchRequest.types(), searchRequest.requestCache()); - this.extraSource = searchRequest.extraSource(); - this.templateSource = searchRequest.templateSource(); this.template = searchRequest.template(); this.scroll = searchRequest.scroll(); this.filteringAliases = filteringAliases; @@ -135,11 +131,6 @@ public class ShardSearchLocalRequest extends ContextAndHeaderHolder implements S this.source = source; } - @Override - public BytesReference extraSource() { - return extraSource; - } - @Override public int numberOfShards() { return numberOfShards; @@ -159,17 +150,11 @@ public class ShardSearchLocalRequest extends ContextAndHeaderHolder implements S public long nowInMillis() { return nowInMillis; } - @Override public Template template() { return template; } - @Override - public BytesReference templateSource() { - return templateSource; - } - @Override public Boolean requestCache() { return requestCache; @@ -189,18 +174,11 @@ public class ShardSearchLocalRequest extends ContextAndHeaderHolder implements S if (in.readBoolean()) { scroll = readScroll(in); } - source = SearchSourceBuilder.PROTOTYPE.readFrom(in); - extraSource = in.readBytesReference(); - types = in.readStringArray(); filteringAliases = in.readStringArray(); nowInMillis = in.readVLong(); - - templateSource = in.readBytesReference(); - if (in.readBoolean()) { - template = Template.readTemplate(in); - } + template = in.readOptionalStreamable(new Template()); requestCache = in.readOptionalBoolean(); } @@ -218,19 +196,13 @@ public class ShardSearchLocalRequest extends ContextAndHeaderHolder implements S scroll.writeTo(out); } source.writeTo(out); - out.writeBytesReference(extraSource); out.writeStringArray(types); out.writeStringArrayNullable(filteringAliases); if (!asKey) { out.writeVLong(nowInMillis); } - out.writeBytesReference(templateSource); - boolean hasTemplate = template != null; - out.writeBoolean(hasTemplate); - if (hasTemplate) { - template.writeTo(out); - } + out.writeOptionalStreamable(template); out.writeOptionalBoolean(requestCache); } diff --git a/core/src/main/java/org/elasticsearch/search/internal/ShardSearchRequest.java b/core/src/main/java/org/elasticsearch/search/internal/ShardSearchRequest.java index 8f622f66bed..fb631b08270 100644 --- a/core/src/main/java/org/elasticsearch/search/internal/ShardSearchRequest.java +++ b/core/src/main/java/org/elasticsearch/search/internal/ShardSearchRequest.java @@ -45,8 +45,6 @@ public interface ShardSearchRequest extends HasContextAndHeaders { void source(SearchSourceBuilder source); - BytesReference extraSource(); - int numberOfShards(); SearchType searchType(); @@ -57,8 +55,6 @@ public interface ShardSearchRequest extends HasContextAndHeaders { Template template(); - BytesReference templateSource(); - Boolean requestCache(); Scroll scroll(); diff --git a/core/src/main/java/org/elasticsearch/search/internal/ShardSearchTransportRequest.java b/core/src/main/java/org/elasticsearch/search/internal/ShardSearchTransportRequest.java index a7dafdfafde..279d9d6bd20 100644 --- a/core/src/main/java/org/elasticsearch/search/internal/ShardSearchTransportRequest.java +++ b/core/src/main/java/org/elasticsearch/search/internal/ShardSearchTransportRequest.java @@ -97,11 +97,6 @@ public class ShardSearchTransportRequest extends TransportRequest implements Sha shardSearchLocalRequest.source(source); } - @Override - public BytesReference extraSource() { - return shardSearchLocalRequest.extraSource(); - } - @Override public int numberOfShards() { return shardSearchLocalRequest.numberOfShards(); @@ -121,17 +116,11 @@ public class ShardSearchTransportRequest extends TransportRequest implements Sha public long nowInMillis() { return shardSearchLocalRequest.nowInMillis(); } - @Override public Template template() { return shardSearchLocalRequest.template(); } - @Override - public BytesReference templateSource() { - return shardSearchLocalRequest.templateSource(); - } - @Override public Boolean requestCache() { return shardSearchLocalRequest.requestCache(); diff --git a/core/src/test/java/org/elasticsearch/action/count/CountRequestBuilderTests.java b/core/src/test/java/org/elasticsearch/action/count/CountRequestBuilderTests.java index 5d77247d38a..4bf5e7f7487 100644 --- a/core/src/test/java/org/elasticsearch/action/count/CountRequestBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/action/count/CountRequestBuilderTests.java @@ -28,7 +28,10 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.index.query.MatchAllQueryBuilder; +import org.elasticsearch.index.query.MatchQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.test.ESTestCase; import org.junit.AfterClass; import org.junit.BeforeClass; @@ -75,58 +78,14 @@ public class CountRequestBuilderTests extends ESTestCase { @Test public void testStringQueryToString() { CountRequestBuilder countRequestBuilder = client.prepareCount(); - String query = "{ \"match_all\" : {} }"; - countRequestBuilder.setQuery(new BytesArray(query)); - assertThat(countRequestBuilder.toString(), containsString("\"query\":{ \"match_all\" : {} }")); - } - - @Test - public void testXContentBuilderQueryToString() throws IOException { - CountRequestBuilder countRequestBuilder = client.prepareCount(); - XContentBuilder xContentBuilder = XContentFactory.contentBuilder(randomFrom(XContentType.values())); - xContentBuilder.startObject(); - xContentBuilder.startObject("match_all"); - xContentBuilder.endObject(); - xContentBuilder.endObject(); - countRequestBuilder.setQuery(xContentBuilder); - assertThat(countRequestBuilder.toString(), equalTo(new QuerySourceBuilder().setQuery(xContentBuilder.bytes()).toString())); + countRequestBuilder.setQuery(new MatchAllQueryBuilder()); + assertThat(countRequestBuilder.toString(), containsString("match_all")); } @Test public void testStringSourceToString() { CountRequestBuilder countRequestBuilder = client.prepareCount(); - String query = "{ \"query\": { \"match_all\" : {} } }"; - countRequestBuilder.setSource(new BytesArray(query)); - assertThat(countRequestBuilder.toString(), equalTo("{ \"query\": { \"match_all\" : {} } }")); - } - - @Test - public void testXContentBuilderSourceToString() throws IOException { - CountRequestBuilder countRequestBuilder = client.prepareCount(); - XContentBuilder xContentBuilder = XContentFactory.contentBuilder(randomFrom(XContentType.values())); - xContentBuilder.startObject(); - xContentBuilder.startObject("match_all"); - xContentBuilder.endObject(); - xContentBuilder.endObject(); - countRequestBuilder.setSource(xContentBuilder.bytes()); - assertThat(countRequestBuilder.toString(), equalTo(XContentHelper.convertToJson(xContentBuilder.bytes(), false, true))); - } - - @Test - public void testThatToStringDoesntWipeSource() { - String source = "{\n" + - " \"query\" : {\n" + - " \"match\" : {\n" + - " \"field\" : {\n" + - " \"query\" : \"value\"" + - " }\n" + - " }\n" + - " }\n" + - " }"; - CountRequestBuilder countRequestBuilder = client.prepareCount().setSource(new BytesArray(source)); - String preToString = countRequestBuilder.request().source().toUtf8(); - assertThat(countRequestBuilder.toString(), equalTo(source)); - String postToString = countRequestBuilder.request().source().toUtf8(); - assertThat(preToString, equalTo(postToString)); + countRequestBuilder.setSource(new SearchSourceBuilder().query(new MatchAllQueryBuilder())); + assertThat(countRequestBuilder.toString(), containsString("match_all")); } } diff --git a/core/src/test/java/org/elasticsearch/action/count/CountRequestTests.java b/core/src/test/java/org/elasticsearch/action/count/CountRequestTests.java index baca298d302..810028c7849 100644 --- a/core/src/test/java/org/elasticsearch/action/count/CountRequestTests.java +++ b/core/src/test/java/org/elasticsearch/action/count/CountRequestTests.java @@ -22,6 +22,7 @@ package org.elasticsearch.action.count; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.support.QuerySourceBuilder; +import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.internal.SearchContext; @@ -56,8 +57,9 @@ public class CountRequestTests extends ESTestCase { if (randomBoolean()) { countRequest.preference(randomAsciiOfLengthBetween(1, 10)); } - if (randomBoolean()) { - countRequest.source(new QuerySourceBuilder().setQuery(QueryBuilders.termQuery("field", "value"))); + final boolean querySet; + if (querySet = randomBoolean()) { + countRequest.query(QueryBuilders.termQuery("field", "value")); } if (randomBoolean()) { countRequest.minScore(randomFloat()); @@ -72,29 +74,29 @@ public class CountRequestTests extends ESTestCase { assertThat(searchRequest.types(), equalTo(countRequest.types())); assertThat(searchRequest.routing(), equalTo(countRequest.routing())); assertThat(searchRequest.preference(), equalTo(countRequest.preference())); - - if (countRequest.source() == null) { - assertThat(searchRequest.source(), nullValue()); - } else { - assertThat(searchRequest.source().query(), notNullValue()); - } - - Map extraSourceMap = XContentHelper.convertToMap(searchRequest.extraSource(), false).v2(); + BytesArray array = new BytesArray(XContentHelper.toString(searchRequest.source())); + Map sourceMap = XContentHelper.convertToMap(array, false).v2(); int count = 1; - assertThat((Integer)extraSourceMap.get("size"), equalTo(0)); - if (countRequest.minScore() == CountRequest.DEFAULT_MIN_SCORE) { - assertThat(extraSourceMap.get("min_score"), nullValue()); + assertThat(sourceMap.get("size"), equalTo(0)); + if (querySet) { + count++; + assertThat(sourceMap.get("query"), notNullValue()); } else { - assertThat(((Number)extraSourceMap.get("min_score")).floatValue(), equalTo(countRequest.minScore())); + assertNull(sourceMap.get("query")); + } + if (countRequest.minScore() == CountRequest.DEFAULT_MIN_SCORE) { + assertThat(sourceMap.get("min_score"), nullValue()); + } else { + assertThat(((Number)sourceMap.get("min_score")).floatValue(), equalTo(countRequest.minScore())); count++; } if (countRequest.terminateAfter() == SearchContext.DEFAULT_TERMINATE_AFTER) { - assertThat(extraSourceMap.get("terminate_after"), nullValue()); + assertThat(sourceMap.get("terminate_after"), nullValue()); } else { - assertThat((Integer)extraSourceMap.get("terminate_after"), equalTo(countRequest.terminateAfter())); + assertThat(sourceMap.get("terminate_after"), equalTo(countRequest.terminateAfter())); count++; } - assertThat(extraSourceMap.size(), equalTo(count)); + assertThat(sourceMap.toString(), sourceMap.size(), equalTo(count)); } private static String[] randomStringArray() { diff --git a/core/src/test/java/org/elasticsearch/action/search/MultiSearchRequestTests.java b/core/src/test/java/org/elasticsearch/action/search/MultiSearchRequestTests.java index 5fd9baea068..b07ba2fd70b 100644 --- a/core/src/test/java/org/elasticsearch/action/search/MultiSearchRequestTests.java +++ b/core/src/test/java/org/elasticsearch/action/search/MultiSearchRequestTests.java @@ -20,6 +20,13 @@ package org.elasticsearch.action.search; import org.elasticsearch.action.support.IndicesOptions; +import org.elasticsearch.common.bytes.BytesArray; +import org.elasticsearch.common.io.stream.NamedWriteableRegistry; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.index.query.MatchAllQueryParser; +import org.elasticsearch.indices.query.IndicesQueriesRegistry; +import org.elasticsearch.rest.action.search.RestMultiSearchAction; +import org.elasticsearch.script.ScriptService; import org.elasticsearch.test.StreamsUtils; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; @@ -28,6 +35,7 @@ import org.elasticsearch.test.ESTestCase; import org.junit.Test; import java.io.IOException; +import java.util.Collections; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.nullValue; @@ -36,8 +44,9 @@ public class MultiSearchRequestTests extends ESTestCase { @Test public void simpleAdd() throws Exception { + IndicesQueriesRegistry registry = new IndicesQueriesRegistry(Settings.EMPTY, Collections.singleton(new MatchAllQueryParser()), new NamedWriteableRegistry()); byte[] data = StreamsUtils.copyToBytesFromClasspath("/org/elasticsearch/action/search/simple-msearch1.json"); - MultiSearchRequest request = new MultiSearchRequest().add(data, 0, data.length, false, null, null, null); + MultiSearchRequest request = RestMultiSearchAction.parseRequest(new MultiSearchRequest(), new BytesArray(data), false, null, null, null, null, IndicesOptions.strictExpandOpenAndForbidClosed(),true, registry); assertThat(request.requests().size(), equalTo(8)); assertThat(request.requests().get(0).indices()[0], equalTo("test")); assertThat(request.requests().get(0).indicesOptions(), equalTo(IndicesOptions.fromOptions(true, true, true, true, IndicesOptions.strictExpandOpenAndForbidClosed()))); @@ -62,8 +71,9 @@ public class MultiSearchRequestTests extends ESTestCase { @Test public void simpleAdd2() throws Exception { + IndicesQueriesRegistry registry = new IndicesQueriesRegistry(Settings.EMPTY, Collections.singleton(new MatchAllQueryParser()), new NamedWriteableRegistry()); byte[] data = StreamsUtils.copyToBytesFromClasspath("/org/elasticsearch/action/search/simple-msearch2.json"); - MultiSearchRequest request = new MultiSearchRequest().add(data, 0, data.length, false, null, null, null); + MultiSearchRequest request =RestMultiSearchAction.parseRequest(new MultiSearchRequest(), new BytesArray(data), false, null, null, null, null, IndicesOptions.strictExpandOpenAndForbidClosed(), true, registry); assertThat(request.requests().size(), equalTo(5)); assertThat(request.requests().get(0).indices()[0], equalTo("test")); assertThat(request.requests().get(0).types().length, equalTo(0)); @@ -80,8 +90,9 @@ public class MultiSearchRequestTests extends ESTestCase { @Test public void simpleAdd3() throws Exception { + IndicesQueriesRegistry registry = new IndicesQueriesRegistry(Settings.EMPTY, Collections.singleton(new MatchAllQueryParser()), new NamedWriteableRegistry()); byte[] data = StreamsUtils.copyToBytesFromClasspath("/org/elasticsearch/action/search/simple-msearch3.json"); - MultiSearchRequest request = new MultiSearchRequest().add(data, 0, data.length, false, null, null, null); + MultiSearchRequest request =RestMultiSearchAction.parseRequest(new MultiSearchRequest(), new BytesArray(data), false, null, null, null, null, IndicesOptions.strictExpandOpenAndForbidClosed(), true, registry); assertThat(request.requests().size(), equalTo(4)); assertThat(request.requests().get(0).indices()[0], equalTo("test0")); assertThat(request.requests().get(0).indices()[1], equalTo("test1")); @@ -99,8 +110,9 @@ public class MultiSearchRequestTests extends ESTestCase { @Test public void simpleAdd4() throws Exception { + IndicesQueriesRegistry registry = new IndicesQueriesRegistry(Settings.EMPTY, Collections.singleton(new MatchAllQueryParser()), new NamedWriteableRegistry()); byte[] data = StreamsUtils.copyToBytesFromClasspath("/org/elasticsearch/action/search/simple-msearch4.json"); - MultiSearchRequest request = new MultiSearchRequest().add(data, 0, data.length, false, null, null, null); + MultiSearchRequest request = RestMultiSearchAction.parseRequest(new MultiSearchRequest(), new BytesArray(data), false, null, null, null, null, IndicesOptions.strictExpandOpenAndForbidClosed(), true, registry); assertThat(request.requests().size(), equalTo(3)); assertThat(request.requests().get(0).indices()[0], equalTo("test0")); assertThat(request.requests().get(0).indices()[1], equalTo("test1")); @@ -120,8 +132,9 @@ public class MultiSearchRequestTests extends ESTestCase { @Test public void simpleAdd5() throws Exception { + IndicesQueriesRegistry registry = new IndicesQueriesRegistry(Settings.EMPTY, Collections.singleton(new MatchAllQueryParser()), new NamedWriteableRegistry()); byte[] data = StreamsUtils.copyToBytesFromClasspath("/org/elasticsearch/action/search/simple-msearch5.json"); - MultiSearchRequest request = new MultiSearchRequest().add(data, 0, data.length, true, null, null, null); + MultiSearchRequest request = RestMultiSearchAction.parseRequest(new MultiSearchRequest(), new BytesArray(data), true, null, null, null, null, IndicesOptions.strictExpandOpenAndForbidClosed(), true, registry); assertThat(request.requests().size(), equalTo(3)); assertThat(request.requests().get(0).indices()[0], equalTo("test0")); assertThat(request.requests().get(0).indices()[1], equalTo("test1")); @@ -137,6 +150,18 @@ public class MultiSearchRequestTests extends ESTestCase { assertThat(request.requests().get(2).types()[0], equalTo("type2")); assertThat(request.requests().get(2).types()[1], equalTo("type1")); assertThat(request.requests().get(2).routing(), equalTo("123")); + assertNotNull(request.requests().get(0).template()); + assertNotNull(request.requests().get(1).template()); + assertNotNull(request.requests().get(2).template()); + assertEquals(ScriptService.ScriptType.INLINE, request.requests().get(0).template().getType()); + assertEquals(ScriptService.ScriptType.INLINE, request.requests().get(1).template().getType()); + assertEquals(ScriptService.ScriptType.INLINE, request.requests().get(2).template().getType()); + assertEquals("{\"query\":{\"match_{{template}}\":{}}}", request.requests().get(0).template().getScript()); + assertEquals("{\"query\":{\"match_{{template}}\":{}}}", request.requests().get(1).template().getScript()); + assertEquals("{\"query\":{\"match_{{template}}\":{}}}", request.requests().get(2).template().getScript()); + assertEquals(1, request.requests().get(0).template().getParams().size()); + assertEquals(1, request.requests().get(1).template().getParams().size()); + assertEquals(1, request.requests().get(2).template().getParams().size()); } public void testResponseErrorToXContent() throws IOException { diff --git a/core/src/test/java/org/elasticsearch/broadcast/BroadcastActionsIT.java b/core/src/test/java/org/elasticsearch/broadcast/BroadcastActionsIT.java index e2da7024582..78ca44b5cf6 100644 --- a/core/src/test/java/org/elasticsearch/broadcast/BroadcastActionsIT.java +++ b/core/src/test/java/org/elasticsearch/broadcast/BroadcastActionsIT.java @@ -68,15 +68,6 @@ public class BroadcastActionsIT extends ESIntegTestCase { assertThat(countResponse.getSuccessfulShards(), equalTo(numShards.numPrimaries)); assertThat(countResponse.getFailedShards(), equalTo(0)); } - - for (int i = 0; i < 5; i++) { - // test failed (simply query that can't be parsed) - try { - client().count(countRequest("test").source("{ term : { _type : \"type1 } }".getBytes(StandardCharsets.UTF_8))).actionGet(); - } catch(SearchPhaseExecutionException e) { - assertThat(e.shardFailures().length, equalTo(numShards.numPrimaries)); - } - } } private XContentBuilder source(String id, String nameValue) throws IOException { diff --git a/core/src/test/java/org/elasticsearch/document/DocumentActionsIT.java b/core/src/test/java/org/elasticsearch/document/DocumentActionsIT.java index dc64ffd2dea..7cc315c47c9 100644 --- a/core/src/test/java/org/elasticsearch/document/DocumentActionsIT.java +++ b/core/src/test/java/org/elasticsearch/document/DocumentActionsIT.java @@ -32,6 +32,8 @@ import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.search.SearchPhaseExecutionException; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.search.MultiMatchQuery; import org.elasticsearch.test.ESIntegTestCase; import org.junit.Test; @@ -163,13 +165,6 @@ public class DocumentActionsIT extends ESIntegTestCase { assertThat(countResponse.getSuccessfulShards(), equalTo(numShards.numPrimaries)); assertThat(countResponse.getFailedShards(), equalTo(0)); - // test failed (simply query that can't be parsed) - try { - client().count(countRequest("test").source("{ term : { _type : \"type1 } }")).actionGet(); - } catch(SearchPhaseExecutionException e) { - assertThat(e.shardFailures().length, equalTo(numShards.numPrimaries)); - } - // count with no query is a match all one countResponse = client().prepareCount("test").execute().actionGet(); assertThat("Failures " + countResponse.getShardFailures(), countResponse.getShardFailures() == null ? 0 : countResponse.getShardFailures().length, equalTo(0)); diff --git a/core/src/test/java/org/elasticsearch/index/query/TemplateQueryIT.java b/core/src/test/java/org/elasticsearch/index/query/TemplateQueryIT.java index 173bd398033..639cd397924 100644 --- a/core/src/test/java/org/elasticsearch/index/query/TemplateQueryIT.java +++ b/core/src/test/java/org/elasticsearch/index/query/TemplateQueryIT.java @@ -27,14 +27,22 @@ import org.elasticsearch.action.indexedscripts.put.PutIndexedScriptResponse; import org.elasticsearch.action.search.SearchPhaseExecutionException; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.common.HasContextAndHeaders; +import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.indices.query.IndicesQueriesRegistry; import org.elasticsearch.script.ScriptService; import org.elasticsearch.script.ScriptService.ScriptType; import org.elasticsearch.script.Template; import org.elasticsearch.script.mustache.MustacheScriptEngineService; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.internal.DefaultSearchContext; import org.elasticsearch.test.ESIntegTestCase; +import org.elasticsearch.test.rest.FakeRestRequest; import org.junit.Before; import org.junit.Test; @@ -177,13 +185,18 @@ public class TemplateQueryIT extends ESIntegTestCase { searchRequest.indices("_all"); String query = "{ \"template\" : { \"query\": {\"match_{{template}}\": {} } }, \"params\" : { \"template\":\"all\" } }"; - BytesReference bytesRef = new BytesArray(query); - searchRequest.templateSource(bytesRef); + searchRequest.template(parseTemplate(query)); SearchResponse searchResponse = client().search(searchRequest).get(); assertHitCount(searchResponse, 2); } + private Template parseTemplate(String template) throws IOException { + try (XContentParser parser = XContentFactory.xContent(template).createParser(template)) { + return TemplateQueryParser.parse(parser, ParseFieldMatcher.EMPTY, "params", "template"); + } + } + @Test // Releates to #6318 public void testSearchRequestFail() throws Exception { @@ -191,16 +204,14 @@ public class TemplateQueryIT extends ESIntegTestCase { searchRequest.indices("_all"); try { String query = "{ \"template\" : { \"query\": {\"match_all\": {}}, \"size\" : \"{{my_size}}\" } }"; - BytesReference bytesRef = new BytesArray(query); - searchRequest.templateSource(bytesRef); + searchRequest.template(parseTemplate(query)); client().search(searchRequest).get(); fail("expected exception"); } catch (Exception ex) { // expected - no params } String query = "{ \"template\" : { \"query\": {\"match_all\": {}}, \"size\" : \"{{my_size}}\" }, \"params\" : { \"my_size\": 1 } }"; - BytesReference bytesRef = new BytesArray(query); - searchRequest.templateSource(bytesRef); + searchRequest.template(parseTemplate(query)); SearchResponse searchResponse = client().search(searchRequest).get(); assertThat(searchResponse.getHits().hits().length, equalTo(1)); @@ -238,10 +249,9 @@ public class TemplateQueryIT extends ESIntegTestCase { public void testSearchTemplateQueryFromFile() throws Exception { SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("_all"); - String templateString = "{" + " \"file\": \"full-query-template\"," + " \"params\":{" + " \"mySize\": 2," + String query = "{" + " \"file\": \"full-query-template\"," + " \"params\":{" + " \"mySize\": 2," + " \"myField\": \"text\"," + " \"myValue\": \"value1\"" + " }" + "}"; - BytesReference bytesRef = new BytesArray(templateString); - searchRequest.templateSource(bytesRef); + searchRequest.template(parseTemplate(query)); SearchResponse searchResponse = client().search(searchRequest).get(); assertThat(searchResponse.getHits().hits().length, equalTo(1)); } @@ -253,10 +263,9 @@ public class TemplateQueryIT extends ESIntegTestCase { public void testTemplateQueryAsEscapedString() throws Exception { SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("_all"); - String templateString = "{" + " \"template\" : \"{ \\\"size\\\": \\\"{{size}}\\\", \\\"query\\\":{\\\"match_all\\\":{}}}\"," + String query = "{" + " \"template\" : \"{ \\\"size\\\": \\\"{{size}}\\\", \\\"query\\\":{\\\"match_all\\\":{}}}\"," + " \"params\":{" + " \"size\": 1" + " }" + "}"; - BytesReference bytesRef = new BytesArray(templateString); - searchRequest.templateSource(bytesRef); + searchRequest.template(parseTemplate(query)); SearchResponse searchResponse = client().search(searchRequest).get(); assertThat(searchResponse.getHits().hits().length, equalTo(1)); } @@ -272,8 +281,7 @@ public class TemplateQueryIT extends ESIntegTestCase { String templateString = "{" + " \"template\" : \"{ {{#use_size}} \\\"size\\\": \\\"{{size}}\\\", {{/use_size}} \\\"query\\\":{\\\"match_all\\\":{}}}\"," + " \"params\":{" + " \"size\": 1," + " \"use_size\": true" + " }" + "}"; - BytesReference bytesRef = new BytesArray(templateString); - searchRequest.templateSource(bytesRef); + searchRequest.template(parseTemplate(templateString)); SearchResponse searchResponse = client().search(searchRequest).get(); assertThat(searchResponse.getHits().hits().length, equalTo(1)); } @@ -289,8 +297,7 @@ public class TemplateQueryIT extends ESIntegTestCase { String templateString = "{" + " \"inline\" : \"{ \\\"query\\\":{\\\"match_all\\\":{}} {{#use_size}}, \\\"size\\\": \\\"{{size}}\\\" {{/use_size}} }\"," + " \"params\":{" + " \"size\": 1," + " \"use_size\": true" + " }" + "}"; - BytesReference bytesRef = new BytesArray(templateString); - searchRequest.templateSource(bytesRef); + searchRequest.template(parseTemplate(templateString)); SearchResponse searchResponse = client().search(searchRequest).get(); assertThat(searchResponse.getHits().hits().length, equalTo(1)); } diff --git a/core/src/test/java/org/elasticsearch/search/builder/NewSearchSourceBuilderTests.java b/core/src/test/java/org/elasticsearch/search/builder/NewSearchSourceBuilderTests.java index c2f5a5d24d0..8aea70e3021 100644 --- a/core/src/test/java/org/elasticsearch/search/builder/NewSearchSourceBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/search/builder/NewSearchSourceBuilderTests.java @@ -45,6 +45,7 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.SettingsModule; import org.elasticsearch.common.unit.TimeValue; +import org.elasticsearch.common.xcontent.XContent; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.env.Environment; @@ -145,7 +146,6 @@ public class NewSearchSourceBuilderTests extends ESTestCase { /** * Setup for the whole base test class. - * @throws IOException */ @BeforeClass public static void init() throws IOException { @@ -571,4 +571,55 @@ public class NewSearchSourceBuilderTests extends ESTestCase { throw new UnsupportedOperationException("this test can't handle MultiTermVector requests"); } + public void testParseIncludeExclude() throws IOException { + SearchSourceBuilder builder = new SearchSourceBuilder(); + { + String restContent = " { \"_source\": { \"includes\": \"include\", \"excludes\": \"*.field2\"}}"; + try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) { + SearchSourceBuilder searchSourceBuilder = builder.fromXContent(parser, new QueryParseContext(queryParserService.indicesQueriesRegistry())); + assertArrayEquals(new String[]{"*.field2" }, searchSourceBuilder.fetchSource().excludes()); + assertArrayEquals(new String[]{"include" }, searchSourceBuilder.fetchSource().includes()); + } + } + { + String restContent = " { \"_source\": false}"; + try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) { + SearchSourceBuilder searchSourceBuilder = builder.fromXContent(parser, new QueryParseContext(queryParserService.indicesQueriesRegistry())); + assertArrayEquals(new String[]{}, searchSourceBuilder.fetchSource().excludes()); + assertArrayEquals(new String[]{}, searchSourceBuilder.fetchSource().includes()); + assertFalse(searchSourceBuilder.fetchSource().fetchSource()); + } + } + } + + public void testParseSort() throws IOException { + SearchSourceBuilder builder = new SearchSourceBuilder(); + { + String restContent = " { \"sort\": \"foo\"}"; + try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) { + SearchSourceBuilder searchSourceBuilder = builder.fromXContent(parser, new QueryParseContext(queryParserService.indicesQueriesRegistry())); + assertEquals(1, searchSourceBuilder.sorts().size()); + assertEquals("{\"foo\":{}}", searchSourceBuilder.sorts().get(0).toUtf8()); + } + } + + { + String restContent = "{\"sort\" : [\n" + + " { \"post_date\" : {\"order\" : \"asc\"}},\n" + + " \"user\",\n" + + " { \"name\" : \"desc\" },\n" + + " { \"age\" : \"desc\" },\n" + + " \"_score\"\n" + + " ]}"; + try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) { + SearchSourceBuilder searchSourceBuilder = builder.fromXContent(parser, new QueryParseContext(queryParserService.indicesQueriesRegistry())); + assertEquals(5, searchSourceBuilder.sorts().size()); + assertEquals("{\"post_date\":{\"order\":\"asc\"}}", searchSourceBuilder.sorts().get(0).toUtf8()); + assertEquals("\"user\"", searchSourceBuilder.sorts().get(1).toUtf8()); + assertEquals("{\"name\":\"desc\"}", searchSourceBuilder.sorts().get(2).toUtf8()); + assertEquals("{\"age\":\"desc\"}", searchSourceBuilder.sorts().get(3).toUtf8()); + assertEquals("\"_score\"", searchSourceBuilder.sorts().get(4).toUtf8()); + } + } + } } diff --git a/core/src/test/java/org/elasticsearch/transport/ContextAndHeaderTransportIT.java b/core/src/test/java/org/elasticsearch/transport/ContextAndHeaderTransportIT.java index 08517f465f1..09ab73bca2c 100644 --- a/core/src/test/java/org/elasticsearch/transport/ContextAndHeaderTransportIT.java +++ b/core/src/test/java/org/elasticsearch/transport/ContextAndHeaderTransportIT.java @@ -67,6 +67,7 @@ import org.elasticsearch.script.groovy.GroovyScriptEngineService; import org.elasticsearch.script.mustache.MustacheScriptEngineService; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.pipeline.PipelineAggregatorBuilders; +import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.suggest.Suggest; import org.elasticsearch.search.suggest.SuggestBuilder; import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilder; diff --git a/core/src/test/resources/org/elasticsearch/action/search/simple-msearch1.json b/core/src/test/resources/org/elasticsearch/action/search/simple-msearch1.json index 3d98f375153..eefec530e1f 100644 --- a/core/src/test/resources/org/elasticsearch/action/search/simple-msearch1.json +++ b/core/src/test/resources/org/elasticsearch/action/search/simple-msearch1.json @@ -1,16 +1,16 @@ {"index":"test", "ignore_unavailable" : true, "expand_wildcards" : "open,closed"}} -{"query" : {"match_all" {}}} +{"query" : {"match_all" :{}}} {"index" : "test", "type" : "type1", "expand_wildcards" : ["open", "closed"]} -{"query" : {"match_all" {}}} +{"query" : {"match_all" :{}}} {"index":"test", "ignore_unavailable" : false, "expand_wildcards" : ["open"]}} -{"query" : {"match_all" {}}} +{"query" : {"match_all" :{}}} {"index":"test", "ignore_unavailable" : true, "allow_no_indices": true, "expand_wildcards" : ["open", "closed"]}} -{"query" : {"match_all" {}}} +{"query" : {"match_all" :{}}} {"index":"test", "ignore_unavailable" : true, "allow_no_indices": false, "expand_wildcards" : ["closed"]}} -{"query" : {"match_all" {}}} +{"query" : {"match_all" :{}}} {} -{"query" : {"match_all" {}}} +{"query" : {"match_all" :{}}} {"search_type" : "dfs_query_then_fetch"} -{"query" : {"match_all" {}}} +{"query" : {"match_all" :{}}} -{"query" : {"match_all" {}}} +{"query" : {"match_all" :{}}} diff --git a/core/src/test/resources/org/elasticsearch/action/search/simple-msearch2.json b/core/src/test/resources/org/elasticsearch/action/search/simple-msearch2.json index e2e06d9f951..79330d80f72 100644 --- a/core/src/test/resources/org/elasticsearch/action/search/simple-msearch2.json +++ b/core/src/test/resources/org/elasticsearch/action/search/simple-msearch2.json @@ -1,10 +1,10 @@ {"index":"test"} -{"query" : {"match_all" {}}} +{"query" : {"match_all" : {}}} {"index" : "test", "type" : "type1"} -{"query" : {"match_all" {}}} +{"query" : {"match_all" : {}}} {} -{"query" : {"match_all" {}}} +{"query" : {"match_all" : {}}} {"search_type" : "dfs_query_then_fetch"} -{"query" : {"match_all" {}}} +{"query" : {"match_all" : {}}} -{"query" : {"match_all" {}}} +{"query" : {"match_all" : {}}} diff --git a/core/src/test/resources/org/elasticsearch/action/search/simple-msearch3.json b/core/src/test/resources/org/elasticsearch/action/search/simple-msearch3.json index 6416720a92f..a6b52fd3bf9 100644 --- a/core/src/test/resources/org/elasticsearch/action/search/simple-msearch3.json +++ b/core/src/test/resources/org/elasticsearch/action/search/simple-msearch3.json @@ -1,8 +1,8 @@ {"index":["test0", "test1"]} -{"query" : {"match_all" {}}} +{"query" : {"match_all" : {}}} {"index" : "test2,test3", "type" : "type1"} -{"query" : {"match_all" {}}} +{"query" : {"match_all" : {}}} {"index" : ["test4", "test1"], "type" : [ "type2", "type1" ]} -{"query" : {"match_all" {}}} +{"query" : {"match_all" : {}}} {"search_type" : "dfs_query_then_fetch"} -{"query" : {"match_all" {}}} +{"query" : {"match_all" : {}}} diff --git a/core/src/test/resources/org/elasticsearch/action/search/simple-msearch4.json b/core/src/test/resources/org/elasticsearch/action/search/simple-msearch4.json index b98e24b8660..844d8bea1f8 100644 --- a/core/src/test/resources/org/elasticsearch/action/search/simple-msearch4.json +++ b/core/src/test/resources/org/elasticsearch/action/search/simple-msearch4.json @@ -1,6 +1,6 @@ {"index":["test0", "test1"], "request_cache": true} -{"query" : {"match_all" {}}} +{"query" : {"match_all" : {}}} {"index" : "test2,test3", "type" : "type1", "preference": "_local"} -{"query" : {"match_all" {}}} +{"query" : {"match_all" : {}}} {"index" : ["test4", "test1"], "type" : [ "type2", "type1" ], "routing": "123"} -{"query" : {"match_all" {}}} +{"query" : {"match_all" : {}}} diff --git a/core/src/test/resources/org/elasticsearch/action/search/simple-msearch5.json b/core/src/test/resources/org/elasticsearch/action/search/simple-msearch5.json index 5f08919481f..b337eae0654 100644 --- a/core/src/test/resources/org/elasticsearch/action/search/simple-msearch5.json +++ b/core/src/test/resources/org/elasticsearch/action/search/simple-msearch5.json @@ -1,6 +1,6 @@ {"index":["test0", "test1"], "request_cache": true} -{"template": {"query" : {"match_{{template}}" {}}}, "params": {"template": "all" } } } +{"template": {"query" : {"match_{{template}}" :{}}}, "params": {"template": "all" } } } {"index" : "test2,test3", "type" : "type1", "preference": "_local"} -{"template": {"query" : {"match_{{template}}" {}}}, "params": {"template": "all" } } } +{"template": {"query" : {"match_{{template}}" :{}}}, "params": {"template": "all" } } } {"index" : ["test4", "test1"], "type" : [ "type2", "type1" ], "routing": "123"} -{"template": {"query" : {"match_{{template}}" {}}}, "params": {"template": "all" } } } +{"template": {"query" : {"match_{{template}}" :{}}}, "params": {"template": "all" } } } diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/script/30_expressions.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/script/30_expressions.yaml index a0953a25972..36ff7f58ea6 100644 --- a/rest-api-spec/src/main/resources/rest-api-spec/test/script/30_expressions.yaml +++ b/rest-api-spec/src/main/resources/rest-api-spec/test/script/30_expressions.yaml @@ -22,6 +22,6 @@ setup: --- "Expressions scripting test": - - do: { search: { body: { script_fields : { my_field : { lang: expression, script: 'doc["age"].value + 19' } } } } } + - do: { search: { body: { script_fields : { my_field : { script: { lang: expression, inline: 'doc["age"].value + 19' } } } } } } - match: { hits.hits.0.fields.my_field.0: 42.0 } diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/search/10_source_filtering.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/search/10_source_filtering.yaml index a78a5a2a28f..b49d659cec3 100644 --- a/rest-api-spec/src/main/resources/rest-api-spec/test/search/10_source_filtering.yaml +++ b/rest-api-spec/src/main/resources/rest-api-spec/test/search/10_source_filtering.yaml @@ -14,12 +14,12 @@ - do: search: # stringified for boolean value - body: "{ _source: true, query: { match_all: {} } }" + body: { _source: true, query: { match_all: {} } } - length: { hits.hits: 1 } - match: { hits.hits.0._source.count: 1 } - - do: { search: { body: "{ _source: false, query: { match_all: {} } }" } } + - do: { search: { body: { _source: false, query: { match_all: {} } } } } - length: { hits.hits: 1 } - is_false: hits.hits.0._source diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/template/20_search.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/template/20_search.yaml index 5153f6cde1f..4da748aac80 100644 --- a/rest-api-spec/src/main/resources/rest-api-spec/test/template/20_search.yaml +++ b/rest-api-spec/src/main/resources/rest-api-spec/test/template/20_search.yaml @@ -26,11 +26,6 @@ indices.refresh: {} - - do: - search_template: - body: { "template": { "id" : "1" }, "params" : { "my_value" : "value1_foo", "my_size" : 1 } } - - match: { hits.total: 1 } - - do: search_template: body: { "id" : "1", "params" : { "my_value" : "value1_foo", "my_size" : 1 } } @@ -39,5 +34,5 @@ - do: catch: /Unable.to.find.on.disk.file.script.\[simple1\].using.lang.\[mustache\]/ search_template: - body: { "template" : "simple1" } + body: { "file" : "simple1"}