Skip to content

Commit ca73b55

Browse files
committed
in work
1 parent b5572bd commit ca73b55

File tree

8 files changed

+91
-27
lines changed

8 files changed

+91
-27
lines changed

packages/cubejs-schema-compiler/test/integration/utils/BaseDbRunner.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ export class BaseDbRunner {
3030

3131
const res = await this.testQuery(sqlAndParams);
3232
console.log(JSON.stringify(res));
33-
console.log('!!!! res: ', res);
3433

3534
expect(res).toEqual(
3635
expectedResult

rust/cubesqlplanner/cubesqlplanner/src/logical_plan/multistage/dimension.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ impl MultiStageDimensionCalculation {
3737
pub fn resolved_dimensions(&self) -> Result<Vec<String>, CubeError> {
3838
let mut result = vec![];
3939
for dim in self.schema.all_dimensions() {
40-
if has_multi_stage_members(dim, false)? {
40+
if has_multi_stage_members(dim, true)? {
4141
result.push(dim.clone().resolve_reference_chain().full_name());
4242
}
4343
}
@@ -48,7 +48,7 @@ impl MultiStageDimensionCalculation {
4848
pub fn join_dimensions(&self) -> Result<Vec<Rc<MemberSymbol>>, CubeError> {
4949
let mut result = vec![];
5050
for dim in self.schema.all_dimensions() {
51-
if !has_multi_stage_members(dim, false)? {
51+
if !has_multi_stage_members(dim, true)? {
5252
result.push(dim.clone());
5353
}
5454
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ impl<'a> LogicalNodeProcessor<'a, Query> for QueryProcessor<'a> {
7272

7373
context.remove_multi_stage_dimensions();
7474
for member in logical_plan.schema().all_dimensions() {
75-
if has_multi_stage_members(member, false)? {
75+
if has_multi_stage_members(member, true)? {
7676
context.add_multi_stage_dimension(member.full_name());
7777
}
7878
}

rust/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/applied_state.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ impl MultiStageAppliedState {
7474
let mut filtered = Vec::new();
7575
for d in &self.dimensions {
7676
if resolved_dimensions.contains(&d.clone().resolve_reference_chain().full_name())
77-
|| !has_multi_stage_members(&d, false)?
77+
|| !has_multi_stage_members(&d, true)?
7878
{
7979
filtered.push(d.clone());
8080
}
@@ -83,7 +83,7 @@ impl MultiStageAppliedState {
8383
let mut filtered = Vec::new();
8484
for d in &self.time_dimensions {
8585
if resolved_dimensions.contains(&d.clone().resolve_reference_chain().full_name())
86-
|| !has_multi_stage_members(&d, false)?
86+
|| !has_multi_stage_members(&d, true)?
8787
{
8888
filtered.push(d.clone());
8989
}

rust/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/member.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ impl MultiStageMemberType {
172172
pub struct MultiStageMember {
173173
member_type: MultiStageMemberType,
174174
member_symbol: Rc<MemberSymbol>,
175+
is_without_member_leaf: bool, //FIXME hack, refactor needed
175176
is_ungrupped: bool,
176177
has_aggregates_on_top: bool,
177178
}
@@ -186,6 +187,22 @@ impl MultiStageMember {
186187
Rc::new(Self {
187188
member_type,
188189
member_symbol: evaluation_node,
190+
is_without_member_leaf: false,
191+
is_ungrupped,
192+
has_aggregates_on_top,
193+
})
194+
}
195+
196+
pub fn new_without_member_leaf(
197+
member_type: MultiStageMemberType,
198+
evaluation_node: Rc<MemberSymbol>,
199+
is_ungrupped: bool,
200+
has_aggregates_on_top: bool,
201+
) -> Rc<Self> {
202+
Rc::new(Self {
203+
member_type,
204+
member_symbol: evaluation_node,
205+
is_without_member_leaf: true,
189206
is_ungrupped,
190207
has_aggregates_on_top,
191208
})
@@ -199,6 +216,10 @@ impl MultiStageMember {
199216
&self.member_symbol
200217
}
201218

219+
pub fn is_without_member_leaf(&self) -> bool {
220+
self.is_without_member_leaf
221+
}
222+
202223
pub fn full_name(&self) -> String {
203224
self.member_symbol.full_name()
204225
}

rust/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/member_query_planner.rs

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -272,8 +272,22 @@ impl MultiStageMemberQueryPlanner {
272272
let mut measures = vec![];
273273
let cte_member = self.description.member().evaluation_node();
274274
match cte_member.as_ref() {
275-
MemberSymbol::Dimension(_) => dimensions.push(cte_member.clone()),
276-
MemberSymbol::TimeDimension(_) => time_dimensions.push(cte_member.clone()),
275+
MemberSymbol::Dimension(_) => {
276+
if !dimensions.iter().any(|d| {
277+
d.clone().resolve_reference_chain()
278+
== cte_member.clone().resolve_reference_chain()
279+
}) {
280+
dimensions.push(cte_member.clone())
281+
}
282+
}
283+
MemberSymbol::TimeDimension(_) => {
284+
if !time_dimensions.iter().any(|d| {
285+
d.clone().resolve_reference_chain()
286+
== cte_member.clone().resolve_reference_chain()
287+
}) {
288+
time_dimensions.push(cte_member.clone())
289+
}
290+
}
277291
MemberSymbol::Measure(_) => measures.push(cte_member.clone()),
278292
_ => {}
279293
}
@@ -323,25 +337,27 @@ impl MultiStageMemberQueryPlanner {
323337
let mut dimensions = self.description.state().dimensions_symbols();
324338
let mut time_dimensions = self.description.state().time_dimensions_symbols();
325339
let mut measures = vec![];
326-
match member_node.as_ref() {
327-
MemberSymbol::Dimension(_) => {
328-
if !dimensions
329-
.iter()
330-
.any(|d| d.has_member_in_reference_chain(&member_node))
331-
{
332-
dimensions.push(member_node.clone())
340+
if !self.description.member().is_without_member_leaf() {
341+
match member_node.as_ref() {
342+
MemberSymbol::Dimension(_) => {
343+
if !dimensions.iter().any(|d| {
344+
d.clone().resolve_reference_chain()
345+
== member_node.clone().resolve_reference_chain()
346+
}) {
347+
dimensions.push(member_node.clone())
348+
}
333349
}
334-
}
335-
MemberSymbol::TimeDimension(_) => {
336-
if !time_dimensions
337-
.iter()
338-
.any(|d| d.has_member_in_reference_chain(&member_node))
339-
{
340-
time_dimensions.push(member_node.clone())
350+
MemberSymbol::TimeDimension(_) => {
351+
if !time_dimensions.iter().any(|d| {
352+
d.clone().resolve_reference_chain()
353+
== member_node.clone().resolve_reference_chain()
354+
}) {
355+
time_dimensions.push(member_node.clone())
356+
}
341357
}
358+
MemberSymbol::Measure(_) => measures.push(member_node.clone()),
359+
_ => {}
342360
}
343-
MemberSymbol::Measure(_) => measures.push(member_node.clone()),
344-
_ => {}
345361
}
346362

347363
let cte_query_properties = QueryProperties::try_new_from_precompiled(

rust/cubesqlplanner/cubesqlplanner/src/planner/planners/multi_stage/multi_stage_query_planner.rs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,14 @@ impl MultiStageQueryPlanner {
198198
)
199199
}
200200

201+
fn is_multi_stage_dimension(member: &Rc<MemberSymbol>) -> Result<bool, CubeError> {
202+
if member.is_dimension() {
203+
has_multi_stage_members(member, false)
204+
} else {
205+
Ok(false)
206+
}
207+
}
208+
201209
fn default_make_childs(
202210
&self,
203211
member: Rc<MemberSymbol>,
@@ -206,9 +214,11 @@ impl MultiStageQueryPlanner {
206214
descriptions: &mut Vec<Rc<MultiStageQueryDescription>>,
207215
resolved_multi_stage_dimensions: &mut HashSet<String>,
208216
) -> Result<(), CubeError> {
217+
let mut has_inputs = false;
209218
for dep in member.get_dependencies() {
210219
let dep = &dep.resolve_reference_chain();
211-
if dep.is_measure() || dep.is_dimension() {
220+
if dep.is_measure() || Self::is_multi_stage_dimension(dep)? {
221+
has_inputs = true;
212222
let description = self.make_queries_descriptions(
213223
dep.clone(),
214224
new_state.clone(),
@@ -220,6 +230,24 @@ impl MultiStageQueryPlanner {
220230
}
221231
}
222232
}
233+
if !has_inputs {
234+
//Rank and similas cases
235+
236+
let alias = format!("cte_{}", descriptions.len());
237+
let description = MultiStageQueryDescription::new(
238+
MultiStageMember::new_without_member_leaf(
239+
MultiStageMemberType::Leaf(MultiStageLeafMemberType::Measure),
240+
member.clone(),
241+
self.query_properties.ungrouped(),
242+
false,
243+
),
244+
new_state.clone(),
245+
vec![],
246+
alias.clone(),
247+
);
248+
result.push(description.clone());
249+
descriptions.push(description.clone());
250+
}
223251
Ok(())
224252
}
225253

rust/cubesqlplanner/cubesqlplanner/src/planner/query_properties.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -848,12 +848,12 @@ impl QueryProperties {
848848

849849
fn has_multi_stage_dimensions(&self) -> Result<bool, CubeError> {
850850
for dim in self.dimensions.iter() {
851-
if has_multi_stage_members(dim, false)? {
851+
if has_multi_stage_members(dim, true)? {
852852
return Ok(true);
853853
}
854854
}
855855
for dim in self.time_dimensions.iter() {
856-
if has_multi_stage_members(dim, false)? {
856+
if has_multi_stage_members(dim, true)? {
857857
return Ok(true);
858858
}
859859
}

0 commit comments

Comments
 (0)