parquet_variant_compute/
from_json.rs1use crate::{VariantArray, VariantArrayBuilder};
22use arrow::array::{Array, ArrayRef, StringArray};
23use arrow_schema::ArrowError;
24use parquet_variant_json::json_to_variant;
25
26pub fn batch_json_string_to_variant(input: &ArrayRef) -> Result<VariantArray, ArrowError> {
30 let input_string_array = match input.as_any().downcast_ref::<StringArray>() {
31 Some(string_array) => Ok(string_array),
32 None => Err(ArrowError::CastError(
33 "Expected reference to StringArray as input".into(),
34 )),
35 }?;
36
37 let mut variant_array_builder = VariantArrayBuilder::new(input_string_array.len());
38 for i in 0..input.len() {
39 if input.is_null(i) {
40 variant_array_builder.append_null();
42 } else {
43 let mut vb = variant_array_builder.variant_builder();
44 json_to_variant(input_string_array.value(i), &mut vb)?;
46 vb.finish()
47 }
48 }
49 Ok(variant_array_builder.build())
50}
51
52#[cfg(test)]
53mod test {
54 use crate::batch_json_string_to_variant;
55 use arrow::array::{Array, ArrayRef, StringArray};
56 use arrow_schema::ArrowError;
57 use parquet_variant::{Variant, VariantBuilder};
58 use std::sync::Arc;
59
60 #[test]
61 fn test_batch_json_string_to_variant() -> Result<(), ArrowError> {
62 let input = StringArray::from(vec![
63 Some("1"),
64 None,
65 Some("{\"a\": 32}"),
66 Some("null"),
67 None,
68 ]);
69 let array_ref: ArrayRef = Arc::new(input);
70 let variant_array = batch_json_string_to_variant(&array_ref).unwrap();
71
72 let metadata_array = variant_array.metadata_field();
73 let value_array = variant_array.value_field().expect("value field");
74
75 assert!(!variant_array.is_null(0));
77 assert_eq!(variant_array.value(0), Variant::Int8(1));
78
79 assert!(variant_array.is_null(1));
81
82 assert!(!variant_array.is_null(2));
84 {
85 let mut vb = VariantBuilder::new();
86 let mut ob = vb.new_object();
87 ob.insert("a", Variant::Int8(32));
88 ob.finish()?;
89 let (object_metadata, object_value) = vb.finish();
90 let expected = Variant::new(&object_metadata, &object_value);
91 assert_eq!(variant_array.value(2), expected);
92 }
93
94 assert!(!variant_array.is_null(3));
96 assert_eq!(variant_array.value(3), Variant::Null);
97
98 assert!(variant_array.is_null(4));
100
101 assert!(!metadata_array.is_null(1));
103 assert!(!value_array.is_null(1));
104 assert!(!metadata_array.is_null(4));
105 assert!(!value_array.is_null(4));
106 Ok(())
107 }
108}