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)")]