@@ -26,6 +26,7 @@ use common_planners::col;
26
26
use common_planners:: lit;
27
27
use common_planners:: sub;
28
28
use common_planners:: CreateTablePlan ;
29
+ use common_planners:: Expression ;
29
30
use common_planners:: Extras ;
30
31
use databend_query:: interpreters:: CreateTableInterpreter ;
31
32
use databend_query:: interpreters:: Interpreter ;
@@ -145,49 +146,57 @@ async fn test_block_pruner() -> Result<()> {
145
146
let reader = MetaReaders :: table_snapshot_reader ( ctx. clone ( ) ) ;
146
147
let snapshot = reader. read ( snapshot_loc. as_str ( ) , None , 1 ) . await ?;
147
148
148
- // nothing will be pruned
149
- let push_downs = None ;
150
- let blocks = apply_block_pruning (
151
- snapshot. clone ( ) ,
152
- table. get_table_info ( ) . schema ( ) ,
153
- & push_downs,
154
- ctx. clone ( ) ,
155
- )
156
- . await ?;
157
- let rows = blocks. iter ( ) . map ( |b| b. row_count as usize ) . sum :: < usize > ( ) ;
158
- assert_eq ! ( rows, num_blocks * row_per_block) ;
159
- assert_eq ! ( num_blocks, blocks. len( ) ) ;
160
-
161
- // fully pruned
162
- let mut extra = Extras :: default ( ) ;
163
- // max value of col a is
164
- let pred = col ( "a" ) . gt ( lit ( 30u64 ) ) ;
165
- extra. filters = vec ! [ pred] ;
166
-
167
- let blocks = apply_block_pruning (
168
- snapshot. clone ( ) ,
169
- table. get_table_info ( ) . schema ( ) ,
170
- & Some ( extra) ,
171
- ctx. clone ( ) ,
172
- )
173
- . await ?;
174
- assert_eq ! ( 0 , blocks. len( ) ) ;
149
+ // nothing is pruned
150
+ let mut e1 = Extras :: default ( ) ;
151
+ e1. filters = vec ! [ col( "a" ) . gt( lit( 30u64 ) ) ] ;
175
152
176
153
// some blocks pruned
177
- let mut extra = Extras :: default ( ) ;
154
+ let mut e2 = Extras :: default ( ) ;
178
155
let max_val_of_b = 6u64 ;
179
- let pred = col ( "a" ) . gt ( lit ( 0u64 ) ) . and ( col ( "b" ) . gt ( lit ( max_val_of_b) ) ) ;
180
- extra. filters = vec ! [ pred] ;
156
+ e2. filters = vec ! [ col( "a" ) . gt( lit( 0u64 ) ) . and( col( "b" ) . gt( lit( max_val_of_b) ) ) ] ;
157
+ let b2 = num_blocks - max_val_of_b as usize - 1 ;
158
+
159
+ // Sort asc Limit
160
+ let mut e3 = Extras :: default ( ) ;
161
+ e3. order_by = vec ! [ Expression :: Sort {
162
+ expr: Box :: new( col( "b" ) ) ,
163
+ asc: true ,
164
+ nulls_first: false ,
165
+ origin_expr: Box :: new( col( "b" ) ) ,
166
+ } ] ;
167
+ e3. limit = Some ( 3 ) ;
168
+
169
+ // Sort desc Limit
170
+ let mut e4 = Extras :: default ( ) ;
171
+ e4. order_by = vec ! [ Expression :: Sort {
172
+ expr: Box :: new( col( "b" ) ) ,
173
+ asc: false ,
174
+ nulls_first: false ,
175
+ origin_expr: Box :: new( col( "b" ) ) ,
176
+ } ] ;
177
+ e4. limit = Some ( 3 ) ;
178
+
179
+ let extras = vec ! [
180
+ ( None , num_blocks, num_blocks * row_per_block) ,
181
+ ( Some ( e1) , 0 , 0 ) ,
182
+ ( Some ( e2) , b2, b2 * row_per_block) ,
183
+ ( Some ( e3) , 3 , 3 * row_per_block) ,
184
+ ( Some ( e4) , 4 , 4 * row_per_block) ,
185
+ ] ;
181
186
182
- let blocks = apply_block_pruning (
183
- snapshot. clone ( ) ,
184
- table. get_table_info ( ) . schema ( ) ,
185
- & Some ( extra) ,
186
- ctx. clone ( ) ,
187
- )
188
- . await ?;
187
+ for ( extra, expected_blocks, expected_rows) in extras {
188
+ let blocks = apply_block_pruning (
189
+ snapshot. clone ( ) ,
190
+ table. get_table_info ( ) . schema ( ) ,
191
+ & extra,
192
+ ctx. clone ( ) ,
193
+ )
194
+ . await ?;
189
195
190
- assert_eq ! ( ( num_blocks - max_val_of_b as usize - 1 ) , blocks. len( ) ) ;
196
+ let rows = blocks. iter ( ) . map ( |b| b. row_count as usize ) . sum :: < usize > ( ) ;
197
+ assert_eq ! ( expected_rows, rows) ;
198
+ assert_eq ! ( expected_blocks, blocks. len( ) ) ;
199
+ }
191
200
192
201
Ok ( ( ) )
193
202
}
0 commit comments