You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by al...@apache.org on 2021/08/12 15:44:21 UTC

[arrow-rs] branch cherry_pick_1a5c26bc created (now 4093240)

This is an automated email from the ASF dual-hosted git repository.

alamb pushed a change to branch cherry_pick_1a5c26bc
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git.


      at 4093240  Allow creation of String arrays from &Option<&str> iterators (#680)

This branch includes the following new commits:

     new 4093240  Allow creation of String arrays from &Option<&str> iterators (#680)

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[arrow-rs] 01/01: Allow creation of String arrays from &Option<&str> iterators (#680)

Posted by al...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch cherry_pick_1a5c26bc
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git

commit 4093240dbce1455bb1cfe5f25b94bdc5b8a32577
Author: Pete Koomen <ko...@gmail.com>
AuthorDate: Thu Aug 12 08:42:28 2021 -0700

    Allow creation of String arrays from &Option<&str> iterators (#680)
    
    * Allow creation of String arrays from &Option<&str> iterators
    
    * Add links in doc comments
    
    Co-authored-by: Jorge Leitao <jo...@gmail.com>
    
    Co-authored-by: Andrew Lamb <an...@nerdnetworks.org>
    Co-authored-by: Jorge Leitao <jo...@gmail.com>
---
 arrow/src/array/array_string.rs | 32 +++++++++++++++++++++++++++-----
 1 file changed, 27 insertions(+), 5 deletions(-)

diff --git a/arrow/src/array/array_string.rs b/arrow/src/array/array_string.rs
index 2fa4c48..d72dbb2 100644
--- a/arrow/src/array/array_string.rs
+++ b/arrow/src/array/array_string.rs
@@ -196,11 +196,26 @@ impl<OffsetSize: StringOffsetSizeTrait> GenericStringArray<OffsetSize> {
     }
 }
 
+impl<'a, Ptr, OffsetSize: StringOffsetSizeTrait> FromIterator<&'a Option<Ptr>>
+    for GenericStringArray<OffsetSize>
+where
+    Ptr: AsRef<str> + 'a,
+{
+    /// Creates a [`GenericStringArray`] based on an iterator of `Option` references.
+    fn from_iter<I: IntoIterator<Item = &'a Option<Ptr>>>(iter: I) -> Self {
+        // Convert each owned Ptr into &str and wrap in an owned `Option`
+        let iter = iter.into_iter().map(|o| o.as_ref().map(|p| p.as_ref()));
+        // Build a `GenericStringArray` with the resulting iterator
+        iter.collect::<GenericStringArray<OffsetSize>>()
+    }
+}
+
 impl<'a, Ptr, OffsetSize: StringOffsetSizeTrait> FromIterator<Option<Ptr>>
     for GenericStringArray<OffsetSize>
 where
     Ptr: AsRef<str>,
 {
+    /// Creates a [`GenericStringArray`] based on an iterator of `Option`s
     fn from_iter<I: IntoIterator<Item = Option<Ptr>>>(iter: I) -> Self {
         let iter = iter.into_iter();
         let (_, data_len) = iter.size_hint();
@@ -358,6 +373,7 @@ impl<T: StringOffsetSizeTrait> From<GenericListArray<T>> for GenericStringArray<
 
 #[cfg(test)]
 mod tests {
+
     use crate::array::{ListBuilder, StringBuilder};
 
     use super::*;
@@ -484,17 +500,23 @@ mod tests {
 
     #[test]
     fn test_string_array_from_iter() {
-        let data = vec![Some("hello"), None, Some("arrow")];
+        let data = [Some("hello"), None, Some("arrow")];
+        let data_vec = data.to_vec();
         // from Vec<Option<&str>>
-        let array1 = StringArray::from(data.clone());
+        let array1 = StringArray::from(data_vec.clone());
         // from Iterator<Option<&str>>
-        let array2: StringArray = data.clone().into_iter().collect();
+        let array2: StringArray = data_vec.clone().into_iter().collect();
         // from Iterator<Option<String>>
-        let array3: StringArray =
-            data.into_iter().map(|x| x.map(|s| s.to_string())).collect();
+        let array3: StringArray = data_vec
+            .into_iter()
+            .map(|x| x.map(|s| s.to_string()))
+            .collect();
+        // from Iterator<&Option<&str>>
+        let array4: StringArray = data.iter().collect::<StringArray>();
 
         assert_eq!(array1, array2);
         assert_eq!(array2, array3);
+        assert_eq!(array3, array4);
     }
 
     #[test]