@@ -838,35 +838,57 @@ impl ExecutionPlan for CubeTableExec {
838838 }
839839
840840 fn output_hints ( & self ) -> OptimizerHints {
841- let sort_order;
842841 if let Some ( snapshot_sort_on) = self . index_snapshot . sort_on ( ) {
843842 // Note that this returns `None` if any of the columns were not found.
844843 // This only happens on programming errors.
845- sort_order = snapshot_sort_on
844+ let sort_order = snapshot_sort_on
846845 . iter ( )
847846 . map ( |c| self . schema . index_of ( & c) . ok ( ) )
848- . collect ( )
847+ . collect ( ) ;
848+ log:: error!( "CubeTableExec output_hints returning sort_order {:?}" , sort_order) ;
849+ OptimizerHints :: new_sorted ( sort_order, Vec :: new ( ) )
849850 } else {
850851 let index = self . index_snapshot . index ( ) . get_row ( ) ;
852+ let mut approximate_sort_order = Vec :: < Vec < usize > > :: new ( ) ;
853+ let mut chunk = Vec :: < usize > :: new ( ) ;
851854 let sort_cols = index
852855 . get_columns ( )
853856 . iter ( )
854857 . take ( index. sort_key_size ( ) as usize )
855- . map ( |sort_col| self . schema . index_of ( & sort_col. get_name ( ) ) . ok ( ) )
856- . take_while ( |i| i. is_some ( ) )
857- . map ( |i| i. unwrap ( ) )
858- . collect_vec ( ) ;
859- if !sort_cols. is_empty ( ) {
860- sort_order = Some ( sort_cols)
858+ . map ( |sort_col| self . schema . index_of ( & sort_col. get_name ( ) ) . ok ( ) ) ;
859+ let mut prefix = true ;
860+ for sort_col in sort_cols {
861+ if let Some ( col) = sort_col {
862+ chunk. push ( col) ;
863+ } else {
864+ if chunk. is_empty ( ) {
865+ prefix &= !approximate_sort_order. is_empty ( ) ;
866+ } else {
867+ approximate_sort_order. push ( chunk) ;
868+ chunk = Vec :: new ( ) ;
869+ }
870+ }
871+ }
872+
873+ if !chunk. is_empty ( ) {
874+ approximate_sort_order. push ( chunk) ;
875+ }
876+
877+ let sort_order = if prefix && !approximate_sort_order. is_empty ( ) {
878+ Some ( approximate_sort_order[ 0 ] . clone ( ) )
861879 } else {
862- sort_order = None
880+ None
881+ } ;
882+ log:: error!( "CubeTableExec output_hints returning approximate sort order {:?} and sort_order {:?}" , approximate_sort_order, sort_order) ;
883+
884+ OptimizerHints {
885+ sort_order,
886+ approximate_sort_order,
887+ approximate_sort_order_is_strict : true ,
888+ approximate_sort_order_is_prefix : prefix,
889+ single_value_columns : Vec :: new ( ) ,
863890 }
864891 }
865-
866- OptimizerHints :: new_sorted (
867- sort_order,
868- Vec :: new ( ) ,
869- )
870892 }
871893
872894 #[ tracing:: instrument( level = "trace" , skip( self ) ) ]
0 commit comments