@@ -33,7 +33,7 @@ use arrow::datatypes::{DataType, Field};
33
33
use arrow_array:: cast:: AsArray ;
34
34
use arrow_array:: { new_empty_array, Array , ArrayRef , StructArray } ;
35
35
use arrow_schema:: Fields ;
36
- use datafusion_common:: utils:: { array_into_list_array , get_row_at_idx} ;
36
+ use datafusion_common:: utils:: { array_into_list_array_nullable , get_row_at_idx} ;
37
37
use datafusion_common:: { exec_err, Result , ScalarValue } ;
38
38
use datafusion_expr:: utils:: AggregateOrderSensitivity ;
39
39
use datafusion_expr:: Accumulator ;
@@ -50,8 +50,6 @@ pub struct OrderSensitiveArrayAgg {
50
50
input_data_type : DataType ,
51
51
/// The input expression
52
52
expr : Arc < dyn PhysicalExpr > ,
53
- /// If the input expression can have `NULL`s
54
- nullable : bool ,
55
53
/// Ordering data types
56
54
order_by_data_types : Vec < DataType > ,
57
55
/// Ordering requirement
@@ -66,15 +64,13 @@ impl OrderSensitiveArrayAgg {
66
64
expr : Arc < dyn PhysicalExpr > ,
67
65
name : impl Into < String > ,
68
66
input_data_type : DataType ,
69
- nullable : bool ,
70
67
order_by_data_types : Vec < DataType > ,
71
68
ordering_req : LexOrdering ,
72
69
) -> Self {
73
70
Self {
74
71
name : name. into ( ) ,
75
72
input_data_type,
76
73
expr,
77
- nullable,
78
74
order_by_data_types,
79
75
ordering_req,
80
76
reverse : false ,
@@ -90,8 +86,8 @@ impl AggregateExpr for OrderSensitiveArrayAgg {
90
86
fn field ( & self ) -> Result < Field > {
91
87
Ok ( Field :: new_list (
92
88
& self . name ,
93
- // This should be the same as return type of AggregateFunction::ArrayAgg
94
- Field :: new ( "item" , self . input_data_type . clone ( ) , self . nullable ) ,
89
+ // This should be the same as return type of AggregateFunction::OrderSensitiveArrayAgg
90
+ Field :: new ( "item" , self . input_data_type . clone ( ) , true ) ,
95
91
true ,
96
92
) )
97
93
}
@@ -102,25 +98,20 @@ impl AggregateExpr for OrderSensitiveArrayAgg {
102
98
& self . order_by_data_types ,
103
99
self . ordering_req . clone ( ) ,
104
100
self . reverse ,
105
- self . nullable ,
106
101
)
107
102
. map ( |acc| Box :: new ( acc) as _ )
108
103
}
109
104
110
105
fn state_fields ( & self ) -> Result < Vec < Field > > {
111
106
let mut fields = vec ! [ Field :: new_list(
112
107
format_state_name( & self . name, "array_agg" ) ,
113
- Field :: new( "item" , self . input_data_type. clone( ) , self . nullable ) ,
108
+ Field :: new( "item" , self . input_data_type. clone( ) , true ) ,
114
109
true , // This should be the same as field()
115
110
) ] ;
116
111
let orderings = ordering_fields ( & self . ordering_req , & self . order_by_data_types ) ;
117
112
fields. push ( Field :: new_list (
118
113
format_state_name ( & self . name , "array_agg_orderings" ) ,
119
- Field :: new (
120
- "item" ,
121
- DataType :: Struct ( Fields :: from ( orderings) ) ,
122
- self . nullable ,
123
- ) ,
114
+ Field :: new ( "item" , DataType :: Struct ( Fields :: from ( orderings) ) , true ) ,
124
115
false ,
125
116
) ) ;
126
117
Ok ( fields)
@@ -147,7 +138,6 @@ impl AggregateExpr for OrderSensitiveArrayAgg {
147
138
name : self . name . to_string ( ) ,
148
139
input_data_type : self . input_data_type . clone ( ) ,
149
140
expr : Arc :: clone ( & self . expr ) ,
150
- nullable : self . nullable ,
151
141
order_by_data_types : self . order_by_data_types . clone ( ) ,
152
142
// Reverse requirement:
153
143
ordering_req : reverse_order_bys ( & self . ordering_req ) ,
@@ -186,8 +176,6 @@ pub(crate) struct OrderSensitiveArrayAggAccumulator {
186
176
ordering_req : LexOrdering ,
187
177
/// Whether the aggregation is running in reverse.
188
178
reverse : bool ,
189
- /// Whether the input expr is nullable
190
- nullable : bool ,
191
179
}
192
180
193
181
impl OrderSensitiveArrayAggAccumulator {
@@ -198,7 +186,6 @@ impl OrderSensitiveArrayAggAccumulator {
198
186
ordering_dtypes : & [ DataType ] ,
199
187
ordering_req : LexOrdering ,
200
188
reverse : bool ,
201
- nullable : bool ,
202
189
) -> Result < Self > {
203
190
let mut datatypes = vec ! [ datatype. clone( ) ] ;
204
191
datatypes. extend ( ordering_dtypes. iter ( ) . cloned ( ) ) ;
@@ -208,7 +195,6 @@ impl OrderSensitiveArrayAggAccumulator {
208
195
datatypes,
209
196
ordering_req,
210
197
reverse,
211
- nullable,
212
198
} )
213
199
}
214
200
}
@@ -312,7 +298,7 @@ impl Accumulator for OrderSensitiveArrayAggAccumulator {
312
298
if self . values . is_empty ( ) {
313
299
return Ok ( ScalarValue :: new_null_list (
314
300
self . datatypes [ 0 ] . clone ( ) ,
315
- self . nullable ,
301
+ true ,
316
302
1 ,
317
303
) ) ;
318
304
}
@@ -322,14 +308,10 @@ impl Accumulator for OrderSensitiveArrayAggAccumulator {
322
308
ScalarValue :: new_list_from_iter (
323
309
values. into_iter ( ) . rev ( ) ,
324
310
& self . datatypes [ 0 ] ,
325
- self . nullable ,
311
+ true ,
326
312
)
327
313
} else {
328
- ScalarValue :: new_list_from_iter (
329
- values. into_iter ( ) ,
330
- & self . datatypes [ 0 ] ,
331
- self . nullable ,
332
- )
314
+ ScalarValue :: new_list_from_iter ( values. into_iter ( ) , & self . datatypes [ 0 ] , true )
333
315
} ;
334
316
Ok ( ScalarValue :: List ( array) )
335
317
}
@@ -385,9 +367,8 @@ impl OrderSensitiveArrayAggAccumulator {
385
367
column_wise_ordering_values,
386
368
None ,
387
369
) ?;
388
- Ok ( ScalarValue :: List ( Arc :: new ( array_into_list_array (
370
+ Ok ( ScalarValue :: List ( Arc :: new ( array_into_list_array_nullable (
389
371
Arc :: new ( ordering_array) ,
390
- self . nullable ,
391
372
) ) ) )
392
373
}
393
374
}
0 commit comments