Skip to content
This repository has been archived by the owner on Feb 18, 2024. It is now read-only.

Fixed error in FixedSizeListArray::new_null #1114

Merged
merged 1 commit into from
Jun 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions src/array/fixed_size_list/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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)))
}

Expand Down
103 changes: 103 additions & 0 deletions tests/it/array/fixed_size_list/mod.rs
Original file line number Diff line number Diff line change
@@ -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());
}