From f882c1182d0ed35b32765fcb9fb77edbaa625f93 Mon Sep 17 00:00:00 2001
From: discord9 <55937128+discord9@users.noreply.github.com>
Date: Mon, 26 Oct 2026 19:02:38 +0800
Subject: [PATCH] refactor(promql): reuse prepared native operand context
Signed-off-by: discord9 <55937128+discord9@users.noreply.github.com>
---
src/query/src/promql/planner/native.rs | 108 ++++++++++++-------------
1 file changed, 50 insertions(+), 58 deletions(-)
diff --git a/src/query/src/promql/planner/native.rs b/src/query/src/promql/planner/native.rs
index f8e503bc4c4..5fcbb7ca0d3 100644
--- a/src/query/src/promql/planner/native.rs
+++ b/src/query/src/promql/planner/native.rs
@@ -134,33 +134,12 @@ pub(crate) fn hybrid_binary_admitted(
|| matches!(&modifier.matching, Some(LabelModifier::Exclude(labels)) if labels.labels.is_empty()))
}
};
- let has_aggregate = |expr: &PromExpr| {
- fn visit(expr: &PromExpr) -> bool {
- match expr {
- PromExpr::Aggregate(_) => true,
- PromExpr::Paren(x) => visit(&x.expr),
- PromExpr::Unary(x) => visit(&x.expr),
- PromExpr::Binary(x) => visit(&x.lhs) || visit(&x.rhs),
- PromExpr::Call(x) => x.args.args.iter().any(|arg| visit(arg)),
- _ => false,
- }
- }
- visit(expr)
- };
- let one_selector = |expr: &PromExpr| {
- let mut selectors = Vec::new();
- collect_selectors(expr, &mut selectors) && selectors.len() == 1
- };
supported_op
&& supported_matching
&& lhs.value_type() == ValueType::Vector
&& rhs.value_type() == ValueType::Vector
- && admitted_single_selector(lhs)
- && admitted_single_selector(rhs)
- && !has_aggregate(lhs)
- && !has_aggregate(rhs)
- && one_selector(lhs)
- && one_selector(rhs)
+ && admitted_selector(lhs).is_some()
+ && admitted_selector(rhs).is_some()
}
impl PromPlanner {
@@ -169,35 +148,24 @@ impl PromPlanner {
expr: &PromExpr,
query_engine_state: &QueryEngineState,
) -> Result