@@ -2589,4 +2589,128 @@ mod tests {
25892589
25902590 Ok ( ( ) )
25912591 }
2592+
2593+ #[ test]
2594+ fn distinct_array_agg_utf8_deduplicates ( ) -> Result < ( ) > {
2595+ use arrow:: array:: StringArray ;
2596+
2597+ // 7 rows with 4 distinct values, each duplicate appearing twice.
2598+ let input: ArrayRef = Arc :: new ( StringArray :: from ( vec ! [
2599+ "postgres" , "mysql" , "postgres" , "redis" , "mysql" , "duckdb" , "redis" ,
2600+ ] ) ) ;
2601+
2602+ let mut acc = DistinctArrayAggAccumulator :: try_new ( & DataType :: Utf8 , None , false ) ?;
2603+ acc. update_batch ( & [ input] ) ?;
2604+
2605+ let result = acc. evaluate ( ) ?;
2606+ let ScalarValue :: List ( arr) = & result else {
2607+ panic ! ( "expected ScalarValue::List, got {result:?}" ) ;
2608+ } ;
2609+
2610+ let inner = arr. value ( 0 ) ;
2611+ let strings = inner
2612+ . as_any ( )
2613+ . downcast_ref :: < StringArray > ( )
2614+ . expect ( "inner array should be StringArray" ) ;
2615+
2616+ // HashSet ordering is nondeterministic — sort before asserting.
2617+ let mut values: Vec < & str > =
2618+ ( 0 ..strings. len ( ) ) . map ( |i| strings. value ( i) ) . collect ( ) ;
2619+ values. sort_unstable ( ) ;
2620+
2621+ assert_eq ! ( values, vec![ "duckdb" , "mysql" , "postgres" , "redis" ] ) ;
2622+ Ok ( ( ) )
2623+ }
2624+
2625+ #[ test]
2626+ fn distinct_array_agg_int64_deduplicates ( ) -> Result < ( ) > {
2627+ use arrow:: array:: Int64Array ;
2628+
2629+ // 7 rows with 4 distinct values, each duplicate appearing twice.
2630+ let input: ArrayRef = Arc :: new ( Int64Array :: from ( vec ! [ 1i64 , 2 , 1 , 3 , 2 , 4 , 3 ] ) ) ;
2631+
2632+ let mut acc =
2633+ DistinctArrayAggAccumulator :: try_new ( & DataType :: Int64 , None , false ) ?;
2634+ acc. update_batch ( & [ input] ) ?;
2635+
2636+ let result = acc. evaluate ( ) ?;
2637+ let ScalarValue :: List ( arr) = & result else {
2638+ panic ! ( "expected ScalarValue::List, got {result:?}" ) ;
2639+ } ;
2640+
2641+ let inner = arr. value ( 0 ) ;
2642+ let ints = inner
2643+ . as_any ( )
2644+ . downcast_ref :: < Int64Array > ( )
2645+ . expect ( "inner array should be Int64Array" ) ;
2646+
2647+ let mut values: Vec < i64 > = ( 0 ..ints. len ( ) ) . map ( |i| ints. value ( i) ) . collect ( ) ;
2648+ values. sort_unstable ( ) ;
2649+
2650+ assert_eq ! ( values, vec![ 1i64 , 2 , 3 , 4 ] ) ;
2651+ Ok ( ( ) )
2652+ }
2653+
2654+ #[ test]
2655+ fn distinct_array_agg_float64_deduplicates ( ) -> Result < ( ) > {
2656+ use arrow:: array:: Float64Array ;
2657+
2658+ // 7 rows with 4 distinct values, each duplicate appearing twice.
2659+ let input: ArrayRef = Arc :: new ( Float64Array :: from ( vec ! [
2660+ 1.0f64 , 2.5 , 1.0 , 3.75 , 2.5 , 4.0 , 3.75 ,
2661+ ] ) ) ;
2662+
2663+ let mut acc =
2664+ DistinctArrayAggAccumulator :: try_new ( & DataType :: Float64 , None , false ) ?;
2665+ acc. update_batch ( & [ input] ) ?;
2666+
2667+ let result = acc. evaluate ( ) ?;
2668+ let ScalarValue :: List ( arr) = & result else {
2669+ panic ! ( "expected ScalarValue::List, got {result:?}" ) ;
2670+ } ;
2671+
2672+ let inner = arr. value ( 0 ) ;
2673+ let floats = inner
2674+ . as_any ( )
2675+ . downcast_ref :: < Float64Array > ( )
2676+ . expect ( "inner array should be Float64Array" ) ;
2677+
2678+ // f64 has no Ord — use total_cmp for a stable sort.
2679+ let mut values: Vec < f64 > = ( 0 ..floats. len ( ) ) . map ( |i| floats. value ( i) ) . collect ( ) ;
2680+ values. sort_unstable_by ( |a, b| a. total_cmp ( b) ) ;
2681+
2682+ assert_eq ! ( values, vec![ 1.0f64 , 2.5 , 3.75 , 4.0 ] ) ;
2683+ Ok ( ( ) )
2684+ }
2685+
2686+ #[ test]
2687+ fn distinct_array_agg_date32_deduplicates ( ) -> Result < ( ) > {
2688+ use arrow:: array:: Date32Array ;
2689+
2690+ // 7 rows with 4 distinct dates (days since epoch), each duplicate appearing twice.
2691+ let input: ArrayRef = Arc :: new ( Date32Array :: from ( vec ! [
2692+ 100i32 , 200 , 100 , 300 , 200 , 400 , 300 ,
2693+ ] ) ) ;
2694+
2695+ let mut acc =
2696+ DistinctArrayAggAccumulator :: try_new ( & DataType :: Date32 , None , false ) ?;
2697+ acc. update_batch ( & [ input] ) ?;
2698+
2699+ let result = acc. evaluate ( ) ?;
2700+ let ScalarValue :: List ( arr) = & result else {
2701+ panic ! ( "expected ScalarValue::List, got {result:?}" ) ;
2702+ } ;
2703+
2704+ let inner = arr. value ( 0 ) ;
2705+ let dates = inner
2706+ . as_any ( )
2707+ . downcast_ref :: < Date32Array > ( )
2708+ . expect ( "inner array should be Date32Array" ) ;
2709+
2710+ let mut values: Vec < i32 > = ( 0 ..dates. len ( ) ) . map ( |i| dates. value ( i) ) . collect ( ) ;
2711+ values. sort_unstable ( ) ;
2712+
2713+ assert_eq ! ( values, vec![ 100i32 , 200 , 300 , 400 ] ) ;
2714+ Ok ( ( ) )
2715+ }
25922716}
0 commit comments