From 4964930b2c34fd96e0b47083f9e1f7f191ca2bfc Mon Sep 17 00:00:00 2001 From: "Heres, Daniel" Date: Sat, 23 Jan 2021 12:53:15 +0100 Subject: [PATCH] Add PrimitiveArray::from_value --- rust/arrow/src/array/array_primitive.rs | 33 +++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/rust/arrow/src/array/array_primitive.rs b/rust/arrow/src/array/array_primitive.rs index 3dcb187495f..656433c1243 100644 --- a/rust/arrow/src/array/array_primitive.rs +++ b/rust/arrow/src/array/array_primitive.rs @@ -94,6 +94,28 @@ impl PrimitiveArray { let offset = i + self.offset(); unsafe { *self.raw_values.as_ptr().add(offset) } } + + /// Creates a `PrimitiveArray` with a constant `value` and `size` + pub fn from_value(value: T::Native, size: usize) -> Self { + let mut val_buf = MutableBuffer::new( + size * mem::size_of::<::Native>(), + ); + + for _ in 0..size { + val_buf.push(value); + } + + let data = ArrayData::new( + T::DATA_TYPE, + size, + None, + None, + 0, + vec![val_buf.into()], + vec![], + ); + PrimitiveArray::from(Arc::new(data)) + } } impl Array for PrimitiveArray { @@ -820,6 +842,17 @@ mod tests { } } + #[test] + fn test_primitive_from_value() { + let arr: PrimitiveArray = PrimitiveArray::from_value(0, 10); + assert_eq!(10, arr.len()); + assert_eq!(0, arr.null_count()); + for i in 0..10 { + assert_eq!(0, arr.value(i)); + } + } + + #[test] #[should_panic(expected = "PrimitiveArray data should contain a single buffer only \ (values buffer)")]