Skip to content

Commit 81ba359

Browse files
committed
more cases covered in select_distinct_dimensions
1 parent ea0bc0d commit 81ba359

File tree

1 file changed

+55
-6
lines changed
  • rust/cubesql/cubesql/src/compile/rewrite/rules

1 file changed

+55
-6
lines changed

rust/cubesql/cubesql/src/compile/rewrite/rules/members.rs

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ impl RewriteRules for MemberRules {
274274
"?split",
275275
"?can_pushdown_join",
276276
"CubeScanWrapped:false",
277-
"?old_ungrouped",
277+
"?left_ungrouped",
278278
)),
279279
cube_scan(
280280
"?alias_to_cube",
@@ -288,7 +288,12 @@ impl RewriteRules for MemberRules {
288288
"CubeScanWrapped:false",
289289
"CubeScanUngrouped:false",
290290
),
291-
self.select_distinct_dimensions("?members"),
291+
self.select_distinct_dimensions(
292+
"?alias_to_cube",
293+
"?members",
294+
"?filters",
295+
"?left_ungrouped",
296+
),
292297
),
293298
// MOD function to binary expr
294299
transforming_rewrite_with_root(
@@ -1508,19 +1513,39 @@ impl MemberRules {
15081513

15091514
fn select_distinct_dimensions(
15101515
&self,
1516+
alias_to_cube_var: &'static str,
15111517
members_var: &'static str,
1518+
filters_var: &'static str,
1519+
left_ungrouped_var: &'static str,
15121520
) -> impl Fn(&mut CubeEGraph, &mut Subst) -> bool {
1521+
let alias_to_cube_var = var!(alias_to_cube_var);
15131522
let members_var = var!(members_var);
1523+
let filters_var = var!(filters_var);
1524+
let left_ungrouped_var = var!(left_ungrouped_var);
15141525
let meta_context = self.meta_context.clone();
15151526

15161527
move |egraph, subst| {
1517-
egraph
1528+
let empty_filters = &egraph
1529+
.index(subst[filters_var])
1530+
.data
1531+
.is_empty_list
1532+
.unwrap_or(true);
1533+
let ungrouped = var_iter!(egraph[subst[left_ungrouped_var]], CubeScanUngrouped)
1534+
.into_iter()
1535+
.any(|v| *v);
1536+
1537+
if !empty_filters && ungrouped {
1538+
return false;
1539+
}
1540+
1541+
let res = match egraph
15181542
.index(subst[members_var])
15191543
.data
15201544
.member_name_to_expr
15211545
.as_ref()
1522-
.map_or(true, |member_names_to_expr| {
1523-
!member_names_to_expr.list.iter().all(|(_, member, _)| {
1546+
{
1547+
Some(names_to_expr) => {
1548+
names_to_expr.list.iter().all(|(_, member, _)| {
15241549
// we should allow transform for queries with dimensions only,
15251550
// as it doesn't make sense for measures
15261551
if let Some(name) = member.name() {
@@ -1532,7 +1557,31 @@ impl MemberRules {
15321557
true
15331558
}
15341559
})
1535-
})
1560+
}
1561+
None => {
1562+
// this might be the case of `SELECT DISTINCT *`
1563+
// we need to check that there are only dimensions defined in the referenced cube
1564+
let aliases_to_cube: Vec<_> =
1565+
var_iter!(egraph[subst[alias_to_cube_var]], CubeScanAliasToCube)
1566+
.cloned()
1567+
.collect();
1568+
1569+
if let Some(cube_name) = aliases_to_cube
1570+
.first()
1571+
.and_then(|f| f.first().map(|(_, c)| c))
1572+
{
1573+
if let Some(cube) = meta_context.find_cube_with_name(cube_name) {
1574+
cube.measures.len() == 0 && cube.segments.len() == 0
1575+
} else {
1576+
false
1577+
}
1578+
} else {
1579+
false
1580+
}
1581+
}
1582+
};
1583+
1584+
res
15361585
}
15371586
}
15381587

0 commit comments

Comments
 (0)