@@ -25,6 +25,8 @@ use std::vec;
25
25
use arrow:: array:: RecordBatch ;
26
26
use arrow:: csv:: WriterBuilder ;
27
27
use datafusion:: physical_expr_functions_aggregate:: aggregate:: AggregateExprBuilder ;
28
+ use datafusion_functions_aggregate:: approx_percentile_cont:: approx_percentile_cont_udaf;
29
+ use datafusion_functions_aggregate:: array_agg:: array_agg_udaf;
28
30
use datafusion_functions_aggregate:: min_max:: max_udaf;
29
31
use prost:: Message ;
30
32
@@ -412,6 +414,70 @@ fn rountrip_aggregate_with_limit() -> Result<()> {
412
414
roundtrip_test ( Arc :: new ( agg) )
413
415
}
414
416
417
+ #[ test]
418
+ fn rountrip_aggregate_with_approx_pencentile_cont ( ) -> Result < ( ) > {
419
+ let field_a = Field :: new ( "a" , DataType :: Int64 , false ) ;
420
+ let field_b = Field :: new ( "b" , DataType :: Int64 , false ) ;
421
+ let schema = Arc :: new ( Schema :: new ( vec ! [ field_a, field_b] ) ) ;
422
+
423
+ let groups: Vec < ( Arc < dyn PhysicalExpr > , String ) > =
424
+ vec ! [ ( col( "a" , & schema) ?, "unused" . to_string( ) ) ] ;
425
+
426
+ let aggregates: Vec < Arc < dyn AggregateExpr > > = vec ! [ AggregateExprBuilder :: new(
427
+ approx_percentile_cont_udaf( ) ,
428
+ vec![ col( "b" , & schema) ?, lit( 0.5 ) ] ,
429
+ )
430
+ . schema( Arc :: clone( & schema) )
431
+ . alias( "APPROX_PERCENTILE_CONT(b, 0.5)" )
432
+ . build( ) ?] ;
433
+
434
+ let agg = AggregateExec :: try_new (
435
+ AggregateMode :: Final ,
436
+ PhysicalGroupBy :: new_single ( groups. clone ( ) ) ,
437
+ aggregates. clone ( ) ,
438
+ vec ! [ None ] ,
439
+ Arc :: new ( EmptyExec :: new ( schema. clone ( ) ) ) ,
440
+ schema,
441
+ ) ?;
442
+ roundtrip_test ( Arc :: new ( agg) )
443
+ }
444
+
445
+ #[ test]
446
+ fn rountrip_aggregate_with_sort ( ) -> Result < ( ) > {
447
+ let field_a = Field :: new ( "a" , DataType :: Int64 , false ) ;
448
+ let field_b = Field :: new ( "b" , DataType :: Int64 , false ) ;
449
+ let schema = Arc :: new ( Schema :: new ( vec ! [ field_a, field_b] ) ) ;
450
+
451
+ let groups: Vec < ( Arc < dyn PhysicalExpr > , String ) > =
452
+ vec ! [ ( col( "a" , & schema) ?, "unused" . to_string( ) ) ] ;
453
+ let sort_exprs = vec ! [ PhysicalSortExpr {
454
+ expr: col( "b" , & schema) ?,
455
+ options: SortOptions {
456
+ descending: false ,
457
+ nulls_first: true ,
458
+ } ,
459
+ } ] ;
460
+
461
+ let aggregates: Vec < Arc < dyn AggregateExpr > > =
462
+ vec ! [
463
+ AggregateExprBuilder :: new( array_agg_udaf( ) , vec![ col( "b" , & schema) ?] )
464
+ . schema( Arc :: clone( & schema) )
465
+ . alias( "ARRAY_AGG(b)" )
466
+ . order_by( sort_exprs)
467
+ . build( ) ?,
468
+ ] ;
469
+
470
+ let agg = AggregateExec :: try_new (
471
+ AggregateMode :: Final ,
472
+ PhysicalGroupBy :: new_single ( groups. clone ( ) ) ,
473
+ aggregates. clone ( ) ,
474
+ vec ! [ None ] ,
475
+ Arc :: new ( EmptyExec :: new ( schema. clone ( ) ) ) ,
476
+ schema,
477
+ ) ?;
478
+ roundtrip_test ( Arc :: new ( agg) )
479
+ }
480
+
415
481
#[ test]
416
482
fn roundtrip_aggregate_udaf ( ) -> Result < ( ) > {
417
483
let field_a = Field :: new ( "a" , DataType :: Int64 , false ) ;
0 commit comments