From 7875826ae1064bab04e9c35dcd245ca5b9dced5f Mon Sep 17 00:00:00 2001 From: Felix Barnsteiner Date: Tue, 28 Oct 2025 11:14:48 +0100 Subject: [PATCH 1/2] Fix for instant selector queries Accounts for ctx.duration() returning null --- .../parser/promql/LogicalPlanBuilder.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/promql/LogicalPlanBuilder.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/promql/LogicalPlanBuilder.java index fc341f7533841..803d7bf35d599 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/promql/LogicalPlanBuilder.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/promql/LogicalPlanBuilder.java @@ -118,23 +118,24 @@ public LogicalPlan visitSelector(PromqlBaseParser.SelectorContext ctx) { throw new ParsingException(source(labelsCtx), "Vector selector must contain at least one non-empty matcher"); } } + final LabelMatchers matchers = new LabelMatchers(labels); + UnresolvedAttribute timestamp = new UnresolvedAttribute(source, MetadataAttribute.TIMESTAMP_FIELD); + Evaluation evaluation = visitEvaluation(ctx.evaluation()); - TimeValue range = visitDuration(ctx.duration()); - // TODO: TimeValue might not be needed after all - Expression rangeEx = new Literal(source(ctx.duration()), Duration.ofSeconds(range.getSeconds()), DataType.TIME_DURATION); // fall back to default if (evaluation == null) { evaluation = new Evaluation(start); } - - final LabelMatchers matchers = new LabelMatchers(labels); final Evaluation finalEvaluation = evaluation; + PromqlBaseParser.DurationContext duration = ctx.duration(); + if (duration == null) { + return new InstantSelector(source, series, labelExpressions, matchers, finalEvaluation, timestamp); + } + TimeValue range = visitDuration(duration); + // TODO: TimeValue might not be needed after all + Expression rangeEx = new Literal(source(duration), Duration.ofSeconds(range.getSeconds()), DataType.TIME_DURATION); - UnresolvedAttribute timestamp = new UnresolvedAttribute(source, MetadataAttribute.TIMESTAMP_FIELD); - - return range == null - ? new InstantSelector(source, series, labelExpressions, matchers, finalEvaluation, timestamp) - : new RangeSelector(source, series, labelExpressions, matchers, rangeEx, finalEvaluation, timestamp); + return new RangeSelector(source, series, labelExpressions, matchers, rangeEx, finalEvaluation, timestamp); } @Override From 930956bf8724e5e498af302fb692e10ec26c0826 Mon Sep 17 00:00:00 2001 From: elasticsearchmachine Date: Tue, 28 Oct 2025 10:23:39 +0000 Subject: [PATCH 2/2] [CI] Auto commit changes from spotless --- .../xpack/esql/optimizer/LogicalPlanOptimizer.java | 8 ++++---- .../xpack/esql/plan/logical/promql/PromqlCommand.java | 7 +++---- .../optimizer/promql/PromqlLogicalPlanOptimizerTests.java | 2 -- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizer.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizer.java index a25ccdc58cf27..a54d87336a663 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizer.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizer.java @@ -117,10 +117,10 @@ public LogicalPlanOptimizer(LogicalOptimizerContext optimizerContext) { public LogicalPlan optimize(LogicalPlan verified) { var optimized = execute(verified); -// Failures failures = verifier.verify(optimized, verified.output()); -// if (failures.hasFailures()) { -// throw new VerificationException(failures); -// } + // Failures failures = verifier.verify(optimized, verified.output()); + // if (failures.hasFailures()) { + // throw new VerificationException(failures); + // } optimized.setOptimized(); return optimized; } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/promql/PromqlCommand.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/promql/PromqlCommand.java index 4d730c5076fcd..311a62f59d8af 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/promql/PromqlCommand.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/promql/PromqlCommand.java @@ -8,7 +8,6 @@ package org.elasticsearch.xpack.esql.plan.logical.promql; import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.core.TimeValue; import org.elasticsearch.xpack.esql.capabilities.TelemetryAware; import org.elasticsearch.xpack.esql.core.expression.Expression; import org.elasticsearch.xpack.esql.core.expression.Literal; @@ -103,9 +102,9 @@ public int hashCode() { public boolean equals(Object obj) { if (super.equals(obj)) { - PromqlCommand other = (PromqlCommand) obj; - return Objects.equals(child(), other.child()) && Objects.equals(promqlPlan, other.promqlPlan); - } + PromqlCommand other = (PromqlCommand) obj; + return Objects.equals(child(), other.child()) && Objects.equals(promqlPlan, other.promqlPlan); + } return false; } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/promql/PromqlLogicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/promql/PromqlLogicalPlanOptimizerTests.java index a6539c6189638..0bac9c8ba15e5 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/promql/PromqlLogicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/promql/PromqlLogicalPlanOptimizerTests.java @@ -9,7 +9,6 @@ import org.elasticsearch.TransportVersion; import org.elasticsearch.index.IndexMode; -import org.elasticsearch.transport.Transport; import org.elasticsearch.xpack.esql.EsqlTestUtils; import org.elasticsearch.xpack.esql.action.EsqlCapabilities; import org.elasticsearch.xpack.esql.analysis.Analyzer; @@ -23,7 +22,6 @@ import org.elasticsearch.xpack.esql.plan.logical.LogicalPlan; import org.junit.BeforeClass; -import java.util.Collections; import java.util.Map; import static java.util.Collections.emptyMap;