@@ -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