@@ -23,9 +23,9 @@ use crate::{
2323 LimitFetch , LimitSkip , ListType , LiteralExprValue , LiteralMemberRelation ,
2424 LiteralMemberValue , LogicalPlanLanguage , MeasureName , MemberErrorAliasToCube ,
2525 MemberErrorError , MemberErrorPriority , MemberPushdownReplacerAliasToCube ,
26- MemberReplacerAliasToCube , ProjectionAlias , SegmentName , TableScanSourceTableName ,
27- TableScanTableName , TimeDimensionDateRange , TimeDimensionGranularity , TimeDimensionName ,
28- VirtualFieldCube , VirtualFieldName ,
26+ MemberReplacerAliasToCube , ProjectionAlias , SegmentName , TableScanFetch ,
27+ TableScanProjection , TableScanSourceTableName , TableScanTableName , TimeDimensionDateRange ,
28+ TimeDimensionGranularity , TimeDimensionName , VirtualFieldCube , VirtualFieldName ,
2929 } ,
3030 config:: ConfigObj ,
3131 transport:: { MetaContext , V1CubeMetaDimensionExt , V1CubeMetaExt , V1CubeMetaMeasureExt } ,
@@ -81,6 +81,9 @@ impl RewriteRules for MemberRules {
8181 self . transform_table_scan(
8282 "?source_table_name" ,
8383 "?table_name" ,
84+ "?projection" ,
85+ "?filters" ,
86+ "?fetch" ,
8487 "?alias_to_cube" ,
8588 "?cube_scan_members" ,
8689 ) ,
@@ -1135,15 +1138,49 @@ impl MemberRules {
11351138 & self ,
11361139 source_table_name_var : & ' static str ,
11371140 table_name_var : & ' static str ,
1141+ table_scan_projection_var : & ' static str ,
1142+ table_scan_filters_var : & ' static str ,
1143+ table_scan_fetch_var : & ' static str ,
11381144 alias_to_cube_var : & ' static str ,
11391145 cube_scan_members_var : & ' static str ,
11401146 ) -> impl Fn ( & mut CubeEGraph , & mut Subst ) -> bool {
11411147 let source_table_name_var = var ! ( source_table_name_var) ;
11421148 let table_name_var = var ! ( table_name_var) ;
1149+ let table_scan_projection_var = var ! ( table_scan_projection_var) ;
1150+ let table_scan_filters_var = var ! ( table_scan_filters_var) ;
1151+ let table_scan_fetch_var = var ! ( table_scan_fetch_var) ;
11431152 let alias_to_cube_var = var ! ( alias_to_cube_var) ;
11441153 let cube_scan_members_var = var ! ( cube_scan_members_var) ;
11451154 let meta_context = self . meta_context . clone ( ) ;
11461155 move |egraph, subst| {
1156+ for table_projection in var_iter ! (
1157+ egraph[ subst[ table_scan_projection_var] ] ,
1158+ TableScanProjection
1159+ ) {
1160+ if table_projection. is_some ( ) {
1161+ // This rule always inserts AllMembersCube, so it does not support projection in TableScan
1162+ // TODO support this and enable "push projection to scan" optimizer from DF, it should help many CubeScans without members
1163+ return false ;
1164+ }
1165+ }
1166+
1167+ for table_filters in
1168+ var_list_iter ! ( egraph[ subst[ table_scan_filters_var] ] , TableScanFilters )
1169+ {
1170+ if !table_filters. is_empty ( ) {
1171+ // This rule always inserts empty filters, so it does not support filters in TableScan
1172+ return false ;
1173+ }
1174+ }
1175+
1176+ for table_fetch in var_iter ! ( egraph[ subst[ table_scan_fetch_var] ] , TableScanFetch ) {
1177+ if table_fetch. is_some ( ) {
1178+ // This rule always inserts limit:None, so it does not support fetch in TableScan
1179+ // TODO support this
1180+ return false ;
1181+ }
1182+ }
1183+
11471184 for name in var_iter ! (
11481185 egraph[ subst[ source_table_name_var] ] ,
11491186 TableScanSourceTableName
0 commit comments