Skip to content

Commit ed2c307

Browse files
committed
filter_group in segments
1 parent 916b926 commit ed2c307

File tree

9 files changed

+68
-15
lines changed

9 files changed

+68
-15
lines changed

rust/cubesqlplanner/cubesqlplanner/src/planner/base_dimension.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ impl BaseDimension {
129129
name.clone(),
130130
MemberExpressionExpression::SqlCall(expression),
131131
member_expression_definition.clone(),
132+
query_tools.base_tools().clone(),
132133
)?;
133134
let full_name = member_expression_symbol.full_name();
134135
let member_evaluator = Rc::new(MemberSymbol::MemberExpression(member_expression_symbol));

rust/cubesqlplanner/cubesqlplanner/src/planner/base_measure.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ impl BaseMeasure {
136136
name.clone(),
137137
expression,
138138
member_expression_definition.clone(),
139+
query_tools.base_tools().clone(),
139140
)?;
140141
let full_name = member_expression_symbol.full_name();
141142
let member_evaluator = Rc::new(MemberSymbol::MemberExpression(member_expression_symbol));

rust/cubesqlplanner/cubesqlplanner/src/planner/filter/base_segment.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use crate::planner::query_tools::QueryTools;
2-
use crate::planner::sql_evaluator::{MemberExpressionExpression, MemberExpressionSymbol, MemberSymbol, SqlCall};
2+
use crate::planner::sql_evaluator::{
3+
MemberExpressionExpression, MemberExpressionSymbol, MemberSymbol, SqlCall,
4+
};
35
use crate::planner::sql_templates::PlanSqlTemplates;
46
use crate::planner::{evaluate_with_context, VisitorContext};
57
use cubenativeutils::CubeError;
@@ -27,8 +29,13 @@ impl BaseSegment {
2729
full_name: Option<String>,
2830
query_tools: Rc<QueryTools>,
2931
) -> Result<Rc<Self>, CubeError> {
30-
let member_expression_symbol =
31-
MemberExpressionSymbol::try_new(cube_name.clone(), name.clone(), MemberExpressionExpression::SqlCall(expression), None)?;
32+
let member_expression_symbol = MemberExpressionSymbol::try_new(
33+
cube_name.clone(),
34+
name.clone(),
35+
MemberExpressionExpression::SqlCall(expression),
36+
None,
37+
query_tools.base_tools().clone(),
38+
)?;
3239
let full_name = full_name.unwrap_or(member_expression_symbol.full_name());
3340
let member_evaluator = Rc::new(MemberSymbol::MemberExpression(member_expression_symbol));
3441

rust/cubesqlplanner/cubesqlplanner/src/planner/query_tools.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ impl QueryTools {
142142
};
143143
let evaluator_compiler = Rc::new(RefCell::new(Compiler::new(
144144
cube_evaluator.clone(),
145+
base_tools.clone(),
145146
timezone.clone(),
146147
)));
147148
Ok(Rc::new(Self {

rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator/compiler.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use super::{
55
CubeNameSymbolFactory, CubeTableSymbolFactory, DimensionSymbolFactory, MeasureSymbolFactory,
66
SqlCall, SymbolFactory, TraversalVisitor,
77
};
8+
use crate::cube_bridge::base_tools::BaseTools;
89
use crate::cube_bridge::evaluator::CubeEvaluator;
910
use crate::cube_bridge::join_hints::JoinHintItem;
1011
use crate::cube_bridge::member_sql::MemberSql;
@@ -14,15 +15,21 @@ use std::collections::HashMap;
1415
use std::rc::Rc;
1516
pub struct Compiler {
1617
cube_evaluator: Rc<dyn CubeEvaluator>,
18+
base_tools: Rc<dyn BaseTools>,
1719
timezone: Tz,
1820
/* (type, name) */
1921
members: HashMap<(String, String), Rc<MemberSymbol>>,
2022
}
2123

2224
impl Compiler {
23-
pub fn new(cube_evaluator: Rc<dyn CubeEvaluator>, timezone: Tz) -> Self {
25+
pub fn new(
26+
cube_evaluator: Rc<dyn CubeEvaluator>,
27+
base_tools: Rc<dyn BaseTools>,
28+
timezone: Tz,
29+
) -> Self {
2430
Self {
2531
cube_evaluator,
32+
base_tools,
2633
timezone,
2734
members: HashMap::new(),
2835
}
@@ -45,6 +52,10 @@ impl Compiler {
4552
}
4653
}
4754

55+
pub fn base_tools(&self) -> Rc<dyn BaseTools> {
56+
self.base_tools.clone()
57+
}
58+
4859
pub fn add_measure_evaluator(
4960
&mut self,
5061
measure: String,

rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator/sql_call.rs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use super::dependecy::{
44
use super::sql_nodes::SqlNode;
55
use super::{symbols::MemberSymbol, SqlEvaluatorVisitor};
66
use crate::cube_bridge::base_query_options::FilterItem as NativeFilterItem;
7+
use crate::cube_bridge::base_tools::BaseTools;
78
use crate::cube_bridge::member_sql::{ContextSymbolArg, MemberSql, MemberSqlArg, MemberSqlStruct};
89
use crate::plan::{Filter, FilterItem};
910
use crate::planner::query_tools::QueryTools;
@@ -45,7 +46,7 @@ impl SqlCall {
4546
self.member_sql.call(args)
4647
}
4748

48-
pub fn is_direct_reference(&self) -> Result<bool, CubeError> {
49+
pub fn is_direct_reference(&self, base_tools: Rc<dyn BaseTools>) -> Result<bool, CubeError> {
4950
let dependencies = self.get_dependencies();
5051
if dependencies.len() != 1 {
5152
return Ok(false);
@@ -56,7 +57,7 @@ impl SqlCall {
5657
let args = self
5758
.deps
5859
.iter()
59-
.map(|d| self.evaluate_single_dep_for_ref_check(&d))
60+
.map(|d| self.evaluate_single_dep_for_ref_check(&d, base_tools.clone()))
6061
.collect::<Result<Vec<_>, _>>()?;
6162
let eval_result = self.member_sql.call(args)?;
6263

@@ -190,14 +191,34 @@ impl SqlCall {
190191
fn evaluate_single_dep_for_ref_check(
191192
&self,
192193
dep: &Dependency,
194+
base_tools: Rc<dyn BaseTools>,
193195
) -> Result<MemberSqlArg, CubeError> {
194196
match dep {
195197
Dependency::SymbolDependency(dep) => Ok(MemberSqlArg::String(dep.full_name())),
196198
Dependency::TimeDimensionDependency(dep) => {
197199
self.evaluate_time_dimesion_dep_for_ref_check(dep)
198200
}
199201
Dependency::CubeDependency(dep) => self.evaluate_cube_dep_for_ref_check(dep),
200-
Dependency::ContextDependency(_) => Ok(MemberSqlArg::String(format!("Context Symbol"))),
202+
Dependency::ContextDependency(dep) => match dep {
203+
ContextSymbolDep::SecurityContext => Ok(MemberSqlArg::ContextSymbol(
204+
ContextSymbolArg::SecurityContext(base_tools.security_context_for_rust()?),
205+
)),
206+
ContextSymbolDep::FilterParams => {
207+
let r = base_tools.filters_proxy_for_rust(None)?;
208+
Ok(MemberSqlArg::ContextSymbol(ContextSymbolArg::FilterParams(
209+
r,
210+
)))
211+
}
212+
ContextSymbolDep::FilterGroup => {
213+
let r = base_tools.filter_group_function_for_rust(None)?;
214+
Ok(MemberSqlArg::ContextSymbol(ContextSymbolArg::FilterGroup(
215+
r,
216+
)))
217+
}
218+
ContextSymbolDep::SqlUtils => Ok(MemberSqlArg::ContextSymbol(
219+
ContextSymbolArg::SqlUtils(base_tools.sql_utils_for_rust()?),
220+
)),
221+
},
201222
}
202223
}
203224

rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator/symbols/dimension_symbol.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ impl SymbolFactory for DimensionSymbolFactory {
263263
};
264264

265265
let is_sql_direct_ref = if let Some(sql) = &sql {
266-
sql.is_direct_reference()?
266+
sql.is_direct_reference(compiler.base_tools())?
267267
} else {
268268
false
269269
};

rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator/symbols/measure_symbol.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,7 @@ impl SymbolFactory for MeasureSymbolFactory {
593593
};
594594

595595
let is_sql_is_direct_ref = if let Some(sql) = &sql {
596-
sql.is_direct_reference()?
596+
sql.is_direct_reference(compiler.base_tools())?
597597
} else {
598598
false
599599
};

rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator/symbols/member_expression_symbol.rs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use super::MemberSymbol;
2+
use crate::cube_bridge::base_tools::BaseTools;
23
use crate::planner::query_tools::QueryTools;
34
use crate::planner::sql_evaluator::{sql_nodes::SqlNode, SqlCall, SqlEvaluatorVisitor};
45
use crate::planner::sql_templates::PlanSqlTemplates;
@@ -25,9 +26,12 @@ impl MemberExpressionSymbol {
2526
name: String,
2627
expression: MemberExpressionExpression,
2728
definition: Option<String>,
29+
base_tools: Rc<dyn BaseTools>,
2830
) -> Result<Self, CubeError> {
2931
let is_reference = match &expression {
30-
MemberExpressionExpression::SqlCall(sql_call) => sql_call.is_direct_reference()?,
32+
MemberExpressionExpression::SqlCall(sql_call) => {
33+
sql_call.is_direct_reference(base_tools.clone())?
34+
}
3135
MemberExpressionExpression::PatchedSymbol(_symbol) => false,
3236
};
3337
Ok(Self {
@@ -57,7 +61,6 @@ impl MemberExpressionSymbol {
5761
Ok(sql)
5862
}
5963

60-
6164
pub fn full_name(&self) -> String {
6265
format!("expr:{}.{}", self.cube_name, self.name)
6366
}
@@ -80,17 +83,25 @@ impl MemberExpressionSymbol {
8083
pub fn get_dependencies(&self) -> Vec<Rc<MemberSymbol>> {
8184
let mut deps = vec![];
8285
match &self.expression {
83-
MemberExpressionExpression::SqlCall(sql_call) => sql_call.extract_symbol_deps(&mut deps),
84-
MemberExpressionExpression::PatchedSymbol(member_symbol) => deps.push(member_symbol.clone()),
86+
MemberExpressionExpression::SqlCall(sql_call) => {
87+
sql_call.extract_symbol_deps(&mut deps)
88+
}
89+
MemberExpressionExpression::PatchedSymbol(member_symbol) => {
90+
deps.push(member_symbol.clone())
91+
}
8592
}
8693
deps
8794
}
8895

8996
pub fn get_dependencies_with_path(&self) -> Vec<(Rc<MemberSymbol>, Vec<String>)> {
9097
let mut deps = vec![];
9198
match &self.expression {
92-
MemberExpressionExpression::SqlCall(sql_call) => sql_call.extract_symbol_deps_with_path(&mut deps),
93-
MemberExpressionExpression::PatchedSymbol(member_symbol) => deps.push((member_symbol.clone(), vec![])),
99+
MemberExpressionExpression::SqlCall(sql_call) => {
100+
sql_call.extract_symbol_deps_with_path(&mut deps)
101+
}
102+
MemberExpressionExpression::PatchedSymbol(member_symbol) => {
103+
deps.push((member_symbol.clone(), vec![]))
104+
}
94105
}
95106
deps
96107
}

0 commit comments

Comments
 (0)