@@ -3246,6 +3246,8 @@ impl ScalarValue {
3246
3246
3247
3247
/// Retrieve ScalarValue for each row in `array`
3248
3248
///
3249
+ /// Elements in `array` itself may be NULL, in which case the corresponding element in the returned vector is None.
3250
+ ///
3249
3251
/// Example 1: Array (ScalarValue::Int32)
3250
3252
/// ```
3251
3253
/// use datafusion_common::ScalarValue;
@@ -3262,15 +3264,15 @@ impl ScalarValue {
3262
3264
/// let scalar_vec = ScalarValue::convert_array_to_scalar_vec(&list_arr).unwrap();
3263
3265
///
3264
3266
/// let expected = vec![
3265
- /// vec![
3266
- /// ScalarValue::Int32(Some(1)),
3267
- /// ScalarValue::Int32(Some(2)),
3268
- /// ScalarValue::Int32(Some(3)),
3269
- /// ] ,
3270
- /// vec![
3271
- /// ScalarValue::Int32(Some(4)),
3272
- /// ScalarValue::Int32(Some(5)),
3273
- /// ] ,
3267
+ /// Some( vec![
3268
+ /// ScalarValue::Int32(Some(1)),
3269
+ /// ScalarValue::Int32(Some(2)),
3270
+ /// ScalarValue::Int32(Some(3)),
3271
+ /// ]) ,
3272
+ /// Some( vec![
3273
+ /// ScalarValue::Int32(Some(4)),
3274
+ /// ScalarValue::Int32(Some(5)),
3275
+ /// ]) ,
3274
3276
/// ];
3275
3277
///
3276
3278
/// assert_eq!(scalar_vec, expected);
@@ -3303,28 +3305,60 @@ impl ScalarValue {
3303
3305
/// ]);
3304
3306
///
3305
3307
/// let expected = vec![
3306
- /// vec![
3308
+ /// Some( vec![
3307
3309
/// ScalarValue::List(Arc::new(l1)),
3308
3310
/// ScalarValue::List(Arc::new(l2)),
3309
- /// ],
3311
+ /// ]),
3312
+ /// ];
3313
+ ///
3314
+ /// assert_eq!(scalar_vec, expected);
3315
+ /// ```
3316
+ ///
3317
+ /// Example 3: Nullable array
3318
+ /// ```
3319
+ /// use datafusion_common::ScalarValue;
3320
+ /// use arrow::array::ListArray;
3321
+ /// use arrow::datatypes::{DataType, Int32Type};
3322
+ ///
3323
+ /// let list_arr = ListArray::from_iter_primitive::<Int32Type, _, _>(vec![
3324
+ /// Some(vec![Some(1), Some(2), Some(3)]),
3325
+ /// None,
3326
+ /// Some(vec![Some(4), Some(5)])
3327
+ /// ]);
3328
+ ///
3329
+ /// // Convert the array into Scalar Values for each row
3330
+ /// let scalar_vec = ScalarValue::convert_array_to_scalar_vec(&list_arr).unwrap();
3331
+ ///
3332
+ /// let expected = vec![
3333
+ /// Some(vec![
3334
+ /// ScalarValue::Int32(Some(1)),
3335
+ /// ScalarValue::Int32(Some(2)),
3336
+ /// ScalarValue::Int32(Some(3)),
3337
+ /// ]),
3338
+ /// None,
3339
+ /// Some(vec![
3340
+ /// ScalarValue::Int32(Some(4)),
3341
+ /// ScalarValue::Int32(Some(5)),
3342
+ /// ]),
3310
3343
/// ];
3311
3344
///
3312
3345
/// assert_eq!(scalar_vec, expected);
3313
3346
/// ```
3314
- pub fn convert_array_to_scalar_vec ( array : & dyn Array ) -> Result < Vec < Vec < Self > > > {
3347
+ pub fn convert_array_to_scalar_vec (
3348
+ array : & dyn Array ,
3349
+ ) -> Result < Vec < Option < Vec < Self > > > > {
3315
3350
fn generic_collect < OffsetSize : OffsetSizeTrait > (
3316
3351
array : & dyn Array ,
3317
- ) -> Result < Vec < Vec < ScalarValue > > > {
3352
+ ) -> Result < Vec < Option < Vec < ScalarValue > > > > {
3318
3353
array
3319
3354
. as_list :: < OffsetSize > ( )
3320
3355
. iter ( )
3321
3356
. map ( |nested_array| match nested_array {
3322
3357
Some ( nested_array) => ( 0 ..nested_array. len ( ) )
3323
3358
. map ( |i| ScalarValue :: try_from_array ( & nested_array, i) )
3324
- . collect :: < Result < Vec < _ > > > ( ) ,
3325
- // TODO: what can we put for null?
3326
- // https://github.com/apache/datafusion/issues/17749
3327
- None => Ok ( vec ! [ ] ) ,
3359
+ . collect :: < Result < Vec < _ > > > ( )
3360
+ . map ( Some ) ,
3361
+ None => Ok ( None ) ,
3328
3362
} )
3329
3363
. collect ( )
3330
3364
}
@@ -9031,13 +9065,16 @@ mod tests {
9031
9065
assert_eq ! (
9032
9066
converted,
9033
9067
vec![
9034
- vec![ ScalarValue :: Int64 ( Some ( 1 ) ) , ScalarValue :: Int64 ( Some ( 2 ) ) ] ,
9035
- vec![ ] ,
9036
- vec![
9068
+ Some ( vec![
9069
+ ScalarValue :: Int64 ( Some ( 1 ) ) ,
9070
+ ScalarValue :: Int64 ( Some ( 2 ) )
9071
+ ] ) ,
9072
+ None ,
9073
+ Some ( vec![
9037
9074
ScalarValue :: Int64 ( Some ( 3 ) ) ,
9038
9075
ScalarValue :: Int64 ( None ) ,
9039
9076
ScalarValue :: Int64 ( Some ( 4 ) )
9040
- ] ,
9077
+ ] ) ,
9041
9078
]
9042
9079
) ;
9043
9080
@@ -9051,13 +9088,16 @@ mod tests {
9051
9088
assert_eq ! (
9052
9089
converted,
9053
9090
vec![
9054
- vec![ ScalarValue :: Int64 ( Some ( 1 ) ) , ScalarValue :: Int64 ( Some ( 2 ) ) ] ,
9055
- vec![ ] ,
9056
- vec![
9091
+ Some ( vec![
9092
+ ScalarValue :: Int64 ( Some ( 1 ) ) ,
9093
+ ScalarValue :: Int64 ( Some ( 2 ) )
9094
+ ] ) ,
9095
+ None ,
9096
+ Some ( vec![
9057
9097
ScalarValue :: Int64 ( Some ( 3 ) ) ,
9058
9098
ScalarValue :: Int64 ( None ) ,
9059
9099
ScalarValue :: Int64 ( Some ( 4 ) )
9060
- ] ,
9100
+ ] ) ,
9061
9101
]
9062
9102
) ;
9063
9103
@@ -9074,9 +9114,12 @@ mod tests {
9074
9114
assert_eq ! (
9075
9115
converted,
9076
9116
vec![
9077
- vec![ ScalarValue :: Int64 ( Some ( 1 ) ) , ScalarValue :: Int64 ( Some ( 2 ) ) ] ,
9078
- vec![ ] ,
9079
- vec![ ScalarValue :: Int64 ( Some ( 5 ) ) ] ,
9117
+ Some ( vec![
9118
+ ScalarValue :: Int64 ( Some ( 1 ) ) ,
9119
+ ScalarValue :: Int64 ( Some ( 2 ) )
9120
+ ] ) ,
9121
+ None ,
9122
+ Some ( vec![ ScalarValue :: Int64 ( Some ( 5 ) ) ] ) ,
9080
9123
]
9081
9124
) ;
9082
9125
}
0 commit comments