From ecb93fd0b3508d5109dc62f02bde34323ef8f0d6 Mon Sep 17 00:00:00 2001 From: "Jorge C. Leitao" Date: Mon, 27 Jun 2022 23:56:37 +0000 Subject: [PATCH] Fixed error in new_null --- src/array/fixed_size_list/mod.rs | 12 ++- tests/it/array/fixed_size_list/mod.rs | 103 ++++++++++++++++++++++++++ 2 files changed, 111 insertions(+), 4 deletions(-) diff --git a/src/array/fixed_size_list/mod.rs b/src/array/fixed_size_list/mod.rs index d50518190f9..d61a64c2589 100644 --- a/src/array/fixed_size_list/mod.rs +++ b/src/array/fixed_size_list/mod.rs @@ -84,6 +84,11 @@ impl FixedSizeListArray { Self::try_new(data_type, values, validity).unwrap() } + /// Returns the size (number of elements per slot) of this [`FixedSizeListArray`]. + pub const fn size(&self) -> usize { + self.size + } + /// Alias for `new` pub fn from_data( data_type: DataType, @@ -101,10 +106,9 @@ impl FixedSizeListArray { /// Returns a new null [`FixedSizeListArray`]. pub fn new_null(data_type: DataType, length: usize) -> Self { - let values = new_null_array( - Self::get_child_and_size(&data_type).0.data_type().clone(), - length, - ); + let (field, size) = Self::get_child_and_size(&data_type); + + let values = new_null_array(field.data_type().clone(), length * size); Self::new(data_type, values, Some(Bitmap::new_zeroed(length))) } diff --git a/tests/it/array/fixed_size_list/mod.rs b/tests/it/array/fixed_size_list/mod.rs index f7a9b61988d..8281aee519c 100644 --- a/tests/it/array/fixed_size_list/mod.rs +++ b/tests/it/array/fixed_size_list/mod.rs @@ -1 +1,104 @@ mod mutable; + +use arrow2::{ + array::*, + bitmap::Bitmap, + datatypes::{DataType, Field}, +}; + +fn data() -> FixedSizeListArray { + let values = Int32Array::from_slice([10, 20, 0, 0]); + + FixedSizeListArray::try_new( + DataType::FixedSizeList( + Box::new(Field::new("a", values.data_type().clone(), true)), + 2, + ), + values.boxed(), + Some([true, false].into()), + ) + .unwrap() +} + +#[test] +fn basics() { + let array = data(); + assert_eq!(array.size(), 2); + assert_eq!(array.len(), 2); + assert_eq!(array.validity(), Some(&Bitmap::from([true, false]))); + + assert_eq!(array.value(0).as_ref(), Int32Array::from_slice([10, 20])); + assert_eq!(array.value(1).as_ref(), Int32Array::from_slice([0, 0])); + + let array = array.slice(1, 1); + + assert_eq!(array.value(0).as_ref(), Int32Array::from_slice([0, 0])); +} + +#[test] +fn with_validity() { + let array = data(); + + let a = array.with_validity(None); + assert!(a.validity().is_none()); +} + +#[test] +fn debug() { + let array = data(); + + assert_eq!(format!("{:?}", array), "FixedSizeListArray[[10, 20], None]"); +} + +#[test] +fn empty() { + let array = FixedSizeListArray::new_empty(DataType::FixedSizeList( + Box::new(Field::new("a", DataType::Int32, true)), + 2, + )); + assert_eq!(array.values().len(), 0); + assert_eq!(array.validity(), None); +} + +#[test] +fn null() { + let array = FixedSizeListArray::new_null( + DataType::FixedSizeList(Box::new(Field::new("a", DataType::Int32, true)), 2), + 2, + ); + assert_eq!(array.values().len(), 4); + assert_eq!(array.validity().cloned(), Some([false, false].into())); +} + +#[test] +fn wrong_size() { + let values = Int32Array::from_slice([10, 20, 0]); + assert!(FixedSizeListArray::try_new( + DataType::FixedSizeList(Box::new(Field::new("a", DataType::Int32, true)), 2), + values.boxed(), + None + ) + .is_err()); +} + +#[test] +fn wrong_len() { + let values = Int32Array::from_slice([10, 20, 0]); + assert!(FixedSizeListArray::try_new( + DataType::FixedSizeList(Box::new(Field::new("a", DataType::Int32, true)), 2), + values.boxed(), + Some([true, false, false].into()), // it should be 2 + ) + .is_err()); +} + +#[test] +fn wrong_data_type() { + let values = Int32Array::from_slice([10, 20, 0]); + assert!(FixedSizeListArray::try_new( + DataType::Binary, + values.boxed(), + Some([true, false, false].into()), // it should be 2 + ) + .is_err()); +}