@@ -47,6 +47,7 @@ use arrow::{
4747} ;
4848use arrow_array:: types:: ArrowTimestampType ;
4949use arrow_array:: { ArrowNativeTypeOp , Scalar } ;
50+ use arrow_buffer:: Buffer ;
5051
5152/// A dynamically typed, nullable single value, (the single-valued counter-part
5253/// to arrow's [`Array`])
@@ -1389,25 +1390,32 @@ impl ScalarValue {
13891390 if first_struct. is_none ( ) {
13901391 return _internal_err ! (
13911392 "Inconsistent types in ScalarValue::iter_to_array. \
1392- Expected ScalarValue::Struct, got {:?}", arrays[ 0 ] . clone( )
1393+ Expected ScalarValue::Struct, got {:?}",
1394+ arrays[ 0 ] . clone( )
13931395 ) ;
13941396 }
1397+
1398+ let mut valid = BooleanBufferBuilder :: new ( arrays. len ( ) ) ;
1399+
13951400 let first_struct = first_struct. unwrap ( ) ;
1396- let column_fields = first_struct. fields ( ) . to_vec ( ) ;
1397- let mut column_values: Vec < Vec < ScalarValue > > = vec ! [ Vec :: with_capacity( arrays. len( ) ) ; first_struct. num_columns( ) ] ;
1398- for i in 0 ..first_struct. num_columns ( ) {
1399- let arr = first_struct. column ( i) . to_owned ( ) ;
1400- let sv = ScalarValue :: try_from_array ( & arr, 0 ) ?;
1401+ valid. append ( first_struct. is_valid ( 0 ) ) ;
1402+
1403+ let mut column_values: Vec < Vec < ScalarValue > > =
1404+ vec ! [ Vec :: with_capacity( arrays. len( ) ) ; first_struct. num_columns( ) ] ;
1405+
1406+ for ( i, v) in first_struct. columns ( ) . iter ( ) . enumerate ( ) {
1407+ // ScalarValue::Struct contains a single element in each column.
1408+ let sv = ScalarValue :: try_from_array ( v, 0 ) ?;
14011409 column_values[ i] . push ( sv) ;
14021410 }
14031411
14041412 for arr in arrays. iter ( ) . skip ( 1 ) {
14051413 if let Some ( struct_array) = arr. as_struct_opt ( ) {
1406- // Since it is not possible to have `Null` in ScalarValue::Struct,
1407- // And, ScalarValue::Struct contains a single element StructArray.
1408- for i in 0 ..struct_array . num_columns ( ) {
1409- let arr = struct_array . column ( i ) . to_owned ( ) ;
1410- let sv = ScalarValue :: try_from_array ( & arr , 0 ) ?;
1414+ valid . append ( struct_array . is_valid ( 0 ) ) ;
1415+
1416+ for ( i , v ) in struct_array . columns ( ) . iter ( ) . enumerate ( ) {
1417+ // ScalarValue::Struct contains a single element in each column.
1418+ let sv = ScalarValue :: try_from_array ( v , 0 ) ?;
14111419 column_values[ i] . push ( sv) ;
14121420 }
14131421 } else {
@@ -1417,19 +1425,26 @@ impl ScalarValue {
14171425 ) ;
14181426 }
14191427 }
1420- println ! ( "column_arrays: {:?}" , column_values ) ;
1421- println ! ( " column_fields: {:?}" , column_fields ) ;
1428+
1429+ let column_fields = first_struct . fields ( ) . to_vec ( ) ;
14221430
14231431 let mut data = vec ! [ ] ;
1424- for ( field, values) in column_fields. into_iter ( ) . zip ( column_values. into_iter ( ) ) {
1432+ for ( field, values) in
1433+ column_fields. into_iter ( ) . zip ( column_values. into_iter ( ) )
1434+ {
14251435 let field = field. to_owned ( ) ;
14261436 let array = ScalarValue :: iter_to_array ( values. into_iter ( ) ) ?;
14271437 data. push ( ( field, array) ) ;
14281438 }
14291439
1430- println ! ( "data: {:?}" , data) ;
1440+ let bool_buffer = valid. finish ( ) ;
1441+ let buffer: Buffer = bool_buffer. values ( ) . into ( ) ;
1442+ println ! ( "bool_buffer: {:?}" , bool_buffer) ;
1443+ // println!("bool_buffer v: {:?}", bool_buffer.values());
1444+
1445+ // println!("data: {:?}", data);
14311446
1432- Ok ( Arc :: new ( StructArray :: from ( data) ) )
1447+ Ok ( Arc :: new ( StructArray :: from ( ( data, buffer ) ) ) )
14331448 }
14341449
14351450 fn build_list_array (
@@ -1539,9 +1554,7 @@ impl ScalarValue {
15391554 build_array_primitive ! ( IntervalMonthDayNanoArray , IntervalMonthDayNano )
15401555 }
15411556 DataType :: Struct ( _) => build_struct_array ( scalars) ?,
1542- DataType :: List ( _) | DataType :: LargeList ( _) => {
1543- build_list_array ( scalars) ?
1544- }
1557+ DataType :: List ( _) | DataType :: LargeList ( _) => build_list_array ( scalars) ?,
15451558 DataType :: Dictionary ( key_type, value_type) => {
15461559 // create the values array
15471560 let value_scalars = scalars
@@ -3139,6 +3152,7 @@ mod tests {
31393152 use std:: cmp:: Ordering ;
31403153 use std:: sync:: Arc ;
31413154
3155+ use arrow_buffer:: Buffer ;
31423156 use chrono:: NaiveDate ;
31433157 use rand:: Rng ;
31443158
@@ -3325,31 +3339,90 @@ mod tests {
33253339
33263340 #[ test]
33273341 fn test_iter_to_array_struct ( ) {
3328- let boolean = Arc :: new ( BooleanArray :: from ( vec ! [ false , false , true , true ] ) ) ;
3329- let int = Arc :: new ( Int32Array :: from ( vec ! [ 42 , 28 , 19 , 31 ] ) ) ;
3342+ let s1 = StructArray :: from ( vec ! [
3343+ (
3344+ Arc :: new( Field :: new( "A" , DataType :: Boolean , false ) ) ,
3345+ Arc :: new( BooleanArray :: from( vec![ false ] ) ) as ArrayRef ,
3346+ ) ,
3347+ (
3348+ Arc :: new( Field :: new( "B" , DataType :: Int32 , false ) ) ,
3349+ Arc :: new( Int32Array :: from( vec![ 42 ] ) ) as ArrayRef ,
3350+ ) ,
3351+ ] ) ;
33303352
3331- let s1 = (
3332- Arc :: new ( Field :: new ( "b" , DataType :: Boolean , false ) ) ,
3333- boolean. clone ( ) as ArrayRef
3334- ) ;
3353+ let s2 = StructArray :: from ( vec ! [
3354+ (
3355+ Arc :: new( Field :: new( "A" , DataType :: Boolean , false ) ) ,
3356+ Arc :: new( BooleanArray :: from( vec![ false ] ) ) as ArrayRef ,
3357+ ) ,
3358+ (
3359+ Arc :: new( Field :: new( "B" , DataType :: Int32 , false ) ) ,
3360+ Arc :: new( Int32Array :: from( vec![ 42 ] ) ) as ArrayRef ,
3361+ ) ,
3362+ ] ) ;
33353363
3336- let s2 = (
3337- Arc :: new ( Field :: new ( "c" , DataType :: Int32 , false ) ) ,
3338- int. clone ( ) as ArrayRef
3339- ) ;
3364+ let scalars = vec ! [
3365+ ScalarValue :: Struct ( Arc :: new( s1) ) ,
3366+ ScalarValue :: Struct ( Arc :: new( s2) ) ,
3367+ ] ;
3368+
3369+ let array = ScalarValue :: iter_to_array ( scalars) . unwrap ( ) ;
3370+
3371+ let expected = StructArray :: from ( vec ! [
3372+ (
3373+ Arc :: new( Field :: new( "A" , DataType :: Boolean , false ) ) ,
3374+ Arc :: new( BooleanArray :: from( vec![ false , false ] ) ) as ArrayRef ,
3375+ ) ,
3376+ (
3377+ Arc :: new( Field :: new( "B" , DataType :: Int32 , false ) ) ,
3378+ Arc :: new( Int32Array :: from( vec![ 42 , 42 ] ) ) as ArrayRef ,
3379+ ) ,
3380+ ] ) ;
3381+ assert_eq ! ( array. as_ref( ) , & expected) ;
3382+ }
33403383
3341- let expected = StructArray :: from ( vec ! [ s1. clone( ) , s2. clone( ) ] ) ;
3384+ #[ test]
3385+ fn test_iter_to_array_struct_with_nulls ( ) {
3386+ // non-null
3387+ let s1 = StructArray :: from ( (
3388+ vec ! [
3389+ (
3390+ Arc :: new( Field :: new( "A" , DataType :: Int32 , false ) ) ,
3391+ Arc :: new( Int32Array :: from( vec![ 1 ] ) ) as ArrayRef ,
3392+ ) ,
3393+ (
3394+ Arc :: new( Field :: new( "B" , DataType :: Int64 , false ) ) ,
3395+ Arc :: new( Int64Array :: from( vec![ 2 ] ) ) as ArrayRef ,
3396+ ) ,
3397+ ] ,
3398+ // Present the null mask, 1 is non-null, 0 is null
3399+ Buffer :: from ( & [ 1 ] ) ,
3400+ ) ) ;
33423401
3343- let s1 = StructArray :: from ( vec ! [ s1] ) ;
3344- let s2 = StructArray :: from ( vec ! [ s2] ) ;
3402+ // null
3403+ let s2 = StructArray :: from ( (
3404+ vec ! [
3405+ (
3406+ Arc :: new( Field :: new( "A" , DataType :: Int32 , false ) ) ,
3407+ Arc :: new( Int32Array :: from( vec![ 3 ] ) ) as ArrayRef ,
3408+ ) ,
3409+ (
3410+ Arc :: new( Field :: new( "B" , DataType :: Int64 , false ) ) ,
3411+ Arc :: new( Int64Array :: from( vec![ 4 ] ) ) as ArrayRef ,
3412+ ) ,
3413+ ] ,
3414+ Buffer :: from ( & [ 0 ] ) ,
3415+ ) ) ;
33453416
33463417 let scalars = vec ! [
33473418 ScalarValue :: Struct ( Arc :: new( s1) ) ,
33483419 ScalarValue :: Struct ( Arc :: new( s2) ) ,
33493420 ] ;
33503421
33513422 let array = ScalarValue :: iter_to_array ( scalars) . unwrap ( ) ;
3352- assert_eq ! ( array. as_ref( ) , & expected) ;
3423+ let struct_array = array. as_struct ( ) ;
3424+ assert ! ( struct_array. is_valid( 0 ) ) ;
3425+ assert ! ( struct_array. is_null( 1 ) ) ;
33533426 }
33543427
33553428 #[ test]
@@ -4677,7 +4750,7 @@ mod tests {
46774750 // iter_to_array for struct scalars
46784751 let array =
46794752 ScalarValue :: iter_to_array ( vec ! [ s0. clone( ) , s1. clone( ) , s2. clone( ) ] ) . unwrap ( ) ;
4680-
4753+
46814754 println ! ( "array: {array:?}" ) ;
46824755
46834756 let array = as_struct_array ( & array) . unwrap ( ) ;
0 commit comments