Skip to content

Commit ecd5f9a

Browse files
ES|QL: Add project routing to request body and configuration (#138580)
1 parent c5526ba commit ecd5f9a

File tree

16 files changed

+79
-14
lines changed

16 files changed

+79
-14
lines changed

benchmarks/src/main/java/org/elasticsearch/benchmark/_nightly/esql/QueryPlanningBenchmark.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ public void setup() {
9292
System.nanoTime(),
9393
false,
9494
AnalyzerSettings.QUERY_TIMESERIES_RESULT_TRUNCATION_DEFAULT_SIZE.getDefault(Settings.EMPTY),
95-
AnalyzerSettings.QUERY_TIMESERIES_RESULT_TRUNCATION_DEFAULT_SIZE.get(Settings.EMPTY)
95+
AnalyzerSettings.QUERY_TIMESERIES_RESULT_TRUNCATION_DEFAULT_SIZE.get(Settings.EMPTY),
96+
null
9697
);
9798

9899
var fields = 10_000;

benchmarks/src/main/java/org/elasticsearch/benchmark/compute/operator/EvalBenchmark.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,8 @@ private static Configuration configuration() {
373373
0,
374374
false,
375375
AnalyzerSettings.QUERY_TIMESERIES_RESULT_TRUNCATION_MAX_SIZE.getDefault(Settings.EMPTY),
376-
AnalyzerSettings.QUERY_TIMESERIES_RESULT_TRUNCATION_DEFAULT_SIZE.getDefault(Settings.EMPTY)
376+
AnalyzerSettings.QUERY_TIMESERIES_RESULT_TRUNCATION_DEFAULT_SIZE.getDefault(Settings.EMPTY),
377+
null
377378
);
378379
}
379380

x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/ConfigurationBuilder.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public class ConfigurationBuilder {
4343
private Map<String, Map<String, Column>> tables;
4444
private long queryStartTimeNanos;
4545

46+
private String projectRouting;
47+
4648
public ConfigurationBuilder(Configuration configuration) {
4749
clusterName = configuration.clusterName();
4850
username = configuration.username();
@@ -58,6 +60,7 @@ public ConfigurationBuilder(Configuration configuration) {
5860
allowPartialResults = configuration.allowPartialResults();
5961
tables = configuration.tables();
6062
queryStartTimeNanos = configuration.queryStartTimeNanos();
63+
projectRouting = configuration.projectRouting();
6164
}
6265

6366
public ConfigurationBuilder clusterName(String clusterName) {
@@ -130,6 +133,11 @@ public ConfigurationBuilder queryStartTimeNanos(long queryStartTimeNanos) {
130133
return this;
131134
}
132135

136+
public ConfigurationBuilder projectRouting(String projectRouting) {
137+
this.projectRouting = projectRouting;
138+
return this;
139+
}
140+
133141
public Configuration build() {
134142
return new Configuration(
135143
zoneId,
@@ -145,7 +153,8 @@ public Configuration build() {
145153
queryStartTimeNanos,
146154
allowPartialResults,
147155
resultTruncationMaxSizeTimeseries,
148-
resultTruncationDefaultSizeTimeseries
156+
resultTruncationDefaultSizeTimeseries,
157+
projectRouting
149158
);
150159
}
151160
}

x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/ConfigurationTestUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ public static Configuration randomConfiguration(String query, Map<String, Map<St
7676
System.nanoTime(),
7777
false,
7878
tsTruncation,
79-
defaultTsTruncation
79+
defaultTsTruncation,
80+
null
8081
);
8182
}
8283

x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/EsqlTestUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,8 @@ public static Configuration configuration(QueryPragmas pragmas, String query, Es
595595
System.nanoTime(),
596596
false,
597597
AnalyzerSettings.QUERY_TIMESERIES_RESULT_TRUNCATION_MAX_SIZE.getDefault(Settings.EMPTY),
598-
AnalyzerSettings.QUERY_TIMESERIES_RESULT_TRUNCATION_DEFAULT_SIZE.getDefault(Settings.EMPTY)
598+
AnalyzerSettings.QUERY_TIMESERIES_RESULT_TRUNCATION_DEFAULT_SIZE.getDefault(Settings.EMPTY),
599+
null
599600
);
600601
}
601602

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlQueryRequest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public class EsqlQueryRequest extends org.elasticsearch.xpack.core.esql.action.E
5959
private boolean onSnapshotBuild = Build.current().isSnapshot();
6060
private boolean acceptedPragmaRisks = false;
6161
private Boolean allowPartialResults = null;
62+
private String projectRouting;
6263

6364
/**
6465
* "Tables" provided in the request for use with things like {@code LOOKUP}.
@@ -317,4 +318,12 @@ void onSnapshotBuild(boolean onSnapshotBuild) {
317318
void acceptedPragmaRisks(boolean accepted) {
318319
this.acceptedPragmaRisks = accepted;
319320
}
321+
322+
public void projectRouting(String projectRouting) {
323+
this.projectRouting = projectRouting;
324+
}
325+
326+
public String projectRouting() {
327+
return projectRouting;
328+
}
320329
}

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/RequestXContent.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ String fields() {
9090
static final ParseField WAIT_FOR_COMPLETION_TIMEOUT = new ParseField("wait_for_completion_timeout");
9191
static final ParseField KEEP_ALIVE = new ParseField("keep_alive");
9292
static final ParseField KEEP_ON_COMPLETION = new ParseField("keep_on_completion");
93+
static final ParseField PROJECT_ROUTING = new ParseField("project_routing");
9394

9495
private static final ObjectParser<EsqlQueryRequest, Void> SYNC_PARSER = objectParserSync(() -> syncEsqlQueryRequest(null));
9596
private static final ObjectParser<EsqlQueryRequest, Void> ASYNC_PARSER = objectParserAsync(() -> asyncEsqlQueryRequest(null));
@@ -121,6 +122,7 @@ private static void objectParserCommon(ObjectParser<EsqlQueryRequest, ?> parser)
121122
parser.declareString((request, localeTag) -> request.locale(Locale.forLanguageTag(localeTag)), LOCALE_FIELD);
122123
parser.declareBoolean(EsqlQueryRequest::profile, PROFILE_FIELD);
123124
parser.declareField((p, r, c) -> new ParseTables(r, p).parseTables(), TABLES_FIELD, ObjectParser.ValueType.OBJECT);
125+
parser.declareString(EsqlQueryRequest::projectRouting, PROJECT_ROUTING);
124126
}
125127

126128
private static ObjectParser<EsqlQueryRequest, Void> objectParserSync(Supplier<EsqlQueryRequest> supplier) {

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/capabilities/ConfigurationAware.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ public interface ConfigurationAware {
3333
0,
3434
false,
3535
0,
36-
0
36+
0,
37+
null
3738
);
3839

3940
Configuration configuration();

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/Configuration.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public class Configuration implements Writeable {
6060

6161
private final Map<String, Map<String, Column>> tables;
6262
private final long queryStartTimeNanos;
63+
private final String projectRouting;
6364

6465
public Configuration(
6566
ZoneId zi,
@@ -75,7 +76,8 @@ public Configuration(
7576
long queryStartTimeNanos,
7677
boolean allowPartialResults,
7778
int resultTruncationMaxSizeTimeseries,
78-
int resultTruncationDefaultSizeTimeseries
79+
int resultTruncationDefaultSizeTimeseries,
80+
String projectRouting
7981
) {
8082
this.zoneId = zi.normalized();
8183
this.now = ZonedDateTime.now(Clock.tick(Clock.system(zoneId), Duration.ofNanos(1)));
@@ -93,6 +95,7 @@ public Configuration(
9395
assert tables != null;
9496
this.queryStartTimeNanos = queryStartTimeNanos;
9597
this.allowPartialResults = allowPartialResults;
98+
this.projectRouting = projectRouting;
9699
}
97100

98101
public Configuration(BlockStreamInput in) throws IOException {
@@ -120,6 +123,9 @@ public Configuration(BlockStreamInput in) throws IOException {
120123
this.resultTruncationMaxSizeTimeseries = this.resultTruncationMaxSizeRegular;
121124
this.resultTruncationDefaultSizeTimeseries = this.resultTruncationDefaultSizeRegular;
122125
}
126+
127+
// not needed on the data nodes for now
128+
this.projectRouting = null;
123129
}
124130

125131
@Override
@@ -233,7 +239,8 @@ public Configuration withoutTables() {
233239
queryStartTimeNanos,
234240
allowPartialResults,
235241
resultTruncationMaxSizeTimeseries,
236-
resultTruncationDefaultSizeTimeseries
242+
resultTruncationDefaultSizeTimeseries,
243+
projectRouting
237244
);
238245
}
239246

@@ -252,6 +259,10 @@ public boolean allowPartialResults() {
252259
return allowPartialResults;
253260
}
254261

262+
public String projectRouting() {
263+
return projectRouting;
264+
}
265+
255266
private static void writeQuery(StreamOutput out, String query) throws IOException {
256267
if (query.length() > QUERY_COMPRESS_THRESHOLD_CHARS) { // compare on chars to avoid UTF-8 encoding unless actually required
257268
out.writeBoolean(true);

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/session/EsqlSession.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,8 @@ public void execute(EsqlQueryRequest request, EsqlExecutionInfo executionInfo, P
202202
System.nanoTime(),
203203
request.allowPartialResults(),
204204
clusterSettings.timeseriesResultTruncationMaxSize(),
205-
clusterSettings.timeseriesResultTruncationDefaultSize()
205+
clusterSettings.timeseriesResultTruncationDefaultSize(),
206+
projectRouting(request, statement)
206207
);
207208
FoldContext foldContext = configuration.newFoldContext();
208209

@@ -258,6 +259,18 @@ public void onResponse(Versioned<LogicalPlan> analyzedPlan) {
258259
);
259260
}
260261

262+
private String projectRouting(EsqlQueryRequest request, EsqlStatement statement) {
263+
String projectRouting = statement.setting(QuerySettings.PROJECT_ROUTING);
264+
if (projectRouting == null) {
265+
projectRouting = request.projectRouting();
266+
}
267+
268+
if (projectRouting != null && crossProjectModeDecider.crossProjectEnabled() == false) {
269+
throw new VerificationException("[project_routing] is only allowed when cross-project search is enabled");
270+
}
271+
return projectRouting;
272+
}
273+
261274
/**
262275
* Execute an analyzed plan. Most code should prefer calling {@link #execute} but
263276
* this is public for testing.

0 commit comments

Comments
 (0)