From 7a820adc5f43c6e1cd2b681926b9ac9872057489 Mon Sep 17 00:00:00 2001 From: Alexandr Romanenko Date: Thu, 22 May 2025 15:49:13 +0200 Subject: [PATCH 1/2] fix(tesseract): Filters over proxy time dimensions --- .../src/planner/filter/base_filter.rs | 51 +++++++++++++++---- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/rust/cubesqlplanner/cubesqlplanner/src/planner/filter/base_filter.rs b/rust/cubesqlplanner/cubesqlplanner/src/planner/filter/base_filter.rs index aad4c13b1db62..d102589d72bbc 100644 --- a/rust/cubesqlplanner/cubesqlplanner/src/planner/filter/base_filter.rs +++ b/rust/cubesqlplanner/cubesqlplanner/src/planner/filter/base_filter.rs @@ -25,6 +25,7 @@ pub struct BaseFilter { filter_type: FilterType, filter_operator: FilterOperator, values: Vec>, + is_over_date_range: bool, use_raw_values: bool, templates: FilterTemplates, } @@ -51,11 +52,31 @@ impl BaseFilter { } else { vec![] }; + + //Check if we have proxy time dimension as input + let symbol_to_check = if let Ok(time_dimension) = member_evaluator.as_time_dimension() { + time_dimension.base_symbol().clone() + } else { + member_evaluator.clone() + }; + + let resolved_ref = symbol_to_check.resolve_reference_chain(); + let is_over_date_range = if resolved_ref.as_time_dimension().is_ok() { + true + } else { + false + }; + + + + + Ok(Rc::new(Self { query_tools, member_evaluator, filter_type, filter_operator, + is_over_date_range, values, templates, use_raw_values: false, @@ -72,6 +93,7 @@ impl BaseFilter { query_tools: self.query_tools.clone(), member_evaluator: self.member_evaluator.clone(), filter_type: self.filter_type.clone(), + is_over_date_range: self.is_over_date_range, filter_operator, values, templates: self.templates.clone(), @@ -131,6 +153,11 @@ impl BaseFilter { context.clone(), plan_templates, )?; + let member_sql = if self.is_over_date_range { + plan_templates.base_tools().time_stamp_cast(member_sql.clone())? + } else { + member_sql + }; let filters_context = context.filters_context(); let res = match self.filter_operator { @@ -234,7 +261,7 @@ impl BaseFilter { if self.is_array_value() { self.templates.in_where( member_sql.to_string(), - self.filter_and_allocate_values(), + self.filter_and_allocate_values()?, need_null_check, ) } else if self.is_values_contains_null() { @@ -254,7 +281,7 @@ impl BaseFilter { if self.is_array_value() { self.templates.not_in_where( member_sql.to_string(), - self.filter_and_allocate_values(), + self.filter_and_allocate_values()?, need_null_check, ) } else if self.is_values_contains_null() { @@ -433,7 +460,7 @@ impl BaseFilter { let need_null_check = self.is_need_null_chek(false); self.templates.in_where( member_sql.to_string(), - self.filter_and_allocate_values(), + self.filter_and_allocate_values()?, need_null_check, ) } @@ -446,7 +473,7 @@ impl BaseFilter { let need_null_check = self.is_need_null_chek(true); self.templates.not_in_where( member_sql.to_string(), - self.filter_and_allocate_values(), + self.filter_and_allocate_values()?, need_null_check, ) } @@ -558,7 +585,7 @@ impl BaseFilter { start_wild: bool, end_wild: bool, ) -> Result { - let values = self.filter_and_allocate_values(); + let values = self.filter_and_allocate_values()?; let like_parts = values .into_iter() .map(|v| { @@ -655,8 +682,12 @@ impl BaseFilter { QueryDateTimeHelper::format_to_date(date, self.query_tools.clone()) } - fn allocate_param(&self, param: &str) -> String { - self.query_tools.allocate_param(param) + fn allocate_param(&self, param: &str) -> Result { + if self.is_over_date_range { + self.allocate_timestamp_param(param, false) + } else { + Ok(self.query_tools.allocate_param(param)) + } } fn allocate_timestamp_param( @@ -682,7 +713,7 @@ impl BaseFilter { ))) } else { if let Some(value) = &self.values[0] { - Ok(self.allocate_param(value)) + self.allocate_param(value) } else { Ok("NULL".to_string()) } @@ -730,10 +761,10 @@ impl BaseFilter { self.values.len() > 1 } - fn filter_and_allocate_values(&self) -> Vec { + fn filter_and_allocate_values(&self) -> Result, CubeError> { self.values .iter() .filter_map(|v| v.as_ref().map(|v| self.allocate_param(&v))) - .collect::>() + .collect::, _>>() } } From e4de557fe06d31dd9ce165f8822943ed9aea22cf Mon Sep 17 00:00:00 2001 From: Alexandr Romanenko Date: Thu, 22 May 2025 15:52:28 +0200 Subject: [PATCH 2/2] fmt --- .../cubesqlplanner/src/planner/filter/base_filter.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/rust/cubesqlplanner/cubesqlplanner/src/planner/filter/base_filter.rs b/rust/cubesqlplanner/cubesqlplanner/src/planner/filter/base_filter.rs index d102589d72bbc..f7e296b1a1dc4 100644 --- a/rust/cubesqlplanner/cubesqlplanner/src/planner/filter/base_filter.rs +++ b/rust/cubesqlplanner/cubesqlplanner/src/planner/filter/base_filter.rs @@ -53,7 +53,7 @@ impl BaseFilter { vec![] }; - //Check if we have proxy time dimension as input + //Check if we have proxy time dimension as input let symbol_to_check = if let Ok(time_dimension) = member_evaluator.as_time_dimension() { time_dimension.base_symbol().clone() } else { @@ -66,10 +66,6 @@ impl BaseFilter { } else { false }; - - - - Ok(Rc::new(Self { query_tools, @@ -154,7 +150,9 @@ impl BaseFilter { plan_templates, )?; let member_sql = if self.is_over_date_range { - plan_templates.base_tools().time_stamp_cast(member_sql.clone())? + plan_templates + .base_tools() + .time_stamp_cast(member_sql.clone())? } else { member_sql };