diff --git a/rust/cubesqlplanner/cubesqlplanner/src/planner/filter/base_filter.rs b/rust/cubesqlplanner/cubesqlplanner/src/planner/filter/base_filter.rs index aad4c13b1db62..f7e296b1a1dc4 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,27 @@ 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 +89,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 +149,13 @@ 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 +259,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 +279,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 +458,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 +471,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 +583,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 +680,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 +711,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 +759,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::, _>>() } }