You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by tu...@apache.org on 2023/01/25 19:40:49 UTC

[arrow-rs] branch master updated: Allow StringArray construction with Vec> (#3602)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 3f72ebb37 Allow StringArray construction with Vec<Option<String>> (#3602)
3f72ebb37 is described below

commit 3f72ebb3768e566da9e8a47f7b8540b237fcb881
Author: Davis Silverman <da...@davis.tools>
AuthorDate: Wed Jan 25 14:40:42 2023 -0500

    Allow StringArray construction with Vec<Option<String>> (#3602)
---
 arrow-arith/src/aggregate.rs                          |  3 ++-
 arrow-array/src/array/string_array.rs                 | 19 +++++++++++++++++--
 .../src/builder/generic_bytes_dictionary_builder.rs   |  3 ++-
 arrow-ord/src/comparison.rs                           |  3 ++-
 arrow/tests/array_transform.rs                        |  3 ++-
 5 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/arrow-arith/src/aggregate.rs b/arrow-arith/src/aggregate.rs
index a1cf8d849..b578dbd4a 100644
--- a/arrow-arith/src/aggregate.rs
+++ b/arrow-arith/src/aggregate.rs
@@ -1072,7 +1072,8 @@ mod tests {
 
     #[test]
     fn test_string_min_max_all_nulls() {
-        let a = StringArray::from(vec![None, None]);
+        let v: Vec<Option<&str>> = vec![None, None];
+        let a = StringArray::from(v);
         assert_eq!(None, min_string(&a));
         assert_eq!(None, max_string(&a));
     }
diff --git a/arrow-array/src/array/string_array.rs b/arrow-array/src/array/string_array.rs
index 4a4152adc..926bcc7bf 100644
--- a/arrow-array/src/array/string_array.rs
+++ b/arrow-array/src/array/string_array.rs
@@ -249,6 +249,14 @@ impl<OffsetSize: OffsetSizeTrait> From<Vec<&str>> for GenericStringArray<OffsetS
     }
 }
 
+impl<OffsetSize: OffsetSizeTrait> From<Vec<Option<String>>>
+    for GenericStringArray<OffsetSize>
+{
+    fn from(v: Vec<Option<String>>) -> Self {
+        v.into_iter().collect()
+    }
+}
+
 impl<OffsetSize: OffsetSizeTrait> From<Vec<String>> for GenericStringArray<OffsetSize> {
     fn from(v: Vec<String>) -> Self {
         Self::from_iter_values(v)
@@ -439,6 +447,13 @@ mod tests {
 
         assert_eq!(array1.value(0), "hello");
         assert_eq!(array1.value(1), "hello2");
+
+        // Also works with String types.
+        let data2: Vec<String> = vec!["goodbye".into(), "goodbye2".into()];
+        let array2 = StringArray::from_iter_values(data2.iter());
+
+        assert_eq!(array2.value(0), "goodbye");
+        assert_eq!(array2.value(1), "goodbye2");
     }
 
     #[test]
@@ -467,7 +482,7 @@ mod tests {
 
     #[test]
     fn test_string_array_all_null() {
-        let data = vec![None];
+        let data: Vec<Option<&str>> = vec![None];
         let array = StringArray::from(data);
         array
             .data()
@@ -477,7 +492,7 @@ mod tests {
 
     #[test]
     fn test_large_string_array_all_null() {
-        let data = vec![None];
+        let data: Vec<Option<&str>> = vec![None];
         let array = LargeStringArray::from(data);
         array
             .data()
diff --git a/arrow-array/src/builder/generic_bytes_dictionary_builder.rs b/arrow-array/src/builder/generic_bytes_dictionary_builder.rs
index 449100da1..5af41a519 100644
--- a/arrow-array/src/builder/generic_bytes_dictionary_builder.rs
+++ b/arrow-array/src/builder/generic_bytes_dictionary_builder.rs
@@ -641,8 +641,9 @@ mod tests {
 
     #[test]
     fn test_string_dictionary_builder_with_reserved_null_value() {
+        let v: Vec<Option<&str>> = vec![None];
         test_bytes_dictionary_builder_with_reserved_null_value::<GenericStringType<i32>>(
-            StringArray::from(vec![None]),
+            StringArray::from(v),
             vec!["abc", "def"],
         );
     }
diff --git a/arrow-ord/src/comparison.rs b/arrow-ord/src/comparison.rs
index 4754aeb1f..b8b510a2e 100644
--- a/arrow-ord/src/comparison.rs
+++ b/arrow-ord/src/comparison.rs
@@ -3712,7 +3712,8 @@ mod tests {
         // value_offsets = [0, 3, 6, 6]
         let list_array = builder.finish();
 
-        let nulls = StringArray::from(vec![None, None, None, None]);
+        let v: Vec<Option<&str>> = vec![None, None, None, None];
+        let nulls = StringArray::from(v);
         let nulls_result = contains_utf8(&nulls, &list_array).unwrap();
         assert_eq!(
             nulls_result
diff --git a/arrow/tests/array_transform.rs b/arrow/tests/array_transform.rs
index 3c08a592d..34ef6cbae 100644
--- a/arrow/tests/array_transform.rs
+++ b/arrow/tests/array_transform.rs
@@ -433,7 +433,8 @@ fn test_struct_nulls() {
     let data = mutable.freeze();
     let array = StructArray::from(data);
 
-    let expected_string = Arc::new(StringArray::from(vec![None, None])) as ArrayRef;
+    let v: Vec<Option<&str>> = vec![None, None];
+    let expected_string = Arc::new(StringArray::from(v)) as ArrayRef;
     let expected_int = Arc::new(Int32Array::from(vec![Some(2), None])) as ArrayRef;
 
     let expected =