Skip to content

Commit 54ee729

Browse files
committed
in work
1 parent f193dec commit 54ee729

File tree

7 files changed

+48
-50
lines changed

7 files changed

+48
-50
lines changed

packages/cubejs-schema-compiler/src/adapter/BaseQuery.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4240,7 +4240,7 @@ export class BaseQuery {
42404240
'SELECT {{ value }} as {{ group.name }}' +
42414241
'{% if not loop.last %} UNION ALL\n{% endif %}' +
42424242
'{% endfor %}' +
4243-
') {{ group.alias }}\n' +
4243+
') AS {{ group.alias }}\n' +
42444244
'{% endfor %}'
42454245
},
42464246
expressions: {

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

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -169,23 +169,6 @@ impl PhysicalPlanBuilder {
169169
Ok(())
170170
}
171171

172-
pub(crate) fn process_calc_group(
173-
&self,
174-
symbol: &Rc<MemberSymbol>,
175-
context_factory: &mut SqlNodesFactory,
176-
filter: &Option<Filter>,
177-
) -> Result<(), CubeError> {
178-
for dim in collect_calc_group_dims(symbol)? {
179-
let values = get_filtered_values(&dim, filter);
180-
context_factory.add_calc_group_item(
181-
dim.cube_name().clone(),
182-
dim.name().clone(),
183-
values,
184-
);
185-
}
186-
Ok(())
187-
}
188-
189172
pub(crate) fn make_order_by(
190173
&self,
191174
logical_schema: &LogicalSchema,

rust/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/context.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ pub(super) struct PushDownBuilderContext {
1818
pub dimensions_query: bool,
1919
pub measure_subquery: bool,
2020
pub multi_stage_schemas: HashMap<String, Rc<Schema>>,
21-
pub calc_groups_resolved: bool,
2221
}
2322

2423
impl PushDownBuilderContext {

rust/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/processors/keys_sub_query.rs

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
use super::super::{LogicalNodeProcessor, ProcessableNode, PushDownBuilderContext};
2-
use crate::logical_plan::KeysSubQuery;
2+
use crate::logical_plan::{all_symbols, KeysSubQuery};
33
use crate::physical_plan_builder::PhysicalPlanBuilder;
4-
use crate::plan::{Select, SelectBuilder};
5-
use crate::planner::sql_evaluator::ReferencesBuilder;
4+
use crate::plan::{CalcGroupItem, CalcGroupsJoin, From, Select, SelectBuilder};
5+
use crate::planner::sql_evaluator::collectors::collect_calc_group_dims_from_nodes;
6+
use crate::planner::sql_evaluator::{get_filtered_values, ReferencesBuilder};
67
use cubenativeutils::CubeError;
8+
use itertools::Itertools as _;
79
use std::collections::HashMap;
810
use std::rc::Rc;
911

@@ -36,6 +38,34 @@ impl<'a> LogicalNodeProcessor<'a, KeysSubQuery> for KeysSubQueryProcessor<'a> {
3638
.builder
3739
.process_node(keys_subquery.source().as_ref(), &context)?;
3840

41+
//FIXME dublication with QueryProcessor
42+
let all_symbols = all_symbols(&keys_subquery.schema(), &keys_subquery.filter());
43+
let calc_group_dims = collect_calc_group_dims_from_nodes(all_symbols.iter())?;
44+
45+
let filter = keys_subquery.filter().all_filters();
46+
let calc_groups_items = calc_group_dims.into_iter().map(|dim| {
47+
let values = get_filtered_values(&dim, &filter);
48+
CalcGroupItem {
49+
symbol: dim,
50+
values,
51+
}
52+
});
53+
for item in calc_groups_items
54+
.clone()
55+
.filter(|itm| itm.values.len() == 1)
56+
{
57+
context_factory.add_render_reference(item.symbol.full_name(), item.values[0].clone());
58+
}
59+
let calc_groups_to_join = calc_groups_items
60+
.filter(|itm| itm.values.len() > 1)
61+
.collect_vec();
62+
let source = if calc_groups_to_join.is_empty() {
63+
source
64+
} else {
65+
let groups_join = CalcGroupsJoin::try_new(source, calc_groups_to_join)?;
66+
From::new_from_calc_groups_join(groups_join)
67+
};
68+
3969
let references_builder = ReferencesBuilder::new(source.clone());
4070
let mut select_builder = SelectBuilder::new(source);
4171
self.builder.resolve_subquery_dimensions_references(
@@ -49,11 +79,11 @@ impl<'a> LogicalNodeProcessor<'a, KeysSubQuery> for KeysSubQueryProcessor<'a> {
4979
.chain(keys_subquery.primary_keys_dimensions().iter())
5080
{
5181
let alias = member.alias();
52-
self.builder.process_calc_group(
82+
/* self.builder.process_calc_group(
5383
member,
5484
&mut context_factory,
5585
&keys_subquery.filter().all_filters(),
56-
)?;
86+
)?; */
5787
references_builder.resolve_references_for_member(
5888
member.clone(),
5989
&None,
@@ -63,7 +93,7 @@ impl<'a> LogicalNodeProcessor<'a, KeysSubQuery> for KeysSubQueryProcessor<'a> {
6393
}
6494

6595
select_builder.set_distinct();
66-
select_builder.set_filter(keys_subquery.filter().all_filters());
96+
select_builder.set_filter(filter);
6797
let res = Rc::new(select_builder.build(query_tools.clone(), context_factory));
6898
Ok(res)
6999
}

rust/cubesqlplanner/cubesqlplanner/src/physical_plan_builder/processors/query.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,16 @@ impl<'a> LogicalNodeProcessor<'a, Query> for QueryProcessor<'a> {
6666
values,
6767
}
6868
});
69-
let calc_groups_to_join = calc_groups_items.collect_vec();
70-
/* .filter(|itm| itm.values.len() == 1)
71-
.collect_vec(); */
69+
for item in calc_groups_items
70+
.clone()
71+
.filter(|itm| itm.values.len() == 1)
72+
{
73+
context_factory
74+
.add_render_reference(item.symbol.full_name(), item.values[0].clone());
75+
}
76+
let calc_groups_to_join = calc_groups_items
77+
.filter(|itm| itm.values.len() > 1)
78+
.collect_vec();
7279
if calc_groups_to_join.is_empty() {
7380
from
7481
} else {
@@ -118,8 +125,6 @@ impl<'a> LogicalNodeProcessor<'a, Query> for QueryProcessor<'a> {
118125
&None,
119126
context_factory.render_references_mut(),
120127
)?;
121-
self.builder
122-
.process_calc_group(member, &mut context_factory, &filter)?;
123128
if context.measure_subquery {
124129
select_builder.add_projection_member_without_schema(member, None);
125130
} else {

rust/cubesqlplanner/cubesqlplanner/src/plan/calc_groups_join.rs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,8 @@ impl CalcGroupsJoin {
5151
) -> Result<String, CubeError> {
5252
let base_sql = self.from.to_sql(templates, context)?;
5353
let original_sql = match &self.from.source {
54-
FromSource::Join(_) => Some(format!(
55-
"({}) {}",
56-
base_sql,
57-
templates.quote_identifier("original_join")?
58-
)),
5954
FromSource::Empty => None,
60-
FromSource::Single(source) => Some(base_sql),
61-
FromSource::CalcGroupsJoin(_) => {
62-
return Err(CubeError::internal(format!(
63-
"Nested CalcGroupsJoin not supported"
64-
)));
65-
}
55+
_ => Some(base_sql),
6656
};
6757

6858
let template_groups = self

rust/cubesqlplanner/cubesqlplanner/src/planner/sql_evaluator/sql_nodes/factory.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -83,15 +83,6 @@ impl SqlNodesFactory {
8383
&mut self.render_references
8484
}
8585

86-
pub fn add_calc_group_item(
87-
&mut self,
88-
cube_name: String,
89-
dimension_name: String,
90-
values: Vec<String>,
91-
) {
92-
//self.calc_groups.add(cube_name, dimension_name, values);
93-
}
94-
9586
pub fn set_rendered_as_multiplied_measures(&mut self, value: HashSet<String>) {
9687
self.rendered_as_multiplied_measures = value;
9788
}

0 commit comments

Comments
 (0)