Skip to content

Commit f254f64

Browse files
authored
fix(tesseract): sqlAlias support
1 parent e1911d4 commit f254f64

File tree

9 files changed

+85
-78
lines changed

9 files changed

+85
-78
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
@@ -12,6 +12,8 @@ use std::rc::Rc;
1212
#[derive(Serialize, Deserialize, Debug)]
1313
pub struct CubeDefinitionStatic {
1414
pub name: String,
15+
#[serde(rename = "sqlAlias")]
16+
pub sql_alias: Option<String>,
1517
}
1618

1719
#[nativebridge::native_bridge(CubeDefinitionStatic)]

rust/cubesqlplanner/cubesqlplanner/src/plan/schema/schema.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use super::SchemaColumn;
2-
use crate::planner::sql_templates::PlanSqlTemplates;
32
use crate::planner::BaseMember;
43
use itertools::Itertools;
54
use std::rc::Rc;
@@ -39,11 +38,7 @@ impl Schema {
3938
if let Some(column) = self.find_column_for_member(&member.full_name()) {
4039
column.name().clone()
4140
} else {
42-
PlanSqlTemplates::memeber_alias_name(
43-
member.cube_name(),
44-
member.name(),
45-
member.alias_suffix(),
46-
)
41+
member.alias_name()
4742
}
4843
}
4944

rust/cubesqlplanner/cubesqlplanner/src/planner/base_cube.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use super::query_tools::QueryTools;
22
use super::sql_evaluator::MemberSymbol;
33
use super::{evaluate_with_context, VisitorContext};
4+
use crate::cube_bridge::cube_definition::CubeDefinition;
45
use cubenativeutils::CubeError;
56
use std::collections::HashSet;
67
use std::rc::Rc;
@@ -9,6 +10,7 @@ pub struct BaseCube {
910
cube_name: String,
1011
members: HashSet<String>,
1112
member_evaluator: Rc<MemberSymbol>,
13+
definition: Rc<dyn CubeDefinition>,
1214
query_tools: Rc<QueryTools>,
1315
}
1416
impl BaseCube {
@@ -17,6 +19,9 @@ impl BaseCube {
1719
query_tools: Rc<QueryTools>,
1820
member_evaluator: Rc<MemberSymbol>,
1921
) -> Result<Rc<Self>, CubeError> {
22+
let definition = query_tools
23+
.cube_evaluator()
24+
.cube_from_path(cube_name.clone())?;
2025
let members = query_tools
2126
.base_tools()
2227
.all_cube_members(cube_name.clone())?
@@ -27,6 +32,7 @@ impl BaseCube {
2732
cube_name,
2833
members,
2934
member_evaluator,
35+
definition,
3036
query_tools,
3137
}))
3238
}
@@ -50,7 +56,15 @@ impl BaseCube {
5056
}
5157

5258
pub fn default_alias(&self) -> String {
53-
self.query_tools.alias_name(&self.cube_name)
59+
if let Some(alias) = self.sql_alias() {
60+
alias.clone()
61+
} else {
62+
self.query_tools.alias_name(&self.cube_name)
63+
}
64+
}
65+
66+
pub fn sql_alias(&self) -> &Option<String> {
67+
&self.definition.static_data().sql_alias
5468
}
5569

5670
pub fn default_alias_with_prefix(&self, prefix: &Option<String>) -> String {

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

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::query_tools::QueryTools;
22
use super::sql_evaluator::MemberSymbol;
3-
use super::{evaluate_with_context, BaseMember, VisitorContext};
3+
use super::{evaluate_with_context, BaseMember, BaseMemberHelper, VisitorContext};
44
use cubenativeutils::CubeError;
55
use std::rc::Rc;
66

@@ -10,6 +10,7 @@ pub struct BaseDimension {
1010
member_evaluator: Rc<MemberSymbol>,
1111
cube_name: String,
1212
name: String,
13+
default_alias: String,
1314
}
1415

1516
impl BaseMember for BaseDimension {
@@ -18,7 +19,7 @@ impl BaseMember for BaseDimension {
1819
}
1920

2021
fn alias_name(&self) -> String {
21-
self.unescaped_alias_name()
22+
self.default_alias.clone()
2223
}
2324

2425
fn member_evaluator(&self) -> Rc<MemberSymbol> {
@@ -44,13 +45,22 @@ impl BaseDimension {
4445
query_tools: Rc<QueryTools>,
4546
) -> Result<Option<Rc<Self>>, CubeError> {
4647
let result = match evaluation_node.as_ref() {
47-
MemberSymbol::Dimension(s) => Some(Rc::new(Self {
48-
dimension: s.full_name(),
49-
query_tools: query_tools.clone(),
50-
member_evaluator: evaluation_node.clone(),
51-
cube_name: s.cube_name().clone(),
52-
name: s.name().clone(),
53-
})),
48+
MemberSymbol::Dimension(s) => {
49+
let default_alias = BaseMemberHelper::default_alias(
50+
&s.cube_name(),
51+
&s.name(),
52+
&None,
53+
query_tools.clone(),
54+
)?;
55+
Some(Rc::new(Self {
56+
dimension: s.full_name(),
57+
query_tools: query_tools.clone(),
58+
member_evaluator: evaluation_node.clone(),
59+
cube_name: s.cube_name().clone(),
60+
name: s.name().clone(),
61+
default_alias,
62+
}))
63+
}
5464
_ => None,
5565
};
5666
Ok(result)
@@ -76,8 +86,4 @@ impl BaseDimension {
7686
pub fn dimension(&self) -> &String {
7787
&self.dimension
7888
}
79-
80-
pub fn unescaped_alias_name(&self) -> String {
81-
self.query_tools.alias_name(&self.dimension)
82-
}
8389
}

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::query_tools::QueryTools;
22
use super::sql_evaluator::MemberSymbol;
3-
use super::{evaluate_with_context, BaseMember, VisitorContext};
3+
use super::{evaluate_with_context, BaseMember, BaseMemberHelper, VisitorContext};
44
use crate::cube_bridge::measure_definition::{
55
MeasureDefinition, RollingWindow, TimeShiftReference,
66
};
@@ -70,13 +70,15 @@ pub struct BaseMeasure {
7070
time_shifts: Vec<MeasureTimeShift>,
7171
cube_name: String,
7272
name: String,
73+
default_alias: String,
7374
}
7475

7576
impl Debug for BaseMeasure {
7677
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
7778
f.debug_struct("BaseMeasure")
7879
.field("measure", &self.measure)
7980
.field("time_shifts", &self.time_shifts)
81+
.field("default_alias", &self.default_alias)
8082
.finish()
8183
}
8284
}
@@ -87,7 +89,7 @@ impl BaseMember for BaseMeasure {
8789
}
8890

8991
fn alias_name(&self) -> String {
90-
self.unescaped_alias_name()
92+
self.default_alias.clone()
9193
}
9294

9395
fn member_evaluator(&self) -> Rc<MemberSymbol> {
@@ -115,6 +117,12 @@ impl BaseMeasure {
115117
let res = match evaluation_node.as_ref() {
116118
MemberSymbol::Measure(s) => {
117119
let time_shifts = Self::parse_time_shifts(&s.definition())?;
120+
let default_alias = BaseMemberHelper::default_alias(
121+
&s.cube_name(),
122+
&s.name(),
123+
&None,
124+
query_tools.clone(),
125+
)?;
118126
Some(Rc::new(Self {
119127
measure: s.full_name(),
120128
query_tools: query_tools.clone(),
@@ -123,6 +131,7 @@ impl BaseMeasure {
123131
cube_name: s.cube_name().clone(),
124132
name: s.name().clone(),
125133
time_shifts,
134+
default_alias,
126135
}))
127136
}
128137
_ => None,
@@ -224,8 +233,4 @@ impl BaseMeasure {
224233
pub fn is_multi_stage_ungroupped(&self) -> bool {
225234
self.is_calculated() || self.definition.static_data().measure_type == "rank"
226235
}
227-
228-
fn unescaped_alias_name(&self) -> String {
229-
self.query_tools.alias_name(&self.measure)
230-
}
231236
}

rust/cubesqlplanner/cubesqlplanner/src/planner/base_member.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
use super::query_tools::QueryTools;
12
use super::sql_evaluator::MemberSymbol;
3+
use super::sql_templates::PlanSqlTemplates;
24
use super::VisitorContext;
35
use cubenativeutils::CubeError;
46
use itertools::Itertools;
@@ -37,4 +39,25 @@ impl BaseMemberHelper {
3739
pub fn to_alias_vec(members: &Vec<Rc<dyn BaseMember>>) -> Vec<String> {
3840
members.iter().map(|m| m.alias_name()).collect_vec()
3941
}
42+
43+
pub fn default_alias(
44+
cube_name: &String,
45+
member_name: &String,
46+
member_suffix: &Option<String>,
47+
query_tools: Rc<QueryTools>,
48+
) -> Result<String, CubeError> {
49+
let cube_definition = query_tools
50+
.cube_evaluator()
51+
.cube_from_path(cube_name.clone())?;
52+
let cube_alias = if let Some(sql_alias) = &cube_definition.static_data().sql_alias {
53+
sql_alias
54+
} else {
55+
cube_name
56+
};
57+
Ok(PlanSqlTemplates::memeber_alias_name(
58+
&cube_alias,
59+
&member_name,
60+
member_suffix,
61+
))
62+
}
4063
}

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::query_tools::QueryTools;
22
use super::sql_evaluator::MemberSymbol;
33
use super::BaseDimension;
4-
use super::{BaseMember, VisitorContext};
4+
use super::{BaseMember, BaseMemberHelper, VisitorContext};
55
use cubenativeutils::CubeError;
66
use std::rc::Rc;
77

@@ -10,6 +10,7 @@ pub struct BaseTimeDimension {
1010
query_tools: Rc<QueryTools>,
1111
granularity: Option<String>,
1212
date_range: Option<Vec<String>>,
13+
default_alias: String,
1314
alias_suffix: String,
1415
}
1516

@@ -19,7 +20,7 @@ impl BaseMember for BaseTimeDimension {
1920
}
2021

2122
fn alias_name(&self) -> String {
22-
self.unescaped_alias_name()
23+
self.default_alias.clone()
2324
}
2425

2526
fn member_evaluator(&self) -> Rc<MemberSymbol> {
@@ -55,12 +56,20 @@ impl BaseTimeDimension {
5556
} else {
5657
"day".to_string()
5758
};
59+
let dimension = BaseDimension::try_new_required(member_evaluator, query_tools.clone())?;
60+
let default_alias = BaseMemberHelper::default_alias(
61+
&dimension.cube_name(),
62+
&dimension.name(),
63+
&Some(alias_suffix.clone()),
64+
query_tools.clone(),
65+
)?;
5866
Ok(Rc::new(Self {
59-
dimension: BaseDimension::try_new_required(member_evaluator, query_tools.clone())?,
67+
dimension,
6068
query_tools,
6169
granularity,
6270
date_range,
6371
alias_suffix,
72+
default_alias,
6473
}))
6574
}
6675

@@ -71,6 +80,7 @@ impl BaseTimeDimension {
7180
granularity: new_granularity,
7281
date_range: self.date_range.clone(),
7382
alias_suffix: self.alias_suffix.clone(),
83+
default_alias: self.default_alias.clone(),
7484
})
7585
}
7686

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

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -259,52 +259,4 @@ impl ReferencesBuilder {
259259
)
260260
})
261261
}
262-
263-
/* fn validate_reference(&self, reference: &QualifiedColumnName) -> Result<(), CubeError> {
264-
if self.is_source_has_reference(reference) {
265-
Ok(())
266-
} else {
267-
Err(CubeError::internal(format!(
268-
"Error while planning: schema does not have reference {}",
269-
reference
270-
)))
271-
}
272-
}
273-
274-
fn is_source_has_reference(&self, reference: &QualifiedColumnName) -> bool {
275-
match &self.source.source {
276-
crate::plan::FromSource::Empty => false,
277-
crate::plan::FromSource::Single(source) => {
278-
self.is_single_source_has_reference(&source, reference)
279-
}
280-
crate::plan::FromSource::Join(join) => self.is_join_has_reference(&join, reference),
281-
}
282-
}
283-
284-
fn is_join_has_reference(&self, join: &Rc<Join>, reference: &QualifiedColumnName) -> bool {
285-
if self.is_single_source_has_reference(&join.root, reference) {
286-
return true;
287-
}
288-
join.joins
289-
.iter()
290-
.any(|item| self.is_single_source_has_reference(&item.from, reference))
291-
}
292-
293-
fn is_single_source_has_reference(
294-
&self,
295-
source: &SingleAliasedSource,
296-
reference: &QualifiedColumnName,
297-
) -> bool {
298-
if let Some(reference_source) = &reference.source() {
299-
if reference_source != &source.alias {
300-
return false;
301-
}
302-
}
303-
304-
match &source.source {
305-
SingleSource::Subquery(query_plan) => query_plan.schema().has_column(reference.name()),
306-
SingleSource::Cube(_) => false,
307-
SingleSource::TableReference(_, schema) => schema.has_column(reference.name()),
308-
}
309-
} */
310262
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ impl PlanSqlTemplates {
2020
name.to_case(Case::Snake).replace(".", "__")
2121
}
2222

23-
pub fn memeber_alias_name(cube_name: &str, name: &str, suffix: Option<String>) -> String {
23+
pub fn memeber_alias_name(cube_name: &str, name: &str, suffix: &Option<String>) -> String {
2424
let suffix = if let Some(suffix) = suffix {
2525
format!("_{}", suffix)
2626
} else {

0 commit comments

Comments
 (0)