Skip to content

Commit a206bff

Browse files
committed
addon
1 parent 14cc1e3 commit a206bff

File tree

15 files changed

+136
-108
lines changed

15 files changed

+136
-108
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ impl BaseDimension {
132132
query_tools.base_tools().clone(),
133133
)?;
134134
let full_name = member_expression_symbol.full_name();
135-
let member_evaluator = Rc::new(MemberSymbol::MemberExpression(member_expression_symbol));
135+
let member_evaluator = MemberSymbol::new_member_expression(member_expression_symbol);
136136
let default_alias = PlanSqlTemplates::alias_name(&name);
137137

138138
Ok(Rc::new(Self {

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ impl BaseMeasure {
139139
query_tools.base_tools().clone(),
140140
)?;
141141
let full_name = member_expression_symbol.full_name();
142-
let member_evaluator = Rc::new(MemberSymbol::MemberExpression(member_expression_symbol));
142+
let member_evaluator = MemberSymbol::new_member_expression(member_expression_symbol);
143143
let default_alias = PlanSqlTemplates::alias_name(&name);
144144
Ok(Rc::new(Self {
145145
measure: full_name,
@@ -215,11 +215,11 @@ impl BaseMeasure {
215215
self.is_rolling_window() || self.is_running_total()
216216
}
217217

218-
pub fn measure_type(&self) -> &str {
218+
pub fn measure_type(&self) -> String {
219219
if let Ok(measure_symbol) = self.member_evaluator.as_measure() {
220-
measure_symbol.measure_type()
220+
measure_symbol.measure_type().clone()
221221
} else {
222-
"number"
222+
"number".to_string()
223223
}
224224
}
225225

rust/cubesqlplanner/cubesqlplanner/src/planner/base_time_dimension.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ impl BaseMember for BaseTimeDimension {
6565
impl BaseTimeDimension {
6666
pub fn try_new_from_td_symbol(
6767
query_tools: Rc<QueryTools>,
68-
td_symbol: &TimeDimensionSymbol,
68+
td_symbol: Rc<TimeDimensionSymbol>,
6969
) -> Result<Rc<Self>, CubeError> {
7070
let dimension =
7171
BaseDimension::try_new_required(td_symbol.base_symbol().clone(), query_tools.clone())?;
@@ -79,7 +79,7 @@ impl BaseTimeDimension {
7979
&Some(alias_suffix.clone()),
8080
query_tools.clone(),
8181
)?;
82-
let member_evaluator = Rc::new(MemberSymbol::TimeDimension(td_symbol.clone()));
82+
let member_evaluator = MemberSymbol::new_time_dimension(td_symbol.clone());
8383

8484
Ok(Rc::new(Self {
8585
dimension,
@@ -128,12 +128,12 @@ impl BaseTimeDimension {
128128
} else {
129129
None
130130
};
131-
let member_evaluator = Rc::new(MemberSymbol::TimeDimension(TimeDimensionSymbol::new(
131+
let member_evaluator = MemberSymbol::new_time_dimension(TimeDimensionSymbol::new(
132132
member_evaluator.clone(),
133133
granularity.clone(),
134134
granularity_obj.clone(),
135135
date_range_tuple,
136-
)));
136+
));
137137
Ok(Rc::new(Self {
138138
dimension,
139139
query_tools,
@@ -163,12 +163,12 @@ impl BaseTimeDimension {
163163
} else {
164164
None
165165
};
166-
let member_evaluator = Rc::new(MemberSymbol::TimeDimension(TimeDimensionSymbol::new(
166+
let member_evaluator = MemberSymbol::new_time_dimension(TimeDimensionSymbol::new(
167167
self.dimension.member_evaluator(),
168168
new_granularity.clone(),
169169
new_granularity_obj.clone(),
170170
date_range_tuple,
171-
)));
171+
));
172172
Ok(Rc::new(Self {
173173
dimension: self.dimension.clone(),
174174
granularity_obj: new_granularity_obj,

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,11 @@ impl BaseFilter {
7575
})
7676
}
7777

78-
pub fn member_evaluator(&self) -> &Rc<MemberSymbol> {
78+
pub fn member_evaluator(&self) -> Rc<MemberSymbol> {
7979
if let Ok(time_dimension) = self.member_evaluator.as_time_dimension() {
80-
time_dimension.base_symbol()
80+
time_dimension.base_symbol().clone()
8181
} else {
82-
&self.member_evaluator
82+
self.member_evaluator.clone()
8383
}
8484
}
8585

@@ -395,8 +395,8 @@ impl BaseFilter {
395395
&self,
396396
plan_templates: &PlanSqlTemplates,
397397
) -> Result<(String, String), CubeError> {
398-
let from_expr = format!("min(date_from)");
399-
let to_expr = format!("max(date_to)");
398+
let from_expr = format!("min({})", plan_templates.quote_identifier("date_from")?);
399+
let to_expr = format!("max({})", plan_templates.quote_identifier("date_to")?);
400400
let alias = format!("value");
401401
let time_series_cte_name = format!("time_series"); // FIXME May be should be passed as parameter
402402

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ impl BaseSegment {
3737
query_tools.base_tools().clone(),
3838
)?;
3939
let full_name = full_name.unwrap_or(member_expression_symbol.full_name());
40-
let member_evaluator = Rc::new(MemberSymbol::MemberExpression(member_expression_symbol));
40+
let member_evaluator = MemberSymbol::new_member_expression(member_expression_symbol);
4141

4242
Ok(Rc::new(Self {
4343
full_name,

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,17 @@ impl MultipliedMeasuresQueryPlanner {
200200
key_cube_name: &String,
201201
) -> Result<bool, CubeError> {
202202
for measure in measures.iter() {
203-
let cubes = collect_cube_names(measure.member_evaluator())?;
203+
let member_expression_over_dimensions_cubes =
204+
if let Ok(member_expression) = measure.member_evaluator().as_member_expression() {
205+
member_expression.cube_names_if_dimension_only_expression()?
206+
} else {
207+
None
208+
};
209+
let cubes = if let Some(cubes) = member_expression_over_dimensions_cubes {
210+
cubes
211+
} else {
212+
collect_cube_names(measure.member_evaluator())?
213+
};
204214
let join_hints = collect_join_hints(measure.member_evaluator())?;
205215
if cubes.iter().any(|cube| cube != key_cube_name) {
206216
let measures_join = self.query_tools.join_graph().build_join(join_hints)?;

rust/cubesqlplanner/cubesqlplanner/src/planner/query_properties.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ impl QueryProperties {
225225
}
226226
let source_measure_compiled = evaluator_compiler.add_measure_evaluator(source_measure.clone())?;
227227
let patched_measure = source_measure_compiled.as_measure()?.new_patched(new_measure_type, filters_to_add)?;
228-
let patched_symbol = Rc::new(MemberSymbol::Measure(patched_measure));
228+
let patched_symbol = MemberSymbol::new_measure(patched_measure);
229229
MemberExpressionExpression::PatchedSymbol(patched_symbol)
230230

231231
} else {

rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator/collectors/multiplied_measures_collector.rs

Lines changed: 36 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
use super::member_childs;
21
use crate::cube_bridge::join_definition::JoinDefinition;
32
use crate::planner::query_tools::QueryTools;
43
use crate::planner::sql_evaluator::{MemberSymbol, TraversalVisitor};
54
use crate::planner::BaseMeasure;
65
use cubenativeutils::CubeError;
7-
use itertools::Itertools;
86
use std::collections::HashSet;
97
use std::rc::Rc;
108

@@ -142,50 +140,47 @@ pub fn collect_multiplied_measures(
142140
node: &Rc<MemberSymbol>,
143141
join: Rc<dyn JoinDefinition>,
144142
) -> Result<Vec<MeasureResult>, CubeError> {
143+
if let Ok(member_expression) = node.as_member_expression() {
144+
if let Some(cube_names) = member_expression.cube_names_if_dimension_only_expression()? {
145+
let result = if cube_names.is_empty() {
146+
let measure = BaseMeasure::try_new(node.clone(), query_tools.clone())?.unwrap();
147+
vec![MeasureResult {
148+
cube_name: measure.cube_name().clone(),
149+
measure,
150+
multiplied: false,
151+
}]
152+
} else if cube_names.len() == 1 {
153+
let cube_name = cube_names[0].clone();
154+
let multiplied = join
155+
.static_data()
156+
.multiplication_factor
157+
.get(&cube_name)
158+
.unwrap_or(&false)
159+
.clone();
160+
let measure = BaseMeasure::try_new(node.clone(), query_tools.clone())?.unwrap();
161+
162+
vec![MeasureResult {
163+
measure,
164+
cube_name,
165+
multiplied,
166+
}]
167+
} else {
168+
return Err(CubeError::user(format!(
169+
"Expected single cube for dimension-only measure {}, got {:?}",
170+
node.full_name(),
171+
cube_names
172+
)));
173+
};
174+
return Ok(result);
175+
}
176+
}
177+
145178
let mut composite_collector = CompositeMeasuresCollector::new();
146179
composite_collector.apply(node, &CompositeMeasureCollectorState::new(None))?;
147180
let composite_measures = composite_collector.extract_result();
148181
let mut visitor =
149182
MultipliedMeasuresCollector::new(query_tools.clone(), composite_measures, join.clone());
150183
visitor.apply(node, &())?;
151184
let result = visitor.extract_result();
152-
if result.is_empty() && node.as_member_expression().is_ok() {
153-
let childs = member_childs(node, true)?;
154-
let cube_names = childs
155-
.into_iter()
156-
.map(|child| child.cube_name())
157-
.collect_vec();
158-
let result = if cube_names.is_empty() {
159-
let measure = BaseMeasure::try_new(node.clone(), query_tools.clone())?.unwrap();
160-
vec![MeasureResult {
161-
cube_name: measure.cube_name().clone(),
162-
measure,
163-
multiplied: false,
164-
}]
165-
} else if cube_names.len() == 1 {
166-
let cube_name = cube_names[0].clone();
167-
let multiplied = join
168-
.static_data()
169-
.multiplication_factor
170-
.get(&cube_name)
171-
.unwrap_or(&false)
172-
.clone();
173-
let measure = BaseMeasure::try_new(node.clone(), query_tools.clone())?.unwrap();
174-
175-
vec![MeasureResult {
176-
measure,
177-
cube_name,
178-
multiplied,
179-
}]
180-
} else {
181-
return Err(CubeError::user(format!(
182-
"Expected single cube for dimension-only measure {}, got {:?}",
183-
node.full_name(),
184-
cube_names
185-
)));
186-
};
187-
Ok(result)
188-
} else {
189-
Ok(result)
190-
}
185+
Ok(result)
191186
}

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -177,13 +177,12 @@ impl<'a> DependenciesBuilder<'a> {
177177
&dep.name,
178178
Some(granularity.clone()),
179179
)? {
180-
let member_evaluator =
181-
Rc::new(MemberSymbol::TimeDimension(TimeDimensionSymbol::new(
182-
base_evaluator.clone(),
183-
Some(granularity.clone()),
184-
Some(granularity_obj),
185-
None,
186-
)));
180+
let member_evaluator = MemberSymbol::new_time_dimension(TimeDimensionSymbol::new(
181+
base_evaluator.clone(),
182+
Some(granularity.clone()),
183+
Some(granularity_obj),
184+
None,
185+
));
187186
granularities.insert(granularity.clone(), member_evaluator);
188187
} else {
189188
return Err(CubeError::user(format!(

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ pub struct CubeNameSymbol {
1515
}
1616

1717
impl CubeNameSymbol {
18-
pub fn new(cube_name: String) -> Self {
19-
Self { cube_name }
18+
pub fn new(cube_name: String) -> Rc<Self> {
19+
Rc::new(Self { cube_name })
2020
}
2121

2222
pub fn evaluate_sql(&self) -> Result<String, CubeError> {
@@ -80,13 +80,13 @@ impl CubeTableSymbol {
8080
member_sql: Option<Rc<SqlCall>>,
8181
definition: Rc<dyn CubeDefinition>,
8282
is_table_sql: bool,
83-
) -> Self {
84-
Self {
83+
) -> Rc<Self> {
84+
Rc::new(Self {
8585
cube_name,
8686
member_sql,
8787
definition,
8888
is_table_sql,
89-
}
89+
})
9090
}
9191

9292
pub fn evaluate_sql(

0 commit comments

Comments
 (0)