@@ -51,12 +51,12 @@ use crate::spillers::SpillerType;
51
51
52
52
impl PipelineBuilder {
53
53
pub ( crate ) fn build_sort ( & mut self , sort : & Sort ) -> Result < ( ) > {
54
- let plan_schema = sort. output_schema ( ) ?;
54
+ let output_schema = sort. output_schema ( ) ?;
55
55
let sort_desc = sort
56
56
. order_by
57
57
. iter ( )
58
58
. map ( |desc| {
59
- let offset = plan_schema . index_of ( & desc. order_by . to_string ( ) ) ?;
59
+ let offset = output_schema . index_of ( & desc. order_by . to_string ( ) ) ?;
60
60
Ok ( SortColumnDescription {
61
61
offset,
62
62
asc : desc. asc ,
@@ -103,7 +103,7 @@ impl PipelineBuilder {
103
103
104
104
let builder = SortPipelineBuilder :: create (
105
105
self . ctx . clone ( ) ,
106
- plan_schema ,
106
+ output_schema ,
107
107
sort_desc,
108
108
sort. broadcast_id ,
109
109
) ?
@@ -155,7 +155,9 @@ impl PipelineBuilder {
155
155
self . build_pipeline ( & sort. input ) ?;
156
156
}
157
157
158
- builder. build_bounded_merge_sort ( & mut self . main_pipeline )
158
+ builder
159
+ . remove_order_col_at_last ( )
160
+ . build_bounded_merge_sort ( & mut self . main_pipeline )
159
161
}
160
162
SortStep :: Route => TransformSortBuilder :: add_route ( & mut self . main_pipeline ) ,
161
163
}
@@ -164,7 +166,7 @@ impl PipelineBuilder {
164
166
165
167
pub struct SortPipelineBuilder {
166
168
ctx : Arc < QueryContext > ,
167
- schema : DataSchemaRef ,
169
+ output_schema : DataSchemaRef ,
168
170
sort_desc : Arc < [ SortColumnDescription ] > ,
169
171
limit : Option < usize > ,
170
172
block_size : usize ,
@@ -176,7 +178,7 @@ pub struct SortPipelineBuilder {
176
178
impl SortPipelineBuilder {
177
179
pub fn create (
178
180
ctx : Arc < QueryContext > ,
179
- schema : DataSchemaRef ,
181
+ output_schema : DataSchemaRef ,
180
182
sort_desc : Arc < [ SortColumnDescription ] > ,
181
183
broadcast_id : Option < u32 > ,
182
184
) -> Result < Self > {
@@ -185,7 +187,7 @@ impl SortPipelineBuilder {
185
187
let enable_loser_tree = settings. get_enable_loser_tree_merge_sort ( ) ?;
186
188
Ok ( Self {
187
189
ctx,
188
- schema ,
190
+ output_schema ,
189
191
sort_desc,
190
192
limit : None ,
191
193
block_size,
@@ -223,65 +225,6 @@ impl SortPipelineBuilder {
223
225
self . build_merge_sort_pipeline ( pipeline, false )
224
226
}
225
227
226
- fn build_sample ( self , pipeline : & mut Pipeline ) -> Result < ( ) > {
227
- let settings = self . ctx . get_settings ( ) ;
228
- let max_block_size = settings. get_max_block_size ( ) ? as usize ;
229
-
230
- // Partial sort
231
- pipeline. add_transformer ( || {
232
- TransformSortPartial :: new (
233
- LimitType :: from_limit_rows ( self . limit ) ,
234
- self . sort_desc . clone ( ) ,
235
- )
236
- } ) ;
237
-
238
- let spiller = {
239
- let location_prefix = self . ctx . query_id_spill_prefix ( ) ;
240
- let config = SpillerConfig {
241
- spiller_type : SpillerType :: OrderBy ,
242
- location_prefix,
243
- disk_spill : None ,
244
- use_parquet : settings. get_spilling_file_format ( ) ?. is_parquet ( ) ,
245
- } ;
246
- let op = DataOperator :: instance ( ) . spill_operator ( ) ;
247
- Arc :: new ( Spiller :: create ( self . ctx . clone ( ) , op, config) ?)
248
- } ;
249
-
250
- let memory_settings = MemorySettings :: from_sort_settings ( & self . ctx ) ?;
251
- let enable_loser_tree = settings. get_enable_loser_tree_merge_sort ( ) ?;
252
-
253
- let builder =
254
- TransformSortBuilder :: new ( self . schema . clone ( ) , self . sort_desc . clone ( ) , max_block_size)
255
- . with_spiller ( spiller)
256
- . with_limit ( self . limit )
257
- . with_order_column ( false , true )
258
- . with_memory_settings ( memory_settings)
259
- . with_enable_loser_tree ( enable_loser_tree) ;
260
-
261
- pipeline. add_transform ( |input, output| {
262
- Ok ( ProcessorPtr :: create ( builder. build_collect ( input, output) ?) )
263
- } ) ?;
264
-
265
- builder. add_bound_broadcast (
266
- pipeline,
267
- max_block_size,
268
- self . ctx . clone ( ) ,
269
- self . broadcast_id . unwrap ( ) ,
270
- ) ?;
271
-
272
- pipeline. add_transform ( |input, output| {
273
- Ok ( ProcessorPtr :: create ( builder. build_restore ( input, output) ?) )
274
- } ) ?;
275
-
276
- pipeline. add_transform ( |input, output| {
277
- Ok ( ProcessorPtr :: create (
278
- builder. build_bound_edge ( input, output) ?,
279
- ) )
280
- } ) ?;
281
-
282
- Ok ( ( ) )
283
- }
284
-
285
228
fn build_merge_sort ( & self , pipeline : & mut Pipeline , order_col_generated : bool ) -> Result < ( ) > {
286
229
// Merge sort
287
230
let need_multi_merge = pipeline. output_len ( ) > 1 ;
@@ -293,8 +236,8 @@ impl SortPipelineBuilder {
293
236
294
237
let memory_settings = MemorySettings :: from_sort_settings ( & self . ctx ) ?;
295
238
let sort_merge_output_schema = match output_order_col {
296
- true => add_order_field ( self . schema . clone ( ) , & self . sort_desc ) ,
297
- false => self . schema . clone ( ) ,
239
+ true => add_order_field ( self . output_schema . clone ( ) , & self . sort_desc ) ,
240
+ false => self . output_schema . clone ( ) ,
298
241
} ;
299
242
300
243
let settings = self . ctx . get_settings ( ) ;
@@ -336,7 +279,7 @@ impl SortPipelineBuilder {
336
279
} )
337
280
}
338
281
339
- pub fn build_merge_sort_pipeline (
282
+ fn build_merge_sort_pipeline (
340
283
self ,
341
284
pipeline : & mut Pipeline ,
342
285
order_col_generated : bool ,
@@ -358,7 +301,7 @@ impl SortPipelineBuilder {
358
301
let max_threads = settings. get_max_threads ( ) ? as usize ;
359
302
add_k_way_merge_sort (
360
303
pipeline,
361
- self . schema . clone ( ) ,
304
+ self . output_schema . clone ( ) ,
362
305
max_threads,
363
306
self . block_size ,
364
307
self . limit ,
@@ -369,7 +312,7 @@ impl SortPipelineBuilder {
369
312
} else {
370
313
try_add_multi_sort_merge (
371
314
pipeline,
372
- self . schema . clone ( ) ,
315
+ self . output_schema . clone ( ) ,
373
316
self . block_size ,
374
317
self . limit ,
375
318
self . sort_desc ,
@@ -379,12 +322,77 @@ impl SortPipelineBuilder {
379
322
}
380
323
}
381
324
382
- pub fn build_bounded_merge_sort ( self , pipeline : & mut Pipeline ) -> Result < ( ) > {
383
- let builder =
384
- TransformSortBuilder :: new ( self . schema . clone ( ) , self . sort_desc . clone ( ) , self . block_size )
385
- . with_limit ( self . limit )
386
- . with_order_column ( true , !self . remove_order_col_at_last )
387
- . with_enable_loser_tree ( self . enable_loser_tree ) ;
325
+ fn build_sample ( self , pipeline : & mut Pipeline ) -> Result < ( ) > {
326
+ let settings = self . ctx . get_settings ( ) ;
327
+ let max_block_size = settings. get_max_block_size ( ) ? as usize ;
328
+
329
+ // Partial sort
330
+ pipeline. add_transformer ( || {
331
+ TransformSortPartial :: new (
332
+ LimitType :: from_limit_rows ( self . limit ) ,
333
+ self . sort_desc . clone ( ) ,
334
+ )
335
+ } ) ;
336
+
337
+ let spiller = {
338
+ let location_prefix = self . ctx . query_id_spill_prefix ( ) ;
339
+ let config = SpillerConfig {
340
+ spiller_type : SpillerType :: OrderBy ,
341
+ location_prefix,
342
+ disk_spill : None ,
343
+ use_parquet : settings. get_spilling_file_format ( ) ?. is_parquet ( ) ,
344
+ } ;
345
+ let op = DataOperator :: instance ( ) . spill_operator ( ) ;
346
+ Arc :: new ( Spiller :: create ( self . ctx . clone ( ) , op, config) ?)
347
+ } ;
348
+
349
+ let memory_settings = MemorySettings :: from_sort_settings ( & self . ctx ) ?;
350
+ let enable_loser_tree = settings. get_enable_loser_tree_merge_sort ( ) ?;
351
+
352
+ let builder = TransformSortBuilder :: new (
353
+ self . output_schema . clone ( ) ,
354
+ self . sort_desc . clone ( ) ,
355
+ max_block_size,
356
+ )
357
+ . with_spiller ( spiller)
358
+ . with_limit ( self . limit )
359
+ . with_order_column ( false , true )
360
+ . with_memory_settings ( memory_settings)
361
+ . with_enable_loser_tree ( enable_loser_tree) ;
362
+
363
+ pipeline. add_transform ( |input, output| {
364
+ Ok ( ProcessorPtr :: create ( builder. build_collect ( input, output) ?) )
365
+ } ) ?;
366
+
367
+ builder. add_bound_broadcast (
368
+ pipeline,
369
+ max_block_size,
370
+ self . ctx . clone ( ) ,
371
+ self . broadcast_id . unwrap ( ) ,
372
+ ) ?;
373
+
374
+ pipeline. add_transform ( |input, output| {
375
+ Ok ( ProcessorPtr :: create ( builder. build_restore ( input, output) ?) )
376
+ } ) ?;
377
+
378
+ pipeline. add_transform ( |input, output| {
379
+ Ok ( ProcessorPtr :: create (
380
+ builder. build_bound_edge ( input, output) ?,
381
+ ) )
382
+ } ) ?;
383
+
384
+ Ok ( ( ) )
385
+ }
386
+
387
+ fn build_bounded_merge_sort ( self , pipeline : & mut Pipeline ) -> Result < ( ) > {
388
+ let builder = TransformSortBuilder :: new (
389
+ self . output_schema . clone ( ) ,
390
+ self . sort_desc . clone ( ) ,
391
+ self . block_size ,
392
+ )
393
+ . with_limit ( self . limit )
394
+ . with_order_column ( true , !self . remove_order_col_at_last )
395
+ . with_enable_loser_tree ( self . enable_loser_tree ) ;
388
396
389
397
let inputs_port: Vec < _ > = ( 0 ..pipeline. output_len ( ) )
390
398
. map ( |_| InputPort :: create ( ) )
0 commit comments