Skip to content

Commit 0f3f0f6

Browse files
committed
Differ between time set and start/end being equal
The responses in PromQL look different for these (`value` vs `values`)
1 parent a3f7297 commit 0f3f0f6

File tree

4 files changed

+47
-28
lines changed

4 files changed

+47
-28
lines changed

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,9 +1246,7 @@ public PlanFactory visitPromqlCommand(EsqlBaseParser.PromqlCommandContext ctx) {
12461246
throw PromqlParserUtils.adjustParsingException(pe, promqlStartLine, promqlStartColumn);
12471247
}
12481248

1249-
return plan -> params.time() != null
1250-
? new PromqlCommand(source, plan, promqlPlan, params.time())
1251-
: new PromqlCommand(source, plan, promqlPlan, params.start(), params.end(), params.step());
1249+
return plan -> new PromqlCommand(source, plan, promqlPlan, params);
12521250

12531251
}
12541252

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,4 +128,12 @@ public static PromqlParams parse(EsqlBaseParser.PromqlCommandContext ctx, Source
128128
}
129129
return new PromqlParams(time, start, end, step);
130130
}
131+
132+
public boolean isInstantQuery() {
133+
return time != null;
134+
}
135+
136+
public boolean isRangeQuery() {
137+
return step != null;
138+
}
131139
}

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/promql/PromqlCommand.java

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.elasticsearch.xpack.esql.common.Failures;
1414
import org.elasticsearch.xpack.esql.core.tree.NodeInfo;
1515
import org.elasticsearch.xpack.esql.core.tree.Source;
16+
import org.elasticsearch.xpack.esql.parser.promql.PromqlParams;
1617
import org.elasticsearch.xpack.esql.plan.logical.LogicalPlan;
1718
import org.elasticsearch.xpack.esql.plan.logical.UnaryPlan;
1819
import org.elasticsearch.xpack.esql.plan.logical.promql.selector.Selector;
@@ -31,35 +32,27 @@
3132
public class PromqlCommand extends UnaryPlan implements TelemetryAware, PostAnalysisVerificationAware {
3233

3334
private final LogicalPlan promqlPlan;
34-
private final Instant start, end;
35-
private final Duration step;
36-
37-
// Instant query constructor - shortcut for a range constructor
38-
public PromqlCommand(Source source, LogicalPlan child, LogicalPlan promqlPlan, Instant time) {
39-
this(source, child, promqlPlan, time, time, null);
40-
}
35+
private final PromqlParams params;
4136

4237
// Range query constructor
43-
public PromqlCommand(Source source, LogicalPlan child, LogicalPlan promqlPlan, Instant start, Instant end, Duration step) {
38+
public PromqlCommand(Source source, LogicalPlan child, LogicalPlan promqlPlan, PromqlParams params) {
4439
super(source, child);
4540
this.promqlPlan = promqlPlan;
46-
this.start = start;
47-
this.end = end;
48-
this.step = step;
41+
this.params = params;
4942
}
5043

5144
@Override
5245
protected NodeInfo<PromqlCommand> info() {
53-
return NodeInfo.create(this, PromqlCommand::new, child(), promqlPlan(), start(), end(), step());
46+
return NodeInfo.create(this, PromqlCommand::new, child(), promqlPlan(), params());
5447
}
5548

5649
@Override
5750
public PromqlCommand replaceChild(LogicalPlan newChild) {
58-
return new PromqlCommand(source(), newChild, promqlPlan(), start(), end(), step());
51+
return new PromqlCommand(source(), newChild, promqlPlan(), params());
5952
}
6053

6154
public PromqlCommand withPromqlPlan(LogicalPlan newPromqlPlan) {
62-
return new PromqlCommand(source(), child(), newPromqlPlan, start(), end(), step());
55+
return new PromqlCommand(source(), child(), newPromqlPlan, params());
6356
}
6457

6558
@Override
@@ -86,21 +79,37 @@ public LogicalPlan promqlPlan() {
8679
return promqlPlan;
8780
}
8881

82+
public PromqlParams params() {
83+
return params;
84+
}
85+
8986
public Instant start() {
90-
return start;
87+
return params().start();
9188
}
9289

9390
public Instant end() {
94-
return end;
91+
return params().end();
92+
}
93+
94+
public Instant time() {
95+
return params().time();
9596
}
9697

9798
public Duration step() {
98-
return step;
99+
return params().step();
100+
}
101+
102+
public boolean isInstantQuery() {
103+
return params().isInstantQuery();
104+
}
105+
106+
public boolean isRangeQuery() {
107+
return params().isRangeQuery();
99108
}
100109

101110
@Override
102111
public int hashCode() {
103-
return Objects.hash(child(), start, end, step, promqlPlan);
112+
return Objects.hash(child(), params, promqlPlan);
104113
}
105114

106115
@Override
@@ -118,11 +127,8 @@ public boolean equals(Object obj) {
118127
public String nodeString() {
119128
StringBuilder sb = new StringBuilder();
120129
sb.append(nodeName());
121-
if (start == end) {
122-
sb.append("time=").append(start);
123-
} else {
124-
sb.append("start=").append(start).append(", end=").append(end).append(", step=").append(step);
125-
}
130+
sb.append("params=");
131+
sb.append(params.toString());
126132
sb.append(" promql=[<>\n");
127133
sb.append(promqlPlan.toString());
128134
sb.append("\n<>]]");

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/promql/PromqlParamsTests.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,27 @@ public void testValidRangeQuery() {
3131
assertThat(promql.start(), equalTo(Instant.parse("2025-10-31T00:00:00Z")));
3232
assertThat(promql.end(), equalTo(Instant.parse("2025-10-31T01:00:00Z")));
3333
assertThat(promql.step(), equalTo(Duration.ofMinutes(1)));
34+
assertThat(promql.isRangeQuery(), equalTo(true));
35+
assertThat(promql.isInstantQuery(), equalTo(false));
3436
}
3537

3638
public void testValidRangeQueryOnlyStep() {
3739
PromqlCommand promql = parse("TS test | PROMQL step 1 (avg(foo))");
3840
assertThat(promql.start(), nullValue());
3941
assertThat(promql.end(), nullValue());
4042
assertThat(promql.step(), equalTo(Duration.ofSeconds(1)));
43+
assertThat(promql.isRangeQuery(), equalTo(true));
44+
assertThat(promql.isInstantQuery(), equalTo(false));
4145
}
4246

4347
public void testValidInstantQuery() {
4448
PromqlCommand promql = parse("TS test | PROMQL time `2025-10-31T00:00:00Z` (avg(foo))");
45-
assertThat(promql.start(), equalTo(Instant.parse("2025-10-31T00:00:00Z")));
46-
assertThat(promql.end(), equalTo(Instant.parse("2025-10-31T00:00:00Z")));
49+
assertThat(promql.start(), nullValue());
50+
assertThat(promql.end(), nullValue());
51+
assertThat(promql.time(), equalTo(Instant.parse("2025-10-31T00:00:00Z")));
4752
assertThat(promql.step(), nullValue());
53+
assertThat(promql.isInstantQuery(), equalTo(true));
54+
assertThat(promql.isRangeQuery(), equalTo(false));
4855
}
4956

5057
// TODO nicer error messages for missing params

0 commit comments

Comments
 (0)