Skip to content

Commit 53f5bcd

Browse files
committed
chore(tesseract): Various improvements
1 parent 60ad2f0 commit 53f5bcd

File tree

6 files changed

+67
-16
lines changed

6 files changed

+67
-16
lines changed

rust/cubesqlplanner/cubesqlplanner/src/cube_bridge/cube_definition.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ pub struct CubeDefinitionStatic {
1414
pub name: String,
1515
#[serde(rename = "sqlAlias")]
1616
pub sql_alias: Option<String>,
17+
#[serde(rename = "isView")]
18+
pub is_view: Option<bool>,
1719
}
1820

1921
#[nativebridge::native_bridge(CubeDefinitionStatic)]

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ impl MultiStageQueryPlanner {
171171
state: Rc<MultiStageAppliedState>,
172172
descriptions: &mut Vec<Rc<MultiStageQueryDescription>>,
173173
) -> Result<Rc<MultiStageQueryDescription>, CubeError> {
174+
let member = member.resolve_reference_chain();
174175
let member_name = member.full_name();
175176
if let Some(exists) = descriptions
176177
.iter()
@@ -187,7 +188,7 @@ impl MultiStageQueryPlanner {
187188
return Ok(rolling_window_query);
188189
}
189190

190-
let childs = member_childs(&member)?;
191+
let childs = member_childs(&member, true)?;
191192
let has_multi_stage_members = has_multi_stage_members(&member, false)?;
192193
let description = if childs.is_empty() || !has_multi_stage_members {
193194
if has_multi_stage_members {

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::planner::sql_evaluator::{MemberSymbol, TraversalVisitor};
22
use cubenativeutils::CubeError;
3+
use itertools::Itertools;
34
use std::rc::Rc;
45

56
pub struct MemberChildsCollector {
@@ -56,8 +57,19 @@ impl TraversalVisitor for MemberChildsCollector {
5657
}
5758
}
5859

59-
pub fn member_childs(node: &Rc<MemberSymbol>) -> Result<Vec<Rc<MemberSymbol>>, CubeError> {
60+
pub fn member_childs(
61+
node: &Rc<MemberSymbol>,
62+
resolve_references: bool,
63+
) -> Result<Vec<Rc<MemberSymbol>>, CubeError> {
6064
let mut visitor = MemberChildsCollector::new();
6165
visitor.apply(node, &MemberChildsCollectorState::new(true))?;
62-
Ok(visitor.extract_result())
66+
let res = visitor.extract_result();
67+
let res = if resolve_references {
68+
res.iter()
69+
.map(|child| child.clone().resolve_reference_chain())
70+
.collect_vec()
71+
} else {
72+
res
73+
};
74+
Ok(res)
6375
}

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

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -492,18 +492,22 @@ impl SymbolFactory for MeasureSymbolFactory {
492492
&& !definition.static_data().multi_stage.unwrap_or(false);
493493
let owned_by_cube = definition.static_data().owned_by_cube.unwrap_or(true);
494494
let is_multi_stage = definition.static_data().multi_stage.unwrap_or(false);
495-
496-
let is_reference = !owned_by_cube
497-
&& is_sql_is_direct_ref
498-
&& is_calculated
499-
&& !is_multi_stage
500-
&& measure_filters.is_empty()
501-
&& measure_drill_filters.is_empty()
502-
&& time_shifts.is_empty()
503-
&& measure_order_by.is_empty()
504-
&& reduce_by.is_none()
505-
&& add_group_by.is_none()
506-
&& group_by.is_none();
495+
let cube = cube_evaluator.cube_from_path(cube_name.clone())?;
496+
497+
let is_view = cube.static_data().is_view.unwrap_or(false);
498+
499+
let is_reference = is_view
500+
|| (!owned_by_cube
501+
&& is_sql_is_direct_ref
502+
&& is_calculated
503+
&& !is_multi_stage
504+
&& measure_filters.is_empty()
505+
&& measure_drill_filters.is_empty()
506+
&& time_shifts.is_empty()
507+
&& measure_order_by.is_empty()
508+
&& reduce_by.is_none()
509+
&& add_group_by.is_none()
510+
&& group_by.is_none());
507511

508512
Ok(MemberSymbol::new_measure(MeasureSymbol::new(
509513
cube_name,

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,22 @@ impl MemberSymbol {
136136
}
137137
}
138138

139+
pub fn reference_member(&self) -> Option<Rc<MemberSymbol>> {
140+
let deps = self.get_dependencies();
141+
if deps.is_empty() || !self.is_reference() {
142+
return None;
143+
}
144+
deps.first().cloned()
145+
}
146+
147+
pub fn resolve_reference_chain(self: Rc<Self>) -> Rc<MemberSymbol> {
148+
let mut current = self;
149+
while let Some(reference) = current.reference_member() {
150+
current = reference;
151+
}
152+
current
153+
}
154+
139155
pub fn owned_by_cube(&self) -> bool {
140156
match self {
141157
Self::Dimension(d) => d.owned_by_cube(),

rust/cubesqlplanner/cubesqlplanner/src/planner/sql_templates/plan.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ pub struct PlanSqlTemplates {
1313
base_tools: Rc<dyn BaseTools>,
1414
}
1515
pub const UNDERSCORE_UPPER_BOUND: Boundary = Boundary {
16-
name: "LowerUpper",
16+
name: "UnderscoreUpper",
1717
condition: |s, _| {
1818
s.get(0) == Some(&"_")
1919
&& s.get(1)
@@ -25,6 +25,21 @@ pub const UNDERSCORE_UPPER_BOUND: Boundary = Boundary {
2525
len: 0,
2626
};
2727

28+
fn grapheme_is_uppercase(c: &&str) -> bool {
29+
c.to_uppercase() != c.to_lowercase() && *c == c.to_uppercase()
30+
}
31+
32+
pub const UPPER_UPPER_BOUND: Boundary = Boundary {
33+
name: "UpperUpper",
34+
condition: |s, _| {
35+
s.get(0).map(grapheme_is_uppercase) == Some(true)
36+
&& s.get(1).map(grapheme_is_uppercase) == Some(true)
37+
},
38+
arg: None,
39+
start: 1,
40+
len: 0,
41+
};
42+
2843
impl PlanSqlTemplates {
2944
pub fn new(render: Rc<dyn SqlTemplatesRender>, base_tools: Rc<dyn BaseTools>) -> Self {
3045
Self { render, base_tools }
@@ -34,6 +49,7 @@ impl PlanSqlTemplates {
3449
let res = name
3550
.with_boundaries(&[
3651
UNDERSCORE_UPPER_BOUND,
52+
UPPER_UPPER_BOUND,
3753
Boundary::LOWER_UPPER,
3854
Boundary::DIGIT_UPPER,
3955
Boundary::ACRONYM,

0 commit comments

Comments
 (0)