Skip to content

Commit a74ab72

Browse files
committed
in work
1 parent 04dc6a0 commit a74ab72

File tree

16 files changed

+158
-119
lines changed

16 files changed

+158
-119
lines changed

rust/cubesqlplanner/cubesqlplanner/src/logical_plan/full_key_aggregate_query.rs

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
use super::*;
2-
use crate::planner::query_properties::OrderByItem;
32
use std::rc::Rc;
43

54
pub struct FullKeyAggregateQuery {
65
pub multistage_members: Vec<Rc<LogicalMultiStageMember>>,
76
pub schema: Rc<LogicalSchema>,
87
pub filter: Rc<LogicalFilter>,
9-
pub offset: Option<usize>,
10-
pub limit: Option<usize>,
11-
pub ungrouped: bool,
12-
pub order_by: Vec<OrderByItem>,
8+
pub modifers: Rc<LogicalQueryModifiers>,
139
pub source: Rc<FullKeyAggregate>,
1410
}
1511

@@ -29,26 +25,7 @@ impl PrettyPrint for FullKeyAggregateQuery {
2925
self.schema.pretty_print(result, &details_state);
3026
result.println("filter:", &state);
3127
self.filter.pretty_print(result, &details_state);
32-
if let Some(offset) = &self.offset {
33-
result.println(&format!("offset:{}", offset), &state);
34-
}
35-
if let Some(limit) = &self.limit {
36-
result.println(&format!("limit:{}", limit), &state);
37-
}
38-
result.println(&format!("ungrouped:{}", self.ungrouped), &state);
39-
if !self.order_by.is_empty() {
40-
result.println("order_by:", &state);
41-
for order_by in self.order_by.iter() {
42-
result.println(
43-
&format!(
44-
"{} {}",
45-
order_by.name(),
46-
if order_by.desc() { "desc" } else { "asc" }
47-
),
48-
&details_state,
49-
);
50-
}
51-
}
28+
self.modifers.pretty_print(result, &state);
5229
result.println("source:", &state);
5330
self.source.pretty_print(result, &details_state);
5431
}

rust/cubesqlplanner/cubesqlplanner/src/logical_plan/join.rs

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use super::pretty_print::*;
22
use super::Cube;
3-
use super::SimpleQuery;
4-
use crate::planner::sql_evaluator::{MemberSymbol, SqlCall};
3+
use crate::planner::sql_evaluator::SqlCall;
54
use std::rc::Rc;
65

76
#[derive(Clone)]
@@ -18,31 +17,6 @@ impl PrettyPrint for CubeJoinItem {
1817
}
1918
}
2019

21-
#[derive(Clone)]
22-
pub struct SubqueryDimensionJoinItem {
23-
pub subquery: Rc<SimpleQuery>,
24-
pub dimension: Rc<MemberSymbol>,
25-
pub primary_keys_dimensions: Vec<Rc<MemberSymbol>>,
26-
}
27-
28-
impl PrettyPrint for SubqueryDimensionJoinItem {
29-
fn pretty_print(&self, result: &mut PrettyPrintResult, state: &PrettyPrintState) {
30-
result.println(
31-
&format!(
32-
"SubqueryDimensionJoinItem for dimension `{}`: ",
33-
self.dimension.full_name()
34-
),
35-
state,
36-
);
37-
result.println("subquery:", state);
38-
result.println("primary_keys_dimensions:", state);
39-
let state = state.new_level();
40-
for dim in self.primary_keys_dimensions.iter() {
41-
result.println(&format!("- {}", dim.full_name()), &state);
42-
}
43-
}
44-
}
45-
4620
#[derive(Clone)]
4721
pub enum LogicalJoinItem {
4822
CubeJoinItem(CubeJoinItem),
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
use super::*;
2+
use crate::planner::query_properties::OrderByItem;
3+
4+
pub struct LogicalQueryModifiers {
5+
pub offset: Option<usize>,
6+
pub limit: Option<usize>,
7+
pub ungrouped: bool,
8+
pub order_by: Vec<OrderByItem>,
9+
}
10+
11+
impl PrettyPrint for LogicalQueryModifiers {
12+
fn pretty_print(&self, result: &mut PrettyPrintResult, state: &PrettyPrintState) {
13+
if let Some(offset) = &self.offset {
14+
result.println(&format!("offset:{}", offset), &state);
15+
}
16+
if let Some(limit) = &self.limit {
17+
result.println(&format!("limit:{}", limit), &state);
18+
}
19+
result.println(&format!("ungrouped:{}", self.ungrouped), &state);
20+
if !self.order_by.is_empty() {
21+
let details_state = state.new_level();
22+
result.println("order_by:", &state);
23+
for order_by in self.order_by.iter() {
24+
result.println(
25+
&format!(
26+
"{} {}",
27+
order_by.name(),
28+
if order_by.desc() { "desc" } else { "asc" }
29+
),
30+
&details_state,
31+
);
32+
}
33+
}
34+
}
35+
}
36+

rust/cubesqlplanner/cubesqlplanner/src/logical_plan/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ mod full_key_aggregate;
66
mod full_key_aggregate_query;
77
mod join;
88
mod keys_subquery;
9+
mod logical_query_modifers;
910
mod measure_subquery;
1011
mod multistage;
1112
pub mod optimizers;
@@ -25,6 +26,7 @@ pub use full_key_aggregate::*;
2526
pub use full_key_aggregate_query::*;
2627
pub use join::*;
2728
pub use keys_subquery::*;
29+
pub use logical_query_modifers::*;
2830
pub use measure_subquery::*;
2931
pub use multistage::*;
3032
pub use optimizers::*;

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

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,7 @@ impl PreAggregationOptimizer {
114114
schema: query.schema.clone(),
115115
dimension_subqueries: vec![],
116116
filter: query.filter.clone(),
117-
offset: query.offset,
118-
limit: query.limit,
119-
ungrouped: query.ungrouped,
120-
order_by: query.order_by.clone(),
117+
modifers: query.modifers.clone(),
121118
source,
122119
};
123120
Ok(Some(Rc::new(Query::SimpleQuery(new_query))))
@@ -170,10 +167,12 @@ impl PreAggregationOptimizer {
170167
schema: resolver_multiplied_measures.schema.clone(),
171168
dimension_subqueries: vec![],
172169
filter: resolver_multiplied_measures.filter.clone(),
173-
offset: None,
174-
limit: None,
175-
ungrouped: false,
176-
order_by: vec![],
170+
modifers: Rc::new(LogicalQueryModifiers {
171+
offset: None,
172+
limit: None,
173+
ungrouped: false,
174+
order_by: vec![],
175+
}),
177176
source: SimpleQuerySource::PreAggregation(pre_aggregation_source),
178177
};
179178
Rc::new(FullKeyAggregate {
@@ -200,10 +199,12 @@ impl PreAggregationOptimizer {
200199
multistage_members: multi_stages_queries,
201200
schema: query.schema.clone(),
202201
filter: query.filter.clone(),
203-
offset: query.offset,
204-
limit: query.limit,
205-
ungrouped: query.ungrouped,
206-
order_by: query.order_by.clone(),
202+
modifers: Rc::new(LogicalQueryModifiers {
203+
offset: query.modifers.offset,
204+
limit: query.modifers.limit,
205+
ungrouped: query.modifers.ungrouped,
206+
order_by: query.modifers.order_by.clone(),
207+
}),
207208
source,
208209
};
209210
Ok(Some(Rc::new(Query::FullKeyAggregateQuery(result))))

rust/cubesqlplanner/cubesqlplanner/src/logical_plan/optimizers/pre_aggregation/original_sql_optimizer.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,7 @@ impl OriginalSqlOptimizer {
4141
multistage_members: query.multistage_members.clone(),
4242
schema: query.schema.clone(),
4343
filter: query.filter.clone(),
44-
offset: query.offset,
45-
limit: query.limit,
46-
ungrouped: query.ungrouped,
47-
order_by: query.order_by.clone(),
44+
modifers: query.modifers.clone(),
4845
source: optimized_source.unwrap_or_else(|| query.source.clone()),
4946
}))
5047
} else {
@@ -146,10 +143,7 @@ impl OriginalSqlOptimizer {
146143
.unwrap_or_else(|| query.dimension_subqueries.clone()),
147144
schema: query.schema.clone(),
148145
filter: query.filter.clone(),
149-
offset: query.offset,
150-
limit: query.limit,
151-
ungrouped: query.ungrouped,
152-
order_by: query.order_by.clone(),
146+
modifers: query.modifers.clone(),
153147
}))
154148
} else {
155149
Ok(None)

rust/cubesqlplanner/cubesqlplanner/src/logical_plan/simple_query.rs

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use super::*;
2-
use crate::planner::query_properties::OrderByItem;
32
use std::rc::Rc;
43

54
#[derive(Clone)]
@@ -22,10 +21,7 @@ pub struct SimpleQuery {
2221
pub schema: Rc<LogicalSchema>,
2322
pub dimension_subqueries: Vec<Rc<DimensionSubQuery>>,
2423
pub filter: Rc<LogicalFilter>,
25-
pub offset: Option<usize>,
26-
pub limit: Option<usize>,
27-
pub ungrouped: bool,
28-
pub order_by: Vec<OrderByItem>,
24+
pub modifers: Rc<LogicalQueryModifiers>,
2925
pub source: SimpleQuerySource,
3026
}
3127

@@ -44,26 +40,7 @@ impl PrettyPrint for SimpleQuery {
4440
}
4541
result.println("filters:", &state);
4642
self.filter.pretty_print(result, &details_state);
47-
if let Some(offset) = &self.offset {
48-
result.println(&format!("offset:{}", offset), &state);
49-
}
50-
if let Some(limit) = &self.limit {
51-
result.println(&format!("limit:{}", limit), &state);
52-
}
53-
result.println(&format!("ungrouped:{}", self.ungrouped), &state);
54-
if !self.order_by.is_empty() {
55-
result.println("order_by:", &state);
56-
for order_by in self.order_by.iter() {
57-
result.println(
58-
&format!(
59-
"{} {}",
60-
order_by.name(),
61-
if order_by.desc() { "desc" } else { "asc" }
62-
),
63-
&details_state,
64-
);
65-
}
66-
}
43+
self.modifers.pretty_print(result, &state);
6744

6845
result.println("source:", &state);
6946
self.source.pretty_print(result, &details_state);

rust/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/builder.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ impl PhysicalPlanBuilder {
134134
};
135135

136136
let mut select_builder = SelectBuilder::new(from);
137-
context_factory.set_ungrouped(logical_plan.ungrouped);
137+
context_factory.set_ungrouped(logical_plan.modifers.ungrouped);
138138
context_factory.set_pre_aggregation_measures_references(measure_references);
139139
context_factory.set_pre_aggregation_dimensions_references(dimensions_references);
140140

@@ -143,15 +143,15 @@ impl PhysicalPlanBuilder {
143143
let member_ref: Rc<dyn BaseMember> =
144144
MemberSymbolRef::try_new(member.clone(), self.query_tools.clone())?;
145145
select_builder.add_projection_member(&member_ref, None);
146-
if !logical_plan.ungrouped {
146+
if !logical_plan.modifers.ungrouped {
147147
group_by.push(Expr::Member(MemberExpression::new(member_ref.clone())));
148148
}
149149
}
150150
for member in logical_plan.schema.time_dimensions.iter() {
151151
let member_ref: Rc<dyn BaseMember> =
152152
MemberSymbolRef::try_new(member.clone(), self.query_tools.clone())?;
153153
select_builder.add_projection_member(&member_ref, None);
154-
if !logical_plan.ungrouped {
154+
if !logical_plan.modifers.ungrouped {
155155
group_by.push(Expr::Member(MemberExpression::new(member_ref.clone())));
156156
}
157157
}
@@ -174,15 +174,15 @@ impl PhysicalPlanBuilder {
174174
select_builder.set_filter(filter);
175175
select_builder.set_group_by(group_by);
176176
select_builder
177-
.set_order_by(self.make_order_by(&logical_plan.schema, &logical_plan.order_by)?);
177+
.set_order_by(self.make_order_by(&logical_plan.schema, &logical_plan.modifers.order_by)?);
178178
select_builder.set_having(having);
179-
select_builder.set_limit(logical_plan.limit);
180-
select_builder.set_offset(logical_plan.offset);
179+
select_builder.set_limit(logical_plan.modifers.limit);
180+
select_builder.set_offset(logical_plan.modifers.offset);
181181

182182
context_factory
183183
.set_rendered_as_multiplied_measures(logical_plan.schema.multiplied_measures.clone());
184184
context_factory.set_render_references(render_references);
185-
if logical_plan.ungrouped {
185+
if logical_plan.modifers.ungrouped {
186186
context_factory.set_ungrouped(true);
187187
}
188188

@@ -362,10 +362,10 @@ impl PhysicalPlanBuilder {
362362
};
363363

364364
select_builder
365-
.set_order_by(self.make_order_by(&logical_plan.schema, &logical_plan.order_by)?);
365+
.set_order_by(self.make_order_by(&logical_plan.schema, &logical_plan.modifers.order_by)?);
366366
select_builder.set_filter(having);
367-
select_builder.set_limit(logical_plan.limit);
368-
select_builder.set_offset(logical_plan.offset);
367+
select_builder.set_limit(logical_plan.modifers.limit);
368+
select_builder.set_offset(logical_plan.modifers.offset);
369369
select_builder.set_ctes(ctes);
370370

371371
let mut context_factory = context.make_sql_nodes_factory()?;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use crate::plan::schema::QualifiedColumnName;
2+
use crate::planner::planners::multi_stage::TimeShiftState;
3+
use crate::planner::sql_evaluator::sql_nodes::SqlNodesFactory;
4+
use std::collections::HashMap;
5+
6+
#[derive(Clone, Debug, Default)]
7+
pub(super) struct PushDownBuilderContext {
8+
pub alias_prefix: Option<String>,
9+
pub render_measure_as_state: bool, //Render measure as state, for example hll state for count_approx
10+
pub render_measure_for_ungrouped: bool,
11+
pub time_shifts: TimeShiftState,
12+
pub original_sql_pre_aggregations: HashMap<String, String>,
13+
}
14+
15+
impl PushDownBuilderContext {
16+
pub fn make_sql_nodes_factory(&self) -> SqlNodesFactory {
17+
let mut factory = SqlNodesFactory::new();
18+
factory.set_time_shifts(self.time_shifts.clone());
19+
factory.set_count_approx_as_state(self.render_measure_as_state);
20+
factory.set_ungrouped_measure(self.render_measure_for_ungrouped);
21+
factory.set_original_sql_pre_aggregations(self.original_sql_pre_aggregations.clone());
22+
factory
23+
}
24+
}
25+
26+
#[derive(Clone, Debug, Default)]
27+
pub(super) struct PullUpBuilderContext {
28+
pub render_references: HashMap<String, QualifiedColumnName>,
29+
pub measure_references: HashMap<String, QualifiedColumnName>,
30+
pub dimensions_references: HashMap<String, QualifiedColumnName>,
31+
pub aliases: HashMap<String, String>,
32+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,9 @@
11
mod builder;
2+
mod context;
3+
mod node_processor;
4+
mod processors;
5+
26
pub use builder::*;
7+
use context::*;
8+
use node_processor::*;
9+
use processors::*;

0 commit comments

Comments
 (0)