1818//! [`ScalarUDFImpl`] definitions for array_sort function.
1919
2020use crate :: utils:: make_scalar_function;
21- use arrow:: array:: {
22- Array , ArrayRef , GenericListArray , NullBufferBuilder , OffsetSizeTrait , new_null_array,
23- } ;
21+ use arrow:: array:: { Array , ArrayRef , GenericListArray , OffsetSizeTrait , new_null_array} ;
2422use arrow:: buffer:: OffsetBuffer ;
2523use arrow:: compute:: SortColumn ;
2624use arrow:: datatypes:: { DataType , FieldRef } ;
2725use arrow:: { compute, compute:: SortOptions } ;
2826use datafusion_common:: cast:: { as_large_list_array, as_list_array, as_string_array} ;
2927use datafusion_common:: utils:: ListCoercion ;
30- use datafusion_common:: { Result , exec_err, plan_err } ;
28+ use datafusion_common:: { Result , exec_err} ;
3129use datafusion_expr:: {
3230 ArrayFunctionArgument , ArrayFunctionSignature , ColumnarValue , Documentation ,
3331 ScalarUDFImpl , Signature , TypeSignature , Volatility ,
@@ -134,18 +132,7 @@ impl ScalarUDFImpl for ArraySort {
134132 }
135133
136134 fn return_type ( & self , arg_types : & [ DataType ] ) -> Result < DataType > {
137- match & arg_types[ 0 ] {
138- DataType :: Null => Ok ( DataType :: Null ) ,
139- DataType :: List ( field) => {
140- Ok ( DataType :: new_list ( field. data_type ( ) . clone ( ) , true ) )
141- }
142- DataType :: LargeList ( field) => {
143- Ok ( DataType :: new_large_list ( field. data_type ( ) . clone ( ) , true ) )
144- }
145- arg_type => {
146- plan_err ! ( "{} does not support type {arg_type}" , self . name( ) )
147- }
148- }
135+ Ok ( arg_types[ 0 ] . clone ( ) )
149136 }
150137
151138 fn invoke_with_args (
@@ -206,11 +193,11 @@ fn array_sort_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
206193 }
207194 DataType :: List ( field) => {
208195 let array = as_list_array ( & args[ 0 ] ) ?;
209- array_sort_generic ( array, field, sort_options)
196+ array_sort_generic ( array, Arc :: clone ( field) , sort_options)
210197 }
211198 DataType :: LargeList ( field) => {
212199 let array = as_large_list_array ( & args[ 0 ] ) ?;
213- array_sort_generic ( array, field, sort_options)
200+ array_sort_generic ( array, Arc :: clone ( field) , sort_options)
214201 }
215202 // Signature should prevent this arm ever occurring
216203 _ => exec_err ! ( "array_sort expects list for first argument" ) ,
@@ -219,18 +206,16 @@ fn array_sort_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
219206
220207fn array_sort_generic < OffsetSize : OffsetSizeTrait > (
221208 list_array : & GenericListArray < OffsetSize > ,
222- field : & FieldRef ,
209+ field : FieldRef ,
223210 sort_options : Option < SortOptions > ,
224211) -> Result < ArrayRef > {
225212 let row_count = list_array. len ( ) ;
226213
227214 let mut array_lengths = vec ! [ ] ;
228215 let mut arrays = vec ! [ ] ;
229- let mut valid = NullBufferBuilder :: new ( row_count) ;
230216 for i in 0 ..row_count {
231217 if list_array. is_null ( i) {
232218 array_lengths. push ( 0 ) ;
233- valid. append_null ( ) ;
234219 } else {
235220 let arr_ref = list_array. value ( i) ;
236221
@@ -253,25 +238,22 @@ fn array_sort_generic<OffsetSize: OffsetSizeTrait>(
253238 } ;
254239 array_lengths. push ( sorted_array. len ( ) ) ;
255240 arrays. push ( sorted_array) ;
256- valid. append_non_null ( ) ;
257241 }
258242 }
259243
260- let buffer = valid. finish ( ) ;
261-
262244 let elements = arrays
263245 . iter ( )
264246 . map ( |a| a. as_ref ( ) )
265247 . collect :: < Vec < & dyn Array > > ( ) ;
266248
267249 let list_arr = if elements. is_empty ( ) {
268- GenericListArray :: < OffsetSize > :: new_null ( Arc :: clone ( field) , row_count)
250+ GenericListArray :: < OffsetSize > :: new_null ( field, row_count)
269251 } else {
270252 GenericListArray :: < OffsetSize > :: new (
271- Arc :: clone ( field) ,
253+ field,
272254 OffsetBuffer :: from_lengths ( array_lengths) ,
273255 Arc :: new ( compute:: concat ( elements. as_slice ( ) ) ?) ,
274- buffer ,
256+ list_array . nulls ( ) . cloned ( ) ,
275257 )
276258 } ;
277259 Ok ( Arc :: new ( list_arr) )
0 commit comments