Skip to content

Commit 5a5a88d

Browse files
committed
clippy
Signed-off-by: jayzhan211 <jayzhan211@gmail.com>
1 parent 873f1bb commit 5a5a88d

1 file changed

Lines changed: 107 additions & 34 deletions

File tree

datafusion/common/src/scalar.rs

Lines changed: 107 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ use arrow::{
4747
};
4848
use arrow_array::types::ArrowTimestampType;
4949
use 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

Comments
 (0)