Skip to content

Commit 15907af

Browse files
committed
Added defaults to settings
1 parent 2d627e7 commit 15907af

File tree

2 files changed

+30
-5
lines changed

2 files changed

+30
-5
lines changed

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import org.elasticsearch.xpack.esql.parser.ParsingException;
1717

1818
import java.time.ZoneId;
19+
import java.time.ZoneOffset;
20+
import java.util.function.Function;
1921

2022
public class QuerySettings {
2123
// TODO check cluster state and see if project routing is allowed
@@ -30,7 +32,8 @@ public class QuerySettings {
3032
"A project routing expression, "
3133
+ "used to define which projects to route the query to. "
3234
+ "Only supported if Cross-Project Search is enabled.",
33-
(value, settings) -> Foldables.stringLiteralValueOf(value, "Unexpected value")
35+
(value, settings) -> Foldables.stringLiteralValueOf(value, "Unexpected value"),
36+
(_rcs) -> null
3437
);
3538

3639
public static final QuerySettingDef<ZoneId> TIME_ZONE = new QuerySettingDef<>(
@@ -47,7 +50,8 @@ public class QuerySettings {
4750
} catch (Exception exc) {
4851
throw new QlIllegalArgumentException("Invalid time zone [" + timeZone + "]");
4952
}
50-
}
53+
},
54+
(_rcs) -> ZoneOffset.UTC
5155
);
5256

5357
public static final QuerySettingDef<?>[] ALL_SETTINGS = { PROJECT_ROUTING, TIME_ZONE };
@@ -86,6 +90,7 @@ public static void validate(EsqlStatement statement, RemoteClusterService cluste
8690
* @param validator A validation function to check the setting value.
8791
* Defaults to calling the {@link #parser} and returning the error message of any exception it throws.
8892
* @param parser A function to parse the setting value into the final object.
93+
* @param defaultValueSupplier A supplier of the default value to be used when the setting is not set.
8994
* @param <T> The type of the setting value.
9095
*/
9196
public record QuerySettingDef<T>(
@@ -96,7 +101,8 @@ public record QuerySettingDef<T>(
96101
boolean snapshotOnly,
97102
String description,
98103
Validator validator,
99-
Parser<T> parser
104+
Parser<T> parser,
105+
Function<RemoteClusterService, T> defaultValueSupplier
100106
) {
101107
public QuerySettingDef(
102108
String name,
@@ -105,7 +111,8 @@ public QuerySettingDef(
105111
boolean preview,
106112
boolean snapshotOnly,
107113
String description,
108-
Parser<T> parser
114+
Parser<T> parser,
115+
Function<RemoteClusterService, T> defaultValueSupplier
109116
) {
110117
this(name, type, serverlessOnly, preview, snapshotOnly, description, (value, rcs) -> {
111118
try {
@@ -114,10 +121,13 @@ public QuerySettingDef(
114121
} catch (Exception exc) {
115122
return exc.getMessage();
116123
}
117-
}, parser);
124+
}, parser, defaultValueSupplier);
118125
}
119126

120127
public T get(Expression value, RemoteClusterService clusterService) {
128+
if (value == null) {
129+
return defaultValueSupplier.apply(clusterService);
130+
}
121131
return parser.parse(value, clusterService);
122132
}
123133

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/QuerySettingsTests.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,14 @@
1919
import org.junit.AfterClass;
2020

2121
import java.time.ZoneId;
22+
import java.time.ZoneOffset;
2223
import java.util.List;
2324

25+
import static org.hamcrest.Matchers.both;
2426
import static org.hamcrest.Matchers.containsString;
2527
import static org.hamcrest.Matchers.equalTo;
28+
import static org.hamcrest.Matchers.not;
29+
import static org.hamcrest.Matchers.nullValue;
2630

2731
public class QuerySettingsTests extends ESTestCase {
2832
public void testNonExistingSetting() {
@@ -34,6 +38,7 @@ public void testNonExistingSetting() {
3438
public void testProjectRouting() {
3539
var setting = QuerySettings.PROJECT_ROUTING;
3640

41+
assertDefault(setting, nullValue());
3742
assertValid(setting, Literal.keyword(Source.EMPTY, "my-project"), equalTo("my-project"));
3843

3944
assertInvalid(
@@ -46,6 +51,10 @@ public void testProjectRouting() {
4651
public void testTimeZone() {
4752
var setting = QuerySettings.TIME_ZONE;
4853

54+
assertDefault(setting, both(equalTo(ZoneId.of("Z"))).and(equalTo(ZoneOffset.UTC)));
55+
56+
assertValid(setting, Literal.keyword(Source.EMPTY, "UTC"), equalTo(ZoneId.of("UTC")));
57+
assertValid(setting, Literal.keyword(Source.EMPTY, "Z"), both(equalTo(ZoneId.of("Z"))).and(equalTo(ZoneOffset.UTC)));
4958
assertValid(setting, Literal.keyword(Source.EMPTY, "Europe/Madrid"), equalTo(ZoneId.of("Europe/Madrid")));
5059
assertValid(setting, Literal.keyword(Source.EMPTY, "+05:00"), equalTo(ZoneId.of("+05:00")));
5160
assertValid(setting, Literal.keyword(Source.EMPTY, "+05"), equalTo(ZoneId.of("+05")));
@@ -81,6 +90,12 @@ private static void assertInvalid(String settingName, Expression valueExpression
8190
);
8291
}
8392

93+
private static <T> void assertDefault(QuerySettings.QuerySettingDef<T> settingDef, Matcher<? super T> defaultMatcher) {
94+
T value = settingDef.get(null, null);
95+
96+
assertThat(value, defaultMatcher);
97+
}
98+
8499
@AfterClass
85100
public static void generateDocs() throws Exception {
86101
for (QuerySettings.QuerySettingDef<?> def : QuerySettings.ALL_SETTINGS) {

0 commit comments

Comments
 (0)