Skip to content

Commit 10f249e

Browse files
authored
chore(tesseract): Split member symbol business model and SQL rendering (cube-js#10835)
1 parent e4468bb commit 10f249e

28 files changed

Lines changed: 272 additions & 274 deletions

rust/cube/cubesqlplanner/cubesqlplanner/src/plan/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ pub mod order;
99
pub mod query_plan;
1010
pub mod schema;
1111
pub mod select;
12+
pub mod symbols;
1213
pub mod time_series;
1314
pub mod union;
1415

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
use super::super::{MemberSqlContext, ToSql};
2+
use crate::planner::sql_evaluator::symbols::dimension_kinds::CaseDimension;
3+
use cubenativeutils::CubeError;
4+
5+
impl ToSql for CaseDimension {
6+
fn to_sql(&self, ctx: &MemberSqlContext) -> Result<String, CubeError> {
7+
if let Some(member_sql) = self.member_sql() {
8+
ctx.eval_sql_call(member_sql)
9+
} else {
10+
Err(CubeError::internal(format!(
11+
"Dimension {} has no sql evaluator",
12+
ctx.full_name
13+
)))
14+
}
15+
}
16+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
pub mod case_dimension;
2+
pub mod regular;
3+
pub mod switch;
4+
5+
use super::{MemberSqlContext, ToSql};
6+
use crate::planner::sql_evaluator::DimensionKind;
7+
use cubenativeutils::CubeError;
8+
9+
impl ToSql for DimensionKind {
10+
fn to_sql(&self, ctx: &MemberSqlContext) -> Result<String, CubeError> {
11+
match self {
12+
Self::Regular(r) => r.to_sql(ctx),
13+
Self::Geo(_) => Err(CubeError::internal(format!(
14+
"Geo dimension {} doesn't support evaluate_sql directly",
15+
ctx.full_name
16+
))),
17+
Self::Switch(s) => s.to_sql(ctx),
18+
Self::Case(c) => c.to_sql(ctx),
19+
}
20+
}
21+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
use super::super::{MemberSqlContext, ToSql};
2+
use crate::planner::sql_evaluator::symbols::dimension_kinds::RegularDimension;
3+
use cubenativeutils::CubeError;
4+
5+
impl ToSql for RegularDimension {
6+
fn to_sql(&self, ctx: &MemberSqlContext) -> Result<String, CubeError> {
7+
ctx.eval_sql_call(self.member_sql())
8+
}
9+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
use super::super::{MemberSqlContext, ToSql};
2+
use crate::planner::sql_evaluator::symbols::dimension_kinds::SwitchDimension;
3+
use cubenativeutils::CubeError;
4+
5+
impl ToSql for SwitchDimension {
6+
fn to_sql(&self, ctx: &MemberSqlContext) -> Result<String, CubeError> {
7+
if let Some(member_sql) = self.member_sql() {
8+
ctx.eval_sql_call(member_sql)
9+
} else {
10+
ctx.templates.quote_identifier(ctx.name)
11+
}
12+
}
13+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
use super::{MemberSqlContext, ToSql};
2+
use crate::planner::sql_evaluator::DimensionSymbol;
3+
use cubenativeutils::CubeError;
4+
5+
impl ToSql for DimensionSymbol {
6+
fn to_sql(&self, ctx: &MemberSqlContext) -> Result<String, CubeError> {
7+
self.kind().to_sql(ctx)
8+
}
9+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
use super::super::{MemberSqlContext, ToSql};
2+
use crate::planner::sql_evaluator::symbols::measure_kinds::AggregatedMeasure;
3+
use cubenativeutils::CubeError;
4+
5+
impl ToSql for AggregatedMeasure {
6+
fn to_sql(&self, ctx: &MemberSqlContext) -> Result<String, CubeError> {
7+
match self.member_sql() {
8+
Some(sql) => ctx.eval_sql_call(sql),
9+
None => Err(CubeError::internal(
10+
"Aggregated measure without sql cannot be evaluated directly".to_string(),
11+
)),
12+
}
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
use super::super::{MemberSqlContext, ToSql};
2+
use crate::planner::sql_evaluator::symbols::measure_kinds::CalculatedMeasure;
3+
use cubenativeutils::CubeError;
4+
5+
impl ToSql for CalculatedMeasure {
6+
fn to_sql(&self, ctx: &MemberSqlContext) -> Result<String, CubeError> {
7+
match self.member_sql() {
8+
Some(sql) => ctx.eval_sql_call(sql),
9+
None => Err(CubeError::internal(
10+
"Calculated measure without sql cannot be evaluated directly".to_string(),
11+
)),
12+
}
13+
}
14+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use super::super::{MemberSqlContext, ToSql};
2+
use crate::planner::sql_evaluator::symbols::measure_kinds::{CountMeasure, CountSql};
3+
use cubenativeutils::CubeError;
4+
5+
impl ToSql for CountMeasure {
6+
fn to_sql(&self, ctx: &MemberSqlContext) -> Result<String, CubeError> {
7+
match self.sql() {
8+
CountSql::Explicit(sql) => ctx.eval_sql_call(sql),
9+
CountSql::Auto(pk_sqls) => {
10+
if pk_sqls.len() > 1 {
11+
let pk_strings = pk_sqls
12+
.iter()
13+
.map(|pk| -> Result<_, CubeError> {
14+
let res = ctx.eval_sql_call(pk)?;
15+
ctx.templates.cast_to_string(&res)
16+
})
17+
.collect::<Result<Vec<_>, _>>()?;
18+
ctx.templates.concat_strings(&pk_strings)
19+
} else if let Some(pk_sql) = pk_sqls.first() {
20+
ctx.eval_sql_call(pk_sql)
21+
} else {
22+
Ok("*".to_string())
23+
}
24+
}
25+
}
26+
}
27+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
pub mod aggregated;
2+
pub mod calculated;
3+
pub mod count;
4+
5+
use super::{MemberSqlContext, ToSql};
6+
use crate::planner::sql_evaluator::MeasureKind;
7+
use cubenativeutils::CubeError;
8+
9+
impl ToSql for MeasureKind {
10+
fn to_sql(&self, ctx: &MemberSqlContext) -> Result<String, CubeError> {
11+
match self {
12+
Self::Count(c) => c.to_sql(ctx),
13+
Self::Aggregated(a) => a.to_sql(ctx),
14+
Self::Calculated(c) => c.to_sql(ctx),
15+
Self::Rank => Err(CubeError::internal(format!(
16+
"Rank measure doesn't support direct evaluation for {}",
17+
ctx.full_name
18+
))),
19+
}
20+
}
21+
}

0 commit comments

Comments
 (0)