Skip to content

Commit b1170b9

Browse files
Enable Cross Project Search for templated searches along with project_routing support
1 parent 4358b88 commit b1170b9

File tree

5 files changed

+59
-7
lines changed

5 files changed

+59
-7
lines changed

modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/MultiSearchTemplateRequest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.elasticsearch.common.bytes.BytesReference;
1919
import org.elasticsearch.common.io.stream.StreamInput;
2020
import org.elasticsearch.common.io.stream.StreamOutput;
21+
import org.elasticsearch.core.Nullable;
2122
import org.elasticsearch.xcontent.ToXContent;
2223
import org.elasticsearch.xcontent.XContent;
2324
import org.elasticsearch.xcontent.XContentBuilder;
@@ -37,6 +38,9 @@ public class MultiSearchTemplateRequest extends LegacyActionRequest implements C
3738

3839
private IndicesOptions indicesOptions = IndicesOptions.strictExpandOpenAndForbidClosedIgnoreThrottled();
3940

41+
@Nullable
42+
private String projectRouting;
43+
4044
public MultiSearchTemplateRequest() {}
4145

4246
MultiSearchTemplateRequest(StreamInput in) throws IOException {
@@ -153,4 +157,16 @@ public static byte[] writeMultiLineFormat(MultiSearchTemplateRequest multiSearch
153157
return output.toByteArray();
154158
}
155159

160+
public void setProjectRouting(@Nullable String projectRouting) {
161+
if (this.projectRouting != null) {
162+
throw new IllegalArgumentException("project_routing already set");
163+
}
164+
165+
this.projectRouting = projectRouting;
166+
}
167+
168+
@Nullable
169+
public String getProjectRouting() {
170+
return projectRouting;
171+
}
156172
}

modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestMultiSearchTemplateAction.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,12 @@ public RestChannelConsumer prepareRequest(RestRequest request, NodeClient client
7070
*/
7171
public MultiSearchTemplateRequest parseRequest(RestRequest restRequest, boolean allowExplicitIndex) throws IOException {
7272
boolean crossProjectEnabled = crossProjectModeDecider.crossProjectEnabled();
73+
MultiSearchTemplateRequest multiRequest = new MultiSearchTemplateRequest();
74+
7375
if (crossProjectEnabled) {
74-
// accept but drop project_routing param until fully supported
75-
restRequest.param("project_routing");
76+
multiRequest.setProjectRouting(restRequest.param("project_routing"));
7677
}
7778

78-
MultiSearchTemplateRequest multiRequest = new MultiSearchTemplateRequest();
7979
if (restRequest.hasParam("max_concurrent_searches")) {
8080
multiRequest.maxConcurrentSearchRequests(restRequest.paramAsInt("max_concurrent_searches", 0));
8181
}
@@ -86,6 +86,18 @@ public MultiSearchTemplateRequest parseRequest(RestRequest restRequest, boolean
8686
allowExplicitIndex,
8787
(searchRequest, bytes) -> {
8888
SearchTemplateRequest searchTemplateRequest = SearchTemplateRequest.fromXContent(bytes);
89+
if (crossProjectEnabled) {
90+
/*
91+
* If project_routing is set in the request body, it gets overwritten when parsing the body.
92+
* See SearchTemplateRequest#fromXContent() and SearchTemplateRequest#PROJECT_ROUTING_FIELD.
93+
*/
94+
searchTemplateRequest.setProjectRouting(multiRequest.getProjectRouting());
95+
} else {
96+
// project_routing is specified in the body and we're not in a CPS environment.
97+
if (searchTemplateRequest.getProjectRouting() != null) {
98+
throw new IllegalArgumentException("Unknown key for a VALUE_STRING in [project_routing]");
99+
}
100+
}
89101
if (searchTemplateRequest.getScript() != null) {
90102
searchTemplateRequest.setRequest(searchRequest);
91103
multiRequest.add(searchTemplateRequest);

modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestSearchTemplateAction.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,6 @@ public String getName() {
6464
@Override
6565
public RestChannelConsumer prepareRequest(RestRequest request, NodeClient client) throws IOException {
6666
boolean crossProjectEnabled = crossProjectModeDecider.crossProjectEnabled();
67-
if (crossProjectEnabled) {
68-
// accept but drop project_routing param until fully supported
69-
request.param("project_routing");
70-
}
7167

7268
// Creates the search request with all required params
7369
SearchRequest searchRequest = new SearchRequest();
@@ -86,6 +82,12 @@ public RestChannelConsumer prepareRequest(RestRequest request, NodeClient client
8682
try (XContentParser parser = request.contentOrSourceParamParser()) {
8783
searchTemplateRequest = SearchTemplateRequest.fromXContent(parser);
8884
}
85+
86+
if (searchRequest.indicesOptions().resolveCrossProjectIndexExpression() == false
87+
&& searchTemplateRequest.getProjectRouting() != null) {
88+
throw new IllegalArgumentException("Unknown key for a VALUE_STRING in [project_routing]");
89+
}
90+
8991
searchTemplateRequest.setRequest(searchRequest);
9092
// This param is parsed within the search request
9193
if (searchRequest.source().explain() != null) {

modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/SearchTemplateRequest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,14 @@
1212
import org.elasticsearch.action.ActionRequestValidationException;
1313
import org.elasticsearch.action.CompositeIndicesRequest;
1414
import org.elasticsearch.action.LegacyActionRequest;
15+
import org.elasticsearch.action.ValidateActions;
1516
import org.elasticsearch.action.search.SearchRequest;
17+
import org.elasticsearch.action.support.IndicesOptions;
1618
import org.elasticsearch.common.ParsingException;
1719
import org.elasticsearch.common.Strings;
1820
import org.elasticsearch.common.io.stream.StreamInput;
1921
import org.elasticsearch.common.io.stream.StreamOutput;
22+
import org.elasticsearch.core.Nullable;
2023
import org.elasticsearch.script.ScriptType;
2124
import org.elasticsearch.xcontent.ObjectParser;
2225
import org.elasticsearch.xcontent.ParseField;
@@ -44,6 +47,9 @@ public class SearchTemplateRequest extends LegacyActionRequest implements Compos
4447
private String script;
4548
private Map<String, Object> scriptParams;
4649

50+
@Nullable
51+
private String projectRouting;
52+
4753
public SearchTemplateRequest() {}
4854

4955
public SearchTemplateRequest(StreamInput in) throws IOException {
@@ -138,6 +144,19 @@ public void setScriptParams(Map<String, Object> scriptParams) {
138144
this.scriptParams = scriptParams;
139145
}
140146

147+
public void setProjectRouting(@Nullable String projectRouting) {
148+
if (this.projectRouting != null) {
149+
throw new IllegalArgumentException("project_routing already set");
150+
}
151+
152+
this.projectRouting = projectRouting;
153+
}
154+
155+
@Nullable
156+
public String getProjectRouting() {
157+
return projectRouting;
158+
}
159+
141160
@Override
142161
public ActionRequestValidationException validate() {
143162
ActionRequestValidationException validationException = null;
@@ -169,6 +188,7 @@ public ActionRequestValidationException validate() {
169188
private static final ParseField PARAMS_FIELD = new ParseField("params");
170189
private static final ParseField EXPLAIN_FIELD = new ParseField("explain");
171190
private static final ParseField PROFILE_FIELD = new ParseField("profile");
191+
private static final ParseField PROJECT_ROUTING_FIELD = new ParseField("project_routing");
172192

173193
private static final ObjectParser<SearchTemplateRequest, Void> PARSER;
174194

@@ -194,6 +214,7 @@ public ActionRequestValidationException validate() {
194214
request.setScript(parser.text());
195215
}
196216
}, SOURCE_FIELD, ObjectParser.ValueType.OBJECT_OR_STRING);
217+
PARSER.declareString(SearchTemplateRequest::setProjectRouting, PROJECT_ROUTING_FIELD);
197218
}
198219

199220
public static SearchTemplateRequest fromXContent(XContentParser parser) throws IOException {

modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/TransportSearchTemplateAction.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ static SearchRequest convert(
152152
builder.profile(searchTemplateRequest.isProfile());
153153
checkRestTotalHitsAsInt(searchRequest, builder);
154154
searchRequest.source(builder);
155+
searchRequest.setProjectRouting(searchTemplateRequest.getProjectRouting());
155156
return searchRequest;
156157
}
157158

0 commit comments

Comments
 (0)