From 2f8e8be0427807da136319688b04de082df4fe6c Mon Sep 17 00:00:00 2001 From: discord9 Date: Tue, 12 Aug 2025 15:19:47 +0800 Subject: [PATCH] test: build a failing example with `LogicalPlanBuilder` Signed-off-by: discord9 --- src/query/src/promql/planner.rs | 84 ++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/src/query/src/promql/planner.rs b/src/query/src/promql/planner.rs index 302d95eb27..c9bb8698b0 100644 --- a/src/query/src/promql/planner.rs +++ b/src/query/src/promql/planner.rs @@ -3310,6 +3310,7 @@ mod test { use common_base::Plugins; use common_catalog::consts::{DEFAULT_CATALOG_NAME, DEFAULT_SCHEMA_NAME}; use common_query::test_util::DummyDecoder; + use datafusion::functions_aggregate::count::count; use datafusion_optimizer::OptimizerContext; use datatypes::prelude::ConcreteDataType; use datatypes::schema::{ColumnSchema, Schema}; @@ -4967,7 +4968,88 @@ Filter: up.field_0 IS NOT NULL [timestamp:Timestamp(Millisecond, None), field_0: SubqueryAlias: rhs [time:Timestamp(Millisecond, None), value:Float64;N] EmptyMetric: range=[0..-1], interval=[5000] [time:Timestamp(Millisecond, None), value:Float64;N]"#; - println!("{}", plan.display_indent_schema().to_string()); + let rhs = LogicalPlanBuilder::from(LogicalPlan::Extension(Extension { + node: Arc::new( + EmptyMetric::new( + 0, + -1, + 5000, + "time".to_string(), + "value".to_string(), + Some(lit(0.0f64)), + ) + .unwrap(), + ), + })) + .alias("rhs") + .unwrap() + .build() + .unwrap(); + + let full = LogicalPlanBuilder::from(LogicalPlan::Extension(Extension { + node: Arc::new( + EmptyMetric::new( + 0, + -1, + 5000, + "time".to_string(), + "value".to_string(), + Some(lit(0.0f64)), + ) + .unwrap(), + ), + })) + .aggregate( + vec![col(Column::new(Some(""), "time"))], + vec![count(col(Column::new(Some(""), "value")))], + ) + .unwrap() + .sort(vec![SortExpr::new( + col(Column::new(Some(""), "time")), + true, + false, + )]) + .unwrap() + .aggregate( + vec![col(Column::new(Some(""), "time"))], + vec![count(col("count(.value)"))], + ) + .unwrap() + .sort(vec![SortExpr::new( + col(Column::new(Some(""), "time")), + true, + false, + )]) + .unwrap() + .alias("lhs") + .unwrap() + .project(vec![ + col("lhs.time"), + col(Column::new(Some("lhs"), "count(count(.value))")), + ]) + .unwrap() + .join( + rhs, + JoinType::Inner, + ( + vec![Column::new(Some("lhs"), "time")], + vec![Column::new(Some("rhs"), "time")], + ), + None, + ) + .unwrap() + .build() + .unwrap(); + + dbg!(&full); + { + let optimizer = datafusion_optimizer::Optimizer::new(); + let optimized_full_plan = optimizer + .optimize(full, &OptimizerContext::default(), |_, _| {}) + .unwrap(); + } + return; + assert_eq!(plan.display_indent_schema().to_string(), expected); let optimizer = datafusion_optimizer::Optimizer::new(); let optimized_plan = optimizer