Skip to content

Commit 2eb2c84

Browse files
committed
add allow_partial_results to configuration
1 parent ebba004 commit 2eb2c84

File tree

14 files changed

+68
-13
lines changed

14 files changed

+68
-13
lines changed

server/src/main/java/org/elasticsearch/TransportVersions.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ static TransportVersion def(int id) {
185185
public static final TransportVersion ESQL_DRIVER_TASK_DESCRIPTION = def(9_005_0_00);
186186
public static final TransportVersion ESQL_RETRY_ON_SHARD_LEVEL_FAILURE = def(9_006_0_00);
187187
public static final TransportVersion ESQL_PROFILE_ASYNC_NANOS = def(9_007_00_0);
188+
public static final TransportVersion ESQL_SUPPORT_PARTIAL_RESULTS = def(9_008_0_00);
188189

189190
/*
190191
* STOP! READ THIS FIRST! No, really,

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
@@ -71,7 +71,8 @@ public static Configuration randomConfiguration(String query, Map<String, Map<St
7171
query,
7272
profile,
7373
tables,
74-
System.nanoTime()
74+
System.nanoTime(),
75+
randomBoolean()
7576
);
7677
}
7778

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
@@ -388,7 +388,8 @@ public static Configuration configuration(QueryPragmas pragmas, String query) {
388388
query,
389389
false,
390390
TABLES,
391-
System.nanoTime()
391+
System.nanoTime(),
392+
randomBoolean()
392393
);
393394
}
394395

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -808,7 +808,12 @@ public enum Cap {
808808
* and https://github.com/elastic/elasticsearch/issues/120803
809809
* Support for queries that have multiple SORTs that cannot become TopN
810810
*/
811-
REMOVE_REDUNDANT_SORT;
811+
REMOVE_REDUNDANT_SORT,
812+
813+
/**
814+
* Support partial_results
815+
*/
816+
SUPPORT_PARTIAL_RESULTS;
812817

813818
private final boolean enabled;
814819

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
@@ -52,6 +52,7 @@ public class EsqlQueryRequest extends org.elasticsearch.xpack.core.esql.action.E
5252
private boolean keepOnCompletion;
5353
private boolean onSnapshotBuild = Build.current().isSnapshot();
5454
private boolean acceptedPragmaRisks = false;
55+
private boolean allowPartialResults = false;
5556

5657
/**
5758
* "Tables" provided in the request for use with things like {@code LOOKUP}.
@@ -231,6 +232,14 @@ public Map<String, Map<String, Column>> tables() {
231232
return tables;
232233
}
233234

235+
public boolean allowPartialResults() {
236+
return allowPartialResults;
237+
}
238+
239+
public void allowPartialResults(boolean allowPartialResults) {
240+
this.allowPartialResults = allowPartialResults;
241+
}
242+
234243
@Override
235244
public Task createTask(long id, String type, String action, TaskId parentTaskId, Map<String, String> headers) {
236245
// Pass the query as the description

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
@@ -85,6 +85,7 @@ String fields() {
8585
static final ParseField WAIT_FOR_COMPLETION_TIMEOUT = new ParseField("wait_for_completion_timeout");
8686
static final ParseField KEEP_ALIVE = new ParseField("keep_alive");
8787
static final ParseField KEEP_ON_COMPLETION = new ParseField("keep_on_completion");
88+
static final ParseField ALLOW_PARTIAL_RESULTS = new ParseField("allow_partial_results");
8889

8990
private static final ObjectParser<EsqlQueryRequest, Void> SYNC_PARSER = objectParserSync(EsqlQueryRequest::syncEsqlQueryRequest);
9091
private static final ObjectParser<EsqlQueryRequest, Void> ASYNC_PARSER = objectParserAsync(EsqlQueryRequest::asyncEsqlQueryRequest);
@@ -114,6 +115,7 @@ private static void objectParserCommon(ObjectParser<EsqlQueryRequest, ?> parser)
114115
parser.declareString((request, localeTag) -> request.locale(Locale.forLanguageTag(localeTag)), LOCALE_FIELD);
115116
parser.declareBoolean(EsqlQueryRequest::profile, PROFILE_FIELD);
116117
parser.declareField((p, r, c) -> new ParseTables(r, p).parseTables(), TABLES_FIELD, ObjectParser.ValueType.OBJECT);
118+
parser.declareBoolean(EsqlQueryRequest::allowPartialResults, ALLOW_PARTIAL_RESULTS);
117119
}
118120

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

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,8 @@ private void innerExecute(Task task, EsqlQueryRequest request, ActionListener<Es
206206
request.query(),
207207
request.profile(),
208208
request.tables(),
209-
System.nanoTime()
209+
System.nanoTime(),
210+
request.allowPartialResults()
210211
);
211212
String sessionId = sessionID(task);
212213
// async-query uses EsqlQueryTask, so pull the EsqlExecutionInfo out of the task

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

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package org.elasticsearch.xpack.esql.session;
99

10+
import org.elasticsearch.TransportVersion;
1011
import org.elasticsearch.TransportVersions;
1112
import org.elasticsearch.common.bytes.BytesArray;
1213
import org.elasticsearch.common.compress.CompressorFactory;
@@ -50,6 +51,7 @@ public class Configuration implements Writeable {
5051
private final String query;
5152

5253
private final boolean profile;
54+
private final boolean allowPartialResults;
5355

5456
private final Map<String, Map<String, Column>> tables;
5557
private final long queryStartTimeNanos;
@@ -65,7 +67,8 @@ public Configuration(
6567
String query,
6668
boolean profile,
6769
Map<String, Map<String, Column>> tables,
68-
long queryStartTimeNanos
70+
long queryStartTimeNanos,
71+
boolean allowPartialResults
6972
) {
7073
this.zoneId = zi.normalized();
7174
this.now = ZonedDateTime.now(Clock.tick(Clock.system(zoneId), Duration.ofNanos(1)));
@@ -80,6 +83,7 @@ public Configuration(
8083
this.tables = tables;
8184
assert tables != null;
8285
this.queryStartTimeNanos = queryStartTimeNanos;
86+
this.allowPartialResults = allowPartialResults;
8387
}
8488

8589
public Configuration(BlockStreamInput in) throws IOException {
@@ -107,6 +111,11 @@ public Configuration(BlockStreamInput in) throws IOException {
107111
} else {
108112
this.queryStartTimeNanos = -1;
109113
}
114+
if (supportPartialResults(in.getTransportVersion())) {
115+
this.allowPartialResults = in.readBoolean();
116+
} else {
117+
this.allowPartialResults = false;
118+
}
110119
}
111120

112121
@Override
@@ -131,6 +140,11 @@ public void writeTo(StreamOutput out) throws IOException {
131140
if (out.getTransportVersion().onOrAfter(TransportVersions.V_8_16_0)) {
132141
out.writeLong(queryStartTimeNanos);
133142
}
143+
if (supportPartialResults(out.getTransportVersion())) {
144+
out.writeBoolean(allowPartialResults);
145+
} else if (allowPartialResults) {
146+
throw new IllegalArgumentException("allow_partial_result is not supported in this version");
147+
}
134148
}
135149

136150
public ZoneId zoneId() {
@@ -206,6 +220,13 @@ public boolean profile() {
206220
return profile;
207221
}
208222

223+
/**
224+
* Whether this request can return partial results instead of failing fast on failures
225+
*/
226+
public boolean allowPartialResults() {
227+
return allowPartialResults;
228+
}
229+
209230
private static void writeQuery(StreamOutput out, String query) throws IOException {
210231
if (query.length() > QUERY_COMPRESS_THRESHOLD_CHARS) { // compare on chars to avoid UTF-8 encoding unless actually required
211232
out.writeBoolean(true);
@@ -244,7 +265,8 @@ public boolean equals(Object o) {
244265
&& Objects.equals(locale, that.locale)
245266
&& Objects.equals(that.query, query)
246267
&& profile == that.profile
247-
&& tables.equals(that.tables);
268+
&& tables.equals(that.tables)
269+
&& allowPartialResults == that.allowPartialResults;
248270
}
249271

250272
@Override
@@ -260,7 +282,8 @@ public int hashCode() {
260282
locale,
261283
query,
262284
profile,
263-
tables
285+
tables,
286+
allowPartialResults
264287
);
265288
}
266289

@@ -282,6 +305,12 @@ public String toString() {
282305
+ profile
283306
+ ", tables="
284307
+ tables
308+
+ "allow_partial_result="
309+
+ allowPartialResults
285310
+ '}';
286311
}
312+
313+
public static boolean supportPartialResults(TransportVersion transportVersion) {
314+
return transportVersion.onOrAfter(TransportVersions.ESQL_SUPPORT_PARTIAL_RESULTS);
315+
}
287316
}

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/AbstractConfigurationFunctionTestCase.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ static Configuration randomConfiguration() {
4343
StringUtils.EMPTY,
4444
randomBoolean(),
4545
Map.of(),
46-
System.nanoTime()
46+
System.nanoTime(),
47+
randomBoolean()
4748
);
4849
}
4950

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/ToLowerTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ private Configuration randomLocaleConfig() {
7070
"",
7171
false,
7272
Map.of(),
73-
System.nanoTime()
73+
System.nanoTime(),
74+
randomBoolean()
7475
);
7576
}
7677

0 commit comments

Comments
 (0)