Skip to content

Commit e4468bb

Browse files
authored
chore(tesseract): Split filter business model and SQL rendering (cube-js#10828)
1 parent f050b10 commit e4468bb

60 files changed

Lines changed: 784 additions & 613 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/filter.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use super::pretty_print::*;
2-
use crate::plan::{Filter, FilterItem};
2+
use crate::planner::filter::{Filter, FilterItem};
33
use itertools::Itertools;
44

55
#[derive(Default)]

rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/common/helper.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use itertools::Itertools;
22

33
use crate::logical_plan::*;
4-
use crate::plan::FilterItem;
4+
use crate::planner::filter::FilterItem;
55
use crate::planner::sql_evaluator::MemberSymbol;
66
use std::rc::Rc;
77

rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/dimension_matcher.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
use super::CompiledPreAggregation;
2-
use crate::plan::filter::FilterGroupOperator;
3-
use crate::plan::FilterItem;
4-
use crate::planner::filter::BaseFilter;
2+
use crate::planner::filter::{BaseFilter, FilterGroupOperator, FilterItem};
53
use crate::planner::query_tools::QueryTools;
64
use crate::planner::sql_evaluator::DimensionSymbol;
75
use crate::planner::sql_evaluator::MemberSymbol;

rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/optimizer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use super::PreAggregationsCompiler;
22
use super::*;
33
use crate::logical_plan::visitor::{LogicalPlanRewriter, NodeRewriteResult};
44
use crate::logical_plan::*;
5-
use crate::plan::FilterItem;
5+
use crate::planner::filter::FilterItem;
66
use crate::planner::filter::FilterOp;
77
use crate::planner::join_hints::JoinHints;
88
use crate::planner::multi_fact_join_groups::{MeasuresJoinHints, MultiFactJoinGroups};

rust/cube/cubesqlplanner/cubesqlplanner/src/logical_plan/pretty_print.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::plan::FilterItem;
1+
use crate::planner::filter::FilterItem;
22
use crate::planner::sql_evaluator::MemberSymbol;
33
use std::rc::Rc;
44

rust/cube/cubesqlplanner/cubesqlplanner/src/plan/builder/select.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use crate::plan::{
2-
AliasedExpr, Cte, Expr, Filter, From, FromSource, MemberExpression, OrderBy,
3-
QualifiedColumnName, Schema, SchemaColumn, Select, SingleAliasedSource, SingleSource,
2+
AliasedExpr, Cte, Expr, From, FromSource, MemberExpression, OrderBy, QualifiedColumnName,
3+
Schema, SchemaColumn, Select, SingleAliasedSource, SingleSource,
44
};
5+
use crate::planner::filter::Filter;
56

67
use crate::plan::expression::FunctionExpression;
78
use crate::planner::query_tools::QueryTools;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
use super::ToSql;
2+
use crate::planner::filter::typed_filter::resolve_base_symbol;
3+
use crate::planner::filter::BaseFilter;
4+
use crate::planner::query_tools::QueryTools;
5+
use crate::planner::sql_evaluator::sql_nodes::SqlNode;
6+
use crate::planner::sql_evaluator::SqlEvaluatorVisitor;
7+
use crate::planner::sql_templates::PlanSqlTemplates;
8+
use crate::planner::FiltersContext;
9+
use cubenativeutils::CubeError;
10+
use std::rc::Rc;
11+
12+
impl ToSql for BaseFilter {
13+
fn to_sql(
14+
&self,
15+
visitor: &SqlEvaluatorVisitor,
16+
node_processor: Rc<dyn SqlNode>,
17+
query_tools: Rc<QueryTools>,
18+
templates: &PlanSqlTemplates,
19+
filters_ctx: &FiltersContext,
20+
) -> Result<String, CubeError> {
21+
if !filters_ctx.filter_params_columns.is_empty() {
22+
let symbol_to_match =
23+
resolve_base_symbol(self.raw_member_evaluator_ref()).resolve_reference_chain();
24+
if let Some(filter_params_column) = filters_ctx
25+
.filter_params_columns
26+
.get(&symbol_to_match.full_name())
27+
{
28+
return self.typed_filter().to_sql_for_filter_params(
29+
filter_params_column,
30+
templates,
31+
filters_ctx,
32+
);
33+
}
34+
}
35+
self.typed_filter()
36+
.to_sql(visitor, node_processor, query_tools, templates, filters_ctx)
37+
}
38+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
use super::ToSql;
2+
use crate::planner::filter::BaseSegment;
3+
use crate::planner::query_tools::QueryTools;
4+
use crate::planner::sql_evaluator::sql_nodes::SqlNode;
5+
use crate::planner::sql_evaluator::SqlEvaluatorVisitor;
6+
use crate::planner::sql_templates::PlanSqlTemplates;
7+
use crate::planner::FiltersContext;
8+
use cubenativeutils::CubeError;
9+
use std::rc::Rc;
10+
11+
impl ToSql for BaseSegment {
12+
fn to_sql(
13+
&self,
14+
visitor: &SqlEvaluatorVisitor,
15+
node_processor: Rc<dyn SqlNode>,
16+
_query_tools: Rc<QueryTools>,
17+
templates: &PlanSqlTemplates,
18+
_filters_ctx: &FiltersContext,
19+
) -> Result<String, CubeError> {
20+
visitor.apply(&self.member_evaluator(), node_processor, templates)
21+
}
22+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
use super::ToSql;
2+
use crate::planner::filter::{Filter, FilterItem};
3+
use crate::planner::query_tools::QueryTools;
4+
use crate::planner::sql_evaluator::sql_nodes::SqlNode;
5+
use crate::planner::sql_evaluator::SqlEvaluatorVisitor;
6+
use crate::planner::sql_templates::PlanSqlTemplates;
7+
use crate::planner::FiltersContext;
8+
use cubenativeutils::CubeError;
9+
use std::rc::Rc;
10+
11+
impl ToSql for FilterItem {
12+
fn to_sql(
13+
&self,
14+
visitor: &SqlEvaluatorVisitor,
15+
node_processor: Rc<dyn SqlNode>,
16+
query_tools: Rc<QueryTools>,
17+
templates: &PlanSqlTemplates,
18+
filters_ctx: &FiltersContext,
19+
) -> Result<String, CubeError> {
20+
let res = match self {
21+
FilterItem::Group(group) => {
22+
let operator = format!(" {} ", group.operator.to_string());
23+
let items_sql = group
24+
.items
25+
.iter()
26+
.map(|itm| {
27+
itm.to_sql(
28+
visitor,
29+
node_processor.clone(),
30+
query_tools.clone(),
31+
templates,
32+
filters_ctx,
33+
)
34+
})
35+
.collect::<Result<Vec<_>, _>>()?
36+
.into_iter()
37+
.filter(|itm| !itm.is_empty())
38+
.collect::<Vec<_>>();
39+
if items_sql.is_empty() {
40+
"".to_string()
41+
} else {
42+
let result = items_sql.join(&operator);
43+
format!("({})", result)
44+
}
45+
}
46+
FilterItem::Item(item) => {
47+
let sql =
48+
item.to_sql(visitor, node_processor, query_tools, templates, filters_ctx)?;
49+
format!("({})", sql)
50+
}
51+
FilterItem::Segment(item) => {
52+
let sql =
53+
item.to_sql(visitor, node_processor, query_tools, templates, filters_ctx)?;
54+
format!("({})", sql)
55+
}
56+
};
57+
Ok(res)
58+
}
59+
}
60+
61+
impl ToSql for Filter {
62+
fn to_sql(
63+
&self,
64+
visitor: &SqlEvaluatorVisitor,
65+
node_processor: Rc<dyn SqlNode>,
66+
query_tools: Rc<QueryTools>,
67+
templates: &PlanSqlTemplates,
68+
filters_ctx: &FiltersContext,
69+
) -> Result<String, CubeError> {
70+
let res = self
71+
.items
72+
.iter()
73+
.map(|itm| {
74+
itm.to_sql(
75+
visitor,
76+
node_processor.clone(),
77+
query_tools.clone(),
78+
templates,
79+
filters_ctx,
80+
)
81+
})
82+
.collect::<Result<Vec<_>, _>>()?
83+
.join(" AND ");
84+
Ok(res)
85+
}
86+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
pub mod base_filter;
2+
pub mod base_segment;
3+
pub mod filter;
4+
pub(crate) mod operators;
5+
pub mod render_filter;
6+
pub mod to_sql;
7+
pub mod typed_filter;
8+
9+
pub use render_filter::{render_filter, render_filter_item};
10+
pub use to_sql::ToSql;

0 commit comments

Comments
 (0)