diff --git a/rust/arrow/src/array/array.rs b/rust/arrow/src/array/array.rs index f35c02aa3d0..a1ffeaa1dbf 100644 --- a/rust/arrow/src/array/array.rs +++ b/rust/arrow/src/array/array.rs @@ -1548,17 +1548,16 @@ impl GenericStringArray { } pub(crate) fn from_opt_vec(v: Vec>) -> Self { - let iter = v.iter().map(|e| e.map(|e| e.to_string())); - GenericStringArray::from_iter(iter) + GenericStringArray::from_iter(v.into_iter()) } } -impl<'a, Ptr, OffsetSize: StringOffsetSizeTrait> FromIterator +impl<'a, Ptr, OffsetSize: StringOffsetSizeTrait> FromIterator> for GenericStringArray where - Ptr: Borrow>, + Ptr: AsRef, { - fn from_iter>(iter: I) -> Self { + fn from_iter>>(iter: I) -> Self { let iter = iter.into_iter(); let (_, data_len) = iter.size_hint(); let data_len = data_len.expect("Iterator must be sized"); // panic if no upper bound. @@ -1570,7 +1569,8 @@ where offsets.push(length_so_far); for (i, s) in iter.enumerate() { - if let Some(s) = s.borrow() { + if let Some(s) = s { + let s = s.as_ref(); // set null bit let null_slice = null_buf.data_mut(); bit_util::set_bit(null_slice, i); @@ -3916,6 +3916,23 @@ mod tests { ); } + #[test] + fn test_string_array_from_iter() { + let data = vec![Some("hello"), None, Some("arrow")]; + // from Vec> + let array1 = StringArray::from(data.clone()); + // from Iterator> + let array2: StringArray = data.clone().into_iter().collect(); + // from Iterator> + let array3: StringArray = data + .into_iter() + .map(|x| x.map(|s| format!("{}", s))) + .collect(); + + assert_eq!(array1, array2); + assert_eq!(array2, array3); + } + #[test] fn test_struct_array_builder() { let boolean_data = ArrayData::builder(DataType::Boolean)