SearchTemplateRequest to implement CompositeIndicesRequest (#21865)

SearchTemplateRequest to implement CompositeIndicesRequest

Given that SearchTemplateRequest effectively delegates to search when a search is being executed, it should implement the CompositeIndicesRequest interface. The subrequests method should return a single search request. When a search is not going to be executed, because we are in simulate mode, there are no inner requests, and there are no corresponding indices to that request either.

Closes #21747
This commit is contained in:
Luca Cavanna 2016-11-29 20:52:43 +01:00 committed by GitHub
parent be4074e13d
commit 6eaff9432d
4 changed files with 23 additions and 17 deletions

View File

@ -25,7 +25,7 @@ import java.util.List;
* Needs to be implemented by all {@link org.elasticsearch.action.ActionRequest} subclasses that are composed of multiple subrequests
* which relate to one or more indices. Allows to retrieve those subrequests and reason about them separately. A composite request is
* executed by its own transport action class (e.g. {@link org.elasticsearch.action.search.TransportMultiSearchAction}), which goes
* through all the subrequests and delegates their exection to the appropriate transport action (e.g.
* through all the subrequests and delegates their execution to the appropriate transport action (e.g.
* {@link org.elasticsearch.action.search.TransportSearchAction}) for each single item.
*/
public interface CompositeIndicesRequest {

View File

@ -63,7 +63,11 @@ public class MultiSearchTemplateRequest extends ActionRequest implements Composi
@Override
public List<? extends IndicesRequest> subRequests() {
return requests;
List<IndicesRequest> indicesRequests = new ArrayList<>();
for (SearchTemplateRequest request : requests) {
indicesRequests.addAll(request.subRequests());
}
return indicesRequests;
}
@Override

View File

@ -21,15 +21,16 @@ package org.elasticsearch.script.mustache;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.CompositeIndicesRequest;
import org.elasticsearch.action.IndicesRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.support.IndicesOptions;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.script.ScriptType;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static org.elasticsearch.action.ValidateActions.addValidationError;
@ -37,7 +38,7 @@ import static org.elasticsearch.action.ValidateActions.addValidationError;
/**
* A request to execute a search based on a search template.
*/
public class SearchTemplateRequest extends ActionRequest implements IndicesRequest {
public class SearchTemplateRequest extends ActionRequest implements CompositeIndicesRequest {
private SearchRequest request;
private boolean simulate = false;
@ -167,12 +168,13 @@ public class SearchTemplateRequest extends ActionRequest implements IndicesReque
}
@Override
public String[] indices() {
return request != null ? request.indices() : Strings.EMPTY_ARRAY;
}
@Override
public IndicesOptions indicesOptions() {
return request != null ? request.indicesOptions() : SearchRequest.DEFAULT_INDICES_OPTIONS;
public List<? extends IndicesRequest> subRequests() {
//if we are simulating no index is involved in the request
if (simulate) {
assert request == null;
return Collections.emptyList();
}
//composite request as it delegates to search, but it holds one single action (search itself)
return Collections.singletonList(request);
}
}

View File

@ -41,16 +41,16 @@ public class MultiSearchTemplateRequestTests extends ESTestCase {
assertThat(request.requests().size(), equalTo(3));
assertThat(request.requests().get(0).getRequest().indices()[0], equalTo("test0"));
assertThat(request.requests().get(0).getRequest().indices()[1], equalTo("test1"));
assertThat(request.requests().get(0).indices(), arrayContaining("test0", "test1"));
assertThat(request.requests().get(0).getRequest().indices(), arrayContaining("test0", "test1"));
assertThat(request.requests().get(0).getRequest().requestCache(), equalTo(true));
assertThat(request.requests().get(0).getRequest().preference(), nullValue());
assertThat(request.requests().get(1).indices()[0], equalTo("test2"));
assertThat(request.requests().get(1).indices()[1], equalTo("test3"));
assertThat(request.requests().get(1).getRequest().indices()[0], equalTo("test2"));
assertThat(request.requests().get(1).getRequest().indices()[1], equalTo("test3"));
assertThat(request.requests().get(1).getRequest().types()[0], equalTo("type1"));
assertThat(request.requests().get(1).getRequest().requestCache(), nullValue());
assertThat(request.requests().get(1).getRequest().preference(), equalTo("_local"));
assertThat(request.requests().get(2).indices()[0], equalTo("test4"));
assertThat(request.requests().get(2).indices()[1], equalTo("test1"));
assertThat(request.requests().get(2).getRequest().indices()[0], equalTo("test4"));
assertThat(request.requests().get(2).getRequest().indices()[1], equalTo("test1"));
assertThat(request.requests().get(2).getRequest().types()[0], equalTo("type2"));
assertThat(request.requests().get(2).getRequest().types()[1], equalTo("type1"));
assertThat(request.requests().get(2).getRequest().routing(), equalTo("123"));