Skip to content

Commit 2966fc7

Browse files
committed
in work
1 parent c7c087c commit 2966fc7

File tree

14 files changed

+273
-384
lines changed

14 files changed

+273
-384
lines changed

rust/cubesqlplanner/cubesqlplanner/src/logical_plan/multistage/common.rs

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,13 @@ impl PrettyPrint for MultiStageAppliedState {
1010
result.println(
1111
&format!(
1212
"-time_dimensions: {}",
13-
print_symbols(
14-
&self
15-
.time_dimensions()
16-
.iter()
17-
.map(|d| d.member_evaluator())
18-
.collect_vec()
19-
)
13+
print_symbols(&self.time_dimensions())
2014
),
2115
state,
2216
);
2317

2418
result.println(
25-
&format!(
26-
"-dimensions: {}",
27-
print_symbols(
28-
&self
29-
.dimensions()
30-
.iter()
31-
.map(|d| d.member_evaluator())
32-
.collect_vec()
33-
)
34-
),
19+
&format!("-dimensions: {}", print_symbols(&self.dimensions())),
3520
state,
3621
);
3722

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

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use super::FilterOperator;
33
use crate::cube_bridge::base_query_options::FilterItem as NativeFilterItem;
44
use crate::plan::filter::{FilterGroup, FilterGroupOperator, FilterItem};
55
use crate::planner::query_tools::QueryTools;
6-
use crate::planner::sql_evaluator::Compiler;
6+
use crate::planner::sql_evaluator::{Compiler, MemberSymbol};
77
use crate::planner::BaseMember;
88
use crate::planner::BaseTimeDimension;
99
use cubenativeutils::CubeError;
@@ -40,16 +40,18 @@ impl<'a> FilterCompiler<'a> {
4040
Ok(())
4141
}
4242

43-
pub fn add_time_dimension_item(&mut self, item: &BaseTimeDimension) -> Result<(), CubeError> {
44-
if let Some(date_range) = item.get_date_range() {
45-
let filter = BaseFilter::try_new(
46-
self.query_tools.clone(),
47-
item.member_evaluator(),
48-
FilterType::Dimension,
49-
FilterOperator::InDateRange,
50-
Some(date_range.into_iter().map(|v| Some(v)).collect()),
51-
)?;
52-
self.time_dimension_filters.push(FilterItem::Item(filter));
43+
pub fn add_time_dimension_item(&mut self, item: &Rc<MemberSymbol>) -> Result<(), CubeError> {
44+
if let Ok(td_item) = item.as_time_dimension() {
45+
if let Some(date_range) = td_item.date_range_vec() {
46+
let filter = BaseFilter::try_new(
47+
self.query_tools.clone(),
48+
item.clone(),
49+
FilterType::Dimension,
50+
FilterOperator::InDateRange,
51+
Some(date_range.into_iter().map(|v| Some(v)).collect()),
52+
)?;
53+
self.time_dimension_filters.push(FilterItem::Item(filter));
54+
}
5355
}
5456
Ok(())
5557
}

rust/cubesqlplanner/cubesqlplanner/src/planner/planners/common_utils.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::planner::query_tools::QueryTools;
2+
use crate::planner::sql_evaluator::MemberSymbol;
23
use crate::planner::{BaseCube, BaseDimension};
34
use cubenativeutils::CubeError;
45
use std::rc::Rc;
@@ -23,7 +24,7 @@ impl CommonUtils {
2324
pub fn primary_keys_dimensions(
2425
&self,
2526
cube_name: &String,
26-
) -> Result<Vec<Rc<BaseDimension>>, CubeError> {
27+
) -> Result<Vec<Rc<MemberSymbol>>, CubeError> {
2728
let evaluator_compiler_cell = self.query_tools.evaluator_compiler().clone();
2829
let mut evaluator_compiler = evaluator_compiler_cell.borrow_mut();
2930
let primary_keys = self
@@ -39,9 +40,8 @@ impl CommonUtils {
3940
.iter()
4041
.map(|d| -> Result<_, CubeError> {
4142
let full_name = format!("{}.{}", cube_name, d);
42-
let evaluator = evaluator_compiler.add_dimension_evaluator(full_name.clone())?;
43-
let dim = BaseDimension::try_new_required(evaluator, self.query_tools.clone())?;
44-
Ok(dim)
43+
let symbol = evaluator_compiler.add_dimension_evaluator(full_name.clone())?;
44+
Ok(symbol)
4545
})
4646
.collect::<Result<Vec<_>, _>>()?;
4747
Ok(dims)

rust/cubesqlplanner/cubesqlplanner/src/planner/planners/dimension_subquery_planner.rs

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ use crate::logical_plan::DimensionSubQuery;
33
use crate::plan::{FilterItem, QualifiedColumnName};
44
use crate::planner::query_tools::QueryTools;
55
use crate::planner::sql_evaluator::collectors::collect_sub_query_dimensions;
6-
use crate::planner::sql_evaluator::MemberExpressionExpression;
6+
use crate::planner::sql_evaluator::{
7+
MemberExpressionExpression, MemberExpressionSymbol, MemberSymbol,
8+
};
79
use crate::planner::QueryProperties;
810
use crate::planner::{BaseDimension, BaseMeasure, BaseMember};
911
use cubenativeutils::CubeError;
@@ -15,7 +17,7 @@ pub struct DimensionSubqueryPlanner {
1517
utils: CommonUtils,
1618
query_tools: Rc<QueryTools>,
1719
query_properties: Rc<QueryProperties>,
18-
sub_query_dims: HashMap<String, Vec<Rc<BaseDimension>>>,
20+
sub_query_dims: HashMap<String, Vec<Rc<MemberSymbol>>>,
1921
dimensions_refs: RefCell<HashMap<String, QualifiedColumnName>>,
2022
}
2123

@@ -30,11 +32,11 @@ impl DimensionSubqueryPlanner {
3032
}
3133
}
3234
pub fn try_new(
33-
dimensions: &Vec<Rc<BaseDimension>>,
35+
dimensions: &Vec<Rc<MemberSymbol>>,
3436
query_tools: Rc<QueryTools>,
3537
query_properties: Rc<QueryProperties>,
3638
) -> Result<Self, CubeError> {
37-
let mut sub_query_dims: HashMap<String, Vec<Rc<BaseDimension>>> = HashMap::new();
39+
let mut sub_query_dims: HashMap<String, Vec<Rc<MemberSymbol>>> = HashMap::new();
3840
for subquery_dimension in dimensions.iter() {
3941
let cube_name = subquery_dimension.cube_name().clone();
4042
sub_query_dims
@@ -54,7 +56,7 @@ impl DimensionSubqueryPlanner {
5456

5557
pub fn plan_queries(
5658
&self,
57-
dimensions: &Vec<Rc<BaseDimension>>,
59+
dimensions: &Vec<Rc<MemberSymbol>>,
5860
) -> Result<Vec<Rc<DimensionSubQuery>>, CubeError> {
5961
let mut result = Vec::new();
6062
for subquery_dimension in dimensions.iter() {
@@ -65,21 +67,33 @@ impl DimensionSubqueryPlanner {
6567

6668
fn plan_query(
6769
&self,
68-
subquery_dimension: Rc<BaseDimension>,
70+
subquery_dimension: Rc<MemberSymbol>,
6971
) -> Result<Rc<DimensionSubQuery>, CubeError> {
7072
let dim_name = subquery_dimension.name();
7173
let cube_name = subquery_dimension.cube_name().clone();
74+
let dimension_symbol = subquery_dimension.as_dimension()?;
75+
7276
let primary_keys_dimensions = self.utils.primary_keys_dimensions(&cube_name)?;
73-
let expression = subquery_dimension.sql_call()?;
74-
let measure = BaseMeasure::try_new_from_expression(
75-
MemberExpressionExpression::SqlCall(expression),
77+
78+
let expression = if let Some(sql_call) = dimension_symbol.member_sql() {
79+
sql_call.clone()
80+
} else {
81+
return Err(CubeError::user(format!(
82+
"Subquery dimension {} must have `sql` field",
83+
subquery_dimension.full_name()
84+
)));
85+
};
86+
87+
let member_expression_symbol = MemberExpressionSymbol::try_new(
7688
cube_name.clone(),
7789
dim_name.clone(),
90+
MemberExpressionExpression::SqlCall(expression),
7891
None,
79-
self.query_tools.clone(),
92+
self.query_tools.base_tools().clone(),
8093
)?;
94+
let measure = MemberSymbol::new_member_expression(member_expression_symbol);
8195

82-
let (dimensions_filters, time_dimensions_filters) = if subquery_dimension
96+
let (dimensions_filters, time_dimensions_filters) = if dimension_symbol
8397
.propagate_filters_to_sub_query()
8498
{
8599
let dimensions_filters = self
@@ -114,12 +128,9 @@ impl DimensionSubqueryPlanner {
114128
let sub_query = query_planner.plan()?;
115129
let result = Rc::new(DimensionSubQuery {
116130
query: sub_query,
117-
primary_keys_dimensions: primary_keys_dimensions
118-
.into_iter()
119-
.map(|d| d.member_evaluator())
120-
.collect(),
121-
subquery_dimension: subquery_dimension.member_evaluator(),
122-
measure_for_subquery_dimension: measure.member_evaluator().clone(),
131+
primary_keys_dimensions,
132+
subquery_dimension,
133+
measure_for_subquery_dimension: measure,
123134
});
124135
Ok(result)
125136
}

rust/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/applied_state.rs

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use std::rc::Rc;
1111

1212
#[derive(Clone)]
1313
pub struct MultiStageAppliedState {
14-
time_dimensions: Vec<Rc<BaseTimeDimension>>,
15-
dimensions: Vec<Rc<BaseDimension>>,
14+
time_dimensions: Vec<Rc<MemberSymbol>>,
15+
dimensions: Vec<Rc<MemberSymbol>>,
1616
time_dimensions_filters: Vec<FilterItem>,
1717
dimensions_filters: Vec<FilterItem>,
1818
measures_filters: Vec<FilterItem>,
@@ -22,8 +22,8 @@ pub struct MultiStageAppliedState {
2222

2323
impl MultiStageAppliedState {
2424
pub fn new(
25-
time_dimensions: Vec<Rc<BaseTimeDimension>>,
26-
dimensions: Vec<Rc<BaseDimension>>,
25+
time_dimensions: Vec<Rc<MemberSymbol>>,
26+
dimensions: Vec<Rc<MemberSymbol>>,
2727
time_dimensions_filters: Vec<FilterItem>,
2828
dimensions_filters: Vec<FilterItem>,
2929
measures_filters: Vec<FilterItem>,
@@ -52,13 +52,13 @@ impl MultiStageAppliedState {
5252
}
5353
}
5454

55-
pub fn add_dimensions(&mut self, dimensions: Vec<Rc<BaseDimension>>) {
55+
pub fn add_dimensions(&mut self, dimensions: Vec<Rc<MemberSymbol>>) {
5656
self.dimensions = self
5757
.dimensions
5858
.iter()
5959
.cloned()
6060
.chain(dimensions.into_iter())
61-
.unique_by(|d| d.member_evaluator().full_name())
61+
.unique_by(|d| d.full_name())
6262
.collect_vec();
6363
}
6464

@@ -170,24 +170,18 @@ impl MultiStageAppliedState {
170170
}
171171

172172
pub fn time_dimensions_symbols(&self) -> Vec<Rc<MemberSymbol>> {
173-
self.time_dimensions
174-
.iter()
175-
.map(|d| d.member_evaluator().clone())
176-
.collect()
173+
self.time_dimensions().clone()
177174
}
178175

179176
pub fn dimensions_symbols(&self) -> Vec<Rc<MemberSymbol>> {
180-
self.dimensions
181-
.iter()
182-
.map(|d| d.member_evaluator().clone())
183-
.collect()
177+
self.dimensions.clone()
184178
}
185179

186180
pub fn all_dimensions_symbols(&self) -> Vec<Rc<MemberSymbol>> {
187181
self.time_dimensions
188182
.iter()
189-
.map(|d| d.member_evaluator().clone())
190-
.chain(self.dimensions.iter().map(|d| d.member_evaluator().clone()))
183+
.cloned()
184+
.chain(self.dimensions.iter().cloned())
191185
.collect()
192186
}
193187

@@ -203,19 +197,19 @@ impl MultiStageAppliedState {
203197
&self.measures_filters
204198
}
205199

206-
pub fn dimensions(&self) -> &Vec<Rc<BaseDimension>> {
200+
pub fn dimensions(&self) -> &Vec<Rc<MemberSymbol>> {
207201
&self.dimensions
208202
}
209203

210-
pub fn time_dimensions(&self) -> &Vec<Rc<BaseTimeDimension>> {
204+
pub fn time_dimensions(&self) -> &Vec<Rc<MemberSymbol>> {
211205
&self.time_dimensions
212206
}
213207

214-
pub fn set_time_dimensions(&mut self, time_dimensions: Vec<Rc<BaseTimeDimension>>) {
208+
pub fn set_time_dimensions(&mut self, time_dimensions: Vec<Rc<MemberSymbol>>) {
215209
self.time_dimensions = time_dimensions;
216210
}
217211

218-
pub fn set_dimensions(&mut self, dimensions: Vec<Rc<BaseDimension>>) {
212+
pub fn set_dimensions(&mut self, dimensions: Vec<Rc<MemberSymbol>>) {
219213
self.dimensions = dimensions;
220214
}
221215

@@ -407,7 +401,7 @@ impl PartialEq for MultiStageAppliedState {
407401
.dimensions
408402
.iter()
409403
.zip(other.dimensions.iter())
410-
.all(|(a, b)| a.member_evaluator().full_name() == b.member_evaluator().full_name());
404+
.all(|(a, b)| a.full_name() == b.full_name());
411405
dims_eq
412406
&& self.time_dimensions_filters == other.time_dimensions_filters
413407
&& self.dimensions_filters == other.dimensions_filters
@@ -421,11 +415,7 @@ impl Debug for MultiStageAppliedState {
421415
f.debug_struct("MultiStageAppliedState")
422416
.field(
423417
"dimensions",
424-
&self
425-
.dimensions
426-
.iter()
427-
.map(|d| d.member_evaluator().full_name())
428-
.join(", "),
418+
&self.dimensions.iter().map(|d| d.full_name()).join(", "),
429419
)
430420
.field("time_shifts", &self.time_shifts)
431421
.finish()

rust/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/member.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ use std::rc::Rc;
44

55
#[derive(Clone)]
66
pub struct TimeSeriesDescription {
7-
pub time_dimension: Rc<BaseTimeDimension>,
7+
pub time_dimension: Rc<MemberSymbol>,
88
pub date_range_cte: Option<String>,
99
}
1010

1111
#[derive(Clone)]
1212
pub enum MultiStageLeafMemberType {
1313
Measure,
1414
TimeSeries(Rc<TimeSeriesDescription>),
15-
TimeSeriesGetRange(Rc<BaseTimeDimension>),
15+
TimeSeriesGetRange(Rc<MemberSymbol>),
1616
}
1717

1818
#[derive(Clone)]
@@ -36,15 +36,15 @@ pub enum RollingWindowType {
3636

3737
#[derive(Clone)]
3838
pub struct RollingWindowDescription {
39-
pub time_dimension: Rc<BaseTimeDimension>,
40-
pub base_time_dimension: Rc<BaseTimeDimension>,
39+
pub time_dimension: Rc<MemberSymbol>,
40+
pub base_time_dimension: Rc<MemberSymbol>,
4141
pub rolling_window: RollingWindowType,
4242
}
4343

4444
impl RollingWindowDescription {
4545
pub fn new_regular(
46-
time_dimension: Rc<BaseTimeDimension>,
47-
base_time_dimension: Rc<BaseTimeDimension>,
46+
time_dimension: Rc<MemberSymbol>,
47+
base_time_dimension: Rc<MemberSymbol>,
4848
trailing: Option<String>,
4949
leading: Option<String>,
5050
offset: String,
@@ -62,8 +62,8 @@ impl RollingWindowDescription {
6262
}
6363

6464
pub fn new_to_date(
65-
time_dimension: Rc<BaseTimeDimension>,
66-
base_time_dimension: Rc<BaseTimeDimension>,
65+
time_dimension: Rc<MemberSymbol>,
66+
base_time_dimension: Rc<MemberSymbol>,
6767
granularity: String,
6868
) -> Self {
6969
Self {
@@ -74,8 +74,8 @@ impl RollingWindowDescription {
7474
}
7575

7676
pub fn new_running_total(
77-
time_dimension: Rc<BaseTimeDimension>,
78-
base_time_dimension: Rc<BaseTimeDimension>,
77+
time_dimension: Rc<MemberSymbol>,
78+
base_time_dimension: Rc<MemberSymbol>,
7979
) -> Self {
8080
Self {
8181
time_dimension,

0 commit comments

Comments
 (0)