Skip to content

Commit b6c54cc

Browse files
authored
Merge branch 'main' into fsl-len
2 parents 7239ab9 + b8a1926 commit b6c54cc

File tree

1 file changed

+62
-1
lines changed

1 file changed

+62
-1
lines changed

arrow-array/src/array/byte_array.rs

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,29 @@ impl<T: ByteArrayType> GenericByteArray<T> {
190190
Scalar::new(Self::from_iter_values(std::iter::once(value)))
191191
}
192192

193+
/// Create a new [`GenericByteArray`] where `value` is repeated `repeat_count` times.
194+
///
195+
/// # Panics
196+
/// This will panic if value's length multiplied by `repeat_count` overflows usize.
197+
///
198+
pub fn new_repeated(value: impl AsRef<T::Native>, repeat_count: usize) -> Self {
199+
let s: &[u8] = value.as_ref().as_ref();
200+
let value_offsets = OffsetBuffer::from_repeated_length(s.len(), repeat_count);
201+
let bytes: Buffer = {
202+
let mut mutable_buffer = MutableBuffer::with_capacity(0);
203+
mutable_buffer.repeat_slice_n_times(s, repeat_count);
204+
205+
mutable_buffer.into()
206+
};
207+
208+
Self {
209+
data_type: T::DATA_TYPE,
210+
value_data: bytes,
211+
value_offsets,
212+
nulls: None,
213+
}
214+
}
215+
193216
/// Creates a [`GenericByteArray`] based on an iterator of values without nulls
194217
pub fn from_iter_values<Ptr, I>(iter: I) -> Self
195218
where
@@ -593,7 +616,7 @@ where
593616

594617
#[cfg(test)]
595618
mod tests {
596-
use crate::{BinaryArray, StringArray};
619+
use crate::{Array, BinaryArray, StringArray};
597620
use arrow_buffer::{Buffer, NullBuffer, OffsetBuffer};
598621

599622
#[test]
@@ -651,4 +674,42 @@ mod tests {
651674

652675
BinaryArray::new(offsets, non_ascii_data, None);
653676
}
677+
678+
#[test]
679+
fn create_repeated() {
680+
let arr = BinaryArray::new_repeated(b"hello", 3);
681+
assert_eq!(arr.len(), 3);
682+
assert_eq!(arr.value(0), b"hello");
683+
assert_eq!(arr.value(1), b"hello");
684+
assert_eq!(arr.value(2), b"hello");
685+
686+
let arr = StringArray::new_repeated("world", 2);
687+
assert_eq!(arr.len(), 2);
688+
assert_eq!(arr.value(0), "world");
689+
assert_eq!(arr.value(1), "world");
690+
}
691+
692+
#[test]
693+
#[should_panic(expected = "usize overflow")]
694+
fn create_repeated_usize_overflow_1() {
695+
let _arr = BinaryArray::new_repeated(b"hello", (usize::MAX / "hello".len()) + 1);
696+
}
697+
698+
#[test]
699+
#[should_panic(expected = "usize overflow")]
700+
fn create_repeated_usize_overflow_2() {
701+
let _arr = BinaryArray::new_repeated(b"hello", usize::MAX);
702+
}
703+
704+
#[test]
705+
#[should_panic(expected = "offset overflow")]
706+
fn create_repeated_i32_offset_overflow_1() {
707+
let _arr = BinaryArray::new_repeated(b"hello", usize::MAX / "hello".len());
708+
}
709+
710+
#[test]
711+
#[should_panic(expected = "offset overflow")]
712+
fn create_repeated_i32_offset_overflow_2() {
713+
let _arr = BinaryArray::new_repeated(b"hello", ((i32::MAX as usize) / "hello".len()) + 1);
714+
}
654715
}

0 commit comments

Comments
 (0)