Skip to content

Commit 569d9e5

Browse files
committed
Add SET CSV tests, and adapted CsvTests to work with SET statements
1 parent f95c2a8 commit 569d9e5

File tree

6 files changed

+68
-23
lines changed

6 files changed

+68
-23
lines changed

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

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,6 @@
1313
import java.util.function.Function;
1414
import java.util.regex.Pattern;
1515

16-
import static org.hamcrest.CoreMatchers.is;
17-
import static org.junit.Assert.assertThat;
18-
1916
public final class CsvSpecReader {
2017

2118
private CsvSpecReader() {}
@@ -25,9 +22,6 @@ public static SpecReader.Parser specParser() {
2522
}
2623

2724
public static class CsvSpecParser implements SpecReader.Parser {
28-
private static final String SCHEMA_PREFIX = "schema::";
29-
30-
private final StringBuilder earlySchema = new StringBuilder();
3125
private final StringBuilder query = new StringBuilder();
3226
private final StringBuilder data = new StringBuilder();
3327
private final List<String> requiredCapabilities = new ArrayList<>();
@@ -39,21 +33,16 @@ private CsvSpecParser() {}
3933
public Object parse(String line) {
4034
// read the query
4135
if (testCase == null) {
42-
if (line.startsWith(SCHEMA_PREFIX)) {
43-
assertThat("Early schema already declared " + earlySchema, earlySchema.length(), is(0));
44-
earlySchema.append(line.substring(SCHEMA_PREFIX.length()).trim());
45-
} else if (line.toLowerCase(Locale.ROOT).startsWith("required_capability:")) {
36+
if (line.toLowerCase(Locale.ROOT).startsWith("required_capability:")) {
4637
requiredCapabilities.add(line.substring("required_capability:".length()).trim());
4738
} else {
4839
if (line.endsWith(";")) {
4940
// pick up the query
5041
testCase = new CsvTestCase();
5142
query.append(line.substring(0, line.length() - 1).trim());
5243
testCase.query = query.toString();
53-
testCase.earlySchema = earlySchema.toString();
5444
testCase.requiredCapabilities = List.copyOf(requiredCapabilities);
5545
requiredCapabilities.clear();
56-
earlySchema.setLength(0);
5746
query.setLength(0);
5847
}
5948
// keep reading the query
@@ -109,7 +98,6 @@ private static Pattern warningRegexToPattern(String regex) {
10998

11099
public static class CsvTestCase {
111100
public String query;
112-
public String earlySchema;
113101
public String expectedResults;
114102
private final List<String> expectedWarnings = new ArrayList<>();
115103
private final List<String> expectedWarningsRegexString = new ArrayList<>();

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@
7878
import org.elasticsearch.xpack.esql.core.tree.Source;
7979
import org.elasticsearch.xpack.esql.core.type.DataType;
8080
import org.elasticsearch.xpack.esql.core.type.EsField;
81-
import org.elasticsearch.xpack.esql.core.util.DateUtils;
8281
import org.elasticsearch.xpack.esql.core.util.StringUtils;
8382
import org.elasticsearch.xpack.esql.expression.function.EsqlFunctionRegistry;
8483
import org.elasticsearch.xpack.esql.expression.function.scalar.spatial.StGeohash;
@@ -99,6 +98,8 @@
9998
import org.elasticsearch.xpack.esql.inference.InferenceService;
10099
import org.elasticsearch.xpack.esql.optimizer.LogicalOptimizerContext;
101100
import org.elasticsearch.xpack.esql.parser.QueryParam;
101+
import org.elasticsearch.xpack.esql.plan.EsqlStatement;
102+
import org.elasticsearch.xpack.esql.plan.QuerySettings;
102103
import org.elasticsearch.xpack.esql.plan.logical.Enrich;
103104
import org.elasticsearch.xpack.esql.plan.logical.EsRelation;
104105
import org.elasticsearch.xpack.esql.plan.logical.Limit;
@@ -516,9 +517,9 @@ private static ThreadPool createMockThreadPool() {
516517

517518
private EsqlTestUtils() {}
518519

519-
public static Configuration configuration(QueryPragmas pragmas, String query) {
520+
public static Configuration configuration(QueryPragmas pragmas, String query, EsqlStatement statement) {
520521
return new Configuration(
521-
DateUtils.UTC,
522+
statement.setting(QuerySettings.TIME_ZONE),
522523
Locale.US,
523524
null,
524525
null,
@@ -535,6 +536,10 @@ public static Configuration configuration(QueryPragmas pragmas, String query) {
535536
);
536537
}
537538

539+
public static Configuration configuration(QueryPragmas pragmas, String query) {
540+
return configuration(pragmas, query, new EsqlStatement(null, List.of()));
541+
}
542+
538543
public static Configuration configuration(QueryPragmas pragmas) {
539544
return configuration(pragmas, StringUtils.EMPTY);
540545
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
set
2+
required_capability: global_timezone_parameter
3+
4+
set time_zone="+02:00"; from employees
5+
| sort emp_no
6+
| keep emp_no, hire_date
7+
| eval hour = date_extract("hour_of_day", hire_date)
8+
| limit 1;
9+
10+
emp_no:integer | hire_date:date | hour:long
11+
10001 | 1986-06-26T00:00:00.000Z | 2
12+
;
13+
14+
set with foldable
15+
required_capability: global_timezone_parameter
16+
17+
set time_zone="+02:00"; ROW date = "1986-06-26T00:00:00.000Z"::date
18+
| eval hour = date_extract("hour_of_day", date)
19+
;
20+
21+
date:date | hour:long
22+
1986-06-26T00:00:00.000Z | 2
23+
;
24+
25+
last set prevails
26+
required_capability: global_timezone_parameter
27+
28+
set time_zone="+02:00"; set time_zone="+05:00"; from employees
29+
| sort emp_no
30+
| keep emp_no, hire_date
31+
| eval hour = date_extract("hour_of_day", hire_date)
32+
| limit 1;
33+
34+
emp_no:integer | hire_date:date | hour:long
35+
10001 | 1986-06-26T00:00:00.000Z | 5
36+
;

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ public LogicalPlan createStatement(String query, QueryParams params, PlanTelemet
115115
return invokeParser(query, params, metrics, EsqlBaseParser::singleStatement, AstBuilder::plan);
116116
}
117117

118+
// testing utility
119+
public EsqlStatement createQuery(String query) {
120+
return createQuery(query, new QueryParams());
121+
}
122+
118123
// testing utility
119124
public EsqlStatement createQuery(String query, QueryParams params) {
120125
return createQuery(query, params, new PlanTelemetry(new EsqlFunctionRegistry()));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ public long absoluteStartedTimeInMillis() {
202202
/**
203203
* @return Start time of the ESQL query in nanos
204204
*/
205-
public long getQueryStartTimeNanos() {
205+
public long queryStartTimeNanos() {
206206
return queryStartTimeNanos;
207207
}
208208

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

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
import org.elasticsearch.xpack.esql.optimizer.LogicalPreOptimizerContext;
8080
import org.elasticsearch.xpack.esql.optimizer.TestLocalPhysicalPlanOptimizer;
8181
import org.elasticsearch.xpack.esql.parser.EsqlParser;
82+
import org.elasticsearch.xpack.esql.plan.EsqlStatement;
8283
import org.elasticsearch.xpack.esql.plan.logical.Enrich;
8384
import org.elasticsearch.xpack.esql.plan.logical.LogicalPlan;
8485
import org.elasticsearch.xpack.esql.plan.physical.ChangePointExec;
@@ -189,9 +190,13 @@ public class CsvTests extends ESTestCase {
189190
private final CsvSpecReader.CsvTestCase testCase;
190191
private final String instructions;
191192

192-
private final Configuration configuration = EsqlTestUtils.configuration(
193-
new QueryPragmas(Settings.builder().put("page_size", randomPageSize()).build())
194-
);
193+
/**
194+
* The configuration to be used in the tests.
195+
* <p>
196+
* Initialized in {@link #executePlan}.
197+
* </p>
198+
*/
199+
private Configuration configuration;
195200
private final EsqlFunctionRegistry functionRegistry = new EsqlFunctionRegistry();
196201
private final EsqlParser parser = new EsqlParser();
197202
private final Mapper mapper = new Mapper();
@@ -526,6 +531,7 @@ private static EnrichPolicy loadEnrichPolicyMapping(String policyFileName) {
526531

527532
private LogicalPlan analyzedPlan(
528533
LogicalPlan parsed,
534+
Configuration configuration,
529535
CsvTestsDataLoader.MultiIndexTestDataset datasets,
530536
TransportVersion minimumVersion
531537
) {
@@ -594,11 +600,16 @@ private static TestPhysicalOperationProviders testOperationProviders(
594600
}
595601

596602
private ActualResults executePlan(BigArrays bigArrays) throws Exception {
597-
LogicalPlan parsed = parser.createStatement(testCase.query);
598-
var testDatasets = testDatasets(parsed);
603+
EsqlStatement statement = parser.createQuery(testCase.query);
604+
this.configuration = EsqlTestUtils.configuration(
605+
new QueryPragmas(Settings.builder().put("page_size", randomPageSize()).build()),
606+
testCase.query,
607+
statement
608+
);
609+
var testDatasets = testDatasets(statement.plan());
599610
// Specifically use the newest transport version; the csv tests correspond to a single node cluster on the current version.
600611
TransportVersion minimumVersion = TransportVersion.current();
601-
LogicalPlan analyzed = analyzedPlan(parsed, testDatasets, minimumVersion);
612+
LogicalPlan analyzed = analyzedPlan(statement.plan(), configuration, testDatasets, minimumVersion);
602613

603614
FoldContext foldCtx = FoldContext.small();
604615
EsqlSession session = new EsqlSession(

0 commit comments

Comments
 (0)