|
16 | 16 | // under the License. |
17 | 17 |
|
18 | 18 | use arrow::array::{ |
19 | | - ArrayRef, BinaryViewArray, BooleanBuilder, FixedSizeBinaryBuilder, NullArray, |
20 | | - NullBufferBuilder, PrimitiveBuilder, |
| 19 | + ArrayRef, BinaryViewArray, BooleanBuilder, FixedSizeBinaryBuilder, LargeStringBuilder, |
| 20 | + NullArray, NullBufferBuilder, PrimitiveBuilder, StringBuilder, StringLikeArrayBuilder, |
| 21 | + StringViewBuilder, |
21 | 22 | }; |
22 | 23 | use arrow::compute::{CastOptions, DecimalCast}; |
23 | 24 | use arrow::datatypes::{self, DataType, DecimalType}; |
@@ -62,6 +63,9 @@ pub(crate) enum PrimitiveVariantToArrowRowBuilder<'a> { |
62 | 63 | Time(VariantToPrimitiveArrowRowBuilder<'a, datatypes::Time64MicrosecondType>), |
63 | 64 | Date(VariantToPrimitiveArrowRowBuilder<'a, datatypes::Date32Type>), |
64 | 65 | Uuid(VariantToUuidArrowRowBuilder<'a>), |
| 66 | + String(VariantToStringArrowBuilder<'a, StringBuilder>), |
| 67 | + LargeString(VariantToStringArrowBuilder<'a, LargeStringBuilder>), |
| 68 | + StringView(VariantToStringArrowBuilder<'a, StringViewBuilder>), |
65 | 69 | } |
66 | 70 |
|
67 | 71 | /// Builder for converting variant values into strongly typed Arrow arrays. |
@@ -104,6 +108,9 @@ impl<'a> PrimitiveVariantToArrowRowBuilder<'a> { |
104 | 108 | Time(b) => b.append_null(), |
105 | 109 | Date(b) => b.append_null(), |
106 | 110 | Uuid(b) => b.append_null(), |
| 111 | + String(b) => b.append_null(), |
| 112 | + LargeString(b) => b.append_null(), |
| 113 | + StringView(b) => b.append_null(), |
107 | 114 | } |
108 | 115 | } |
109 | 116 |
|
@@ -134,6 +141,9 @@ impl<'a> PrimitiveVariantToArrowRowBuilder<'a> { |
134 | 141 | Time(b) => b.append_value(value), |
135 | 142 | Date(b) => b.append_value(value), |
136 | 143 | Uuid(b) => b.append_value(value), |
| 144 | + String(b) => b.append_value(value), |
| 145 | + LargeString(b) => b.append_value(value), |
| 146 | + StringView(b) => b.append_value(value), |
137 | 147 | } |
138 | 148 | } |
139 | 149 |
|
@@ -164,6 +174,9 @@ impl<'a> PrimitiveVariantToArrowRowBuilder<'a> { |
164 | 174 | Time(b) => b.finish(), |
165 | 175 | Date(b) => b.finish(), |
166 | 176 | Uuid(b) => b.finish(), |
| 177 | + String(b) => b.finish(), |
| 178 | + LargeString(b) => b.finish(), |
| 179 | + StringView(b) => b.finish(), |
167 | 180 | } |
168 | 181 | } |
169 | 182 | } |
@@ -304,6 +317,11 @@ pub(crate) fn make_primitive_variant_to_arrow_row_builder<'a>( |
304 | 317 | "FixedSizeBinary({size}) is not a valid variant shredding type. Only FixedSizeBinary(16) for UUID is supported." |
305 | 318 | ))); |
306 | 319 | } |
| 320 | + DataType::Utf8 => String(VariantToStringArrowBuilder::new(cast_options, capacity)), |
| 321 | + DataType::LargeUtf8 => { |
| 322 | + LargeString(VariantToStringArrowBuilder::new(cast_options, capacity)) |
| 323 | + } |
| 324 | + DataType::Utf8View => StringView(VariantToStringArrowBuilder::new(cast_options, capacity)), |
307 | 325 | _ if data_type.is_primitive() => { |
308 | 326 | return Err(ArrowError::NotYetImplemented(format!( |
309 | 327 | "Primitive data_type {data_type:?} not yet implemented" |
@@ -451,6 +469,13 @@ macro_rules! define_variant_to_primitive_builder { |
451 | 469 | } |
452 | 470 | } |
453 | 471 |
|
| 472 | +define_variant_to_primitive_builder!( |
| 473 | + struct VariantToStringArrowBuilder<'a, B: StringLikeArrayBuilder> |
| 474 | + |capacity| -> B { B::with_capacity(capacity) }, |
| 475 | + |value| value.as_string(), |
| 476 | + type_name: B::type_name() |
| 477 | +); |
| 478 | + |
454 | 479 | define_variant_to_primitive_builder!( |
455 | 480 | struct VariantToBooleanArrowRowBuilder<'a> |
456 | 481 | |capacity| -> BooleanBuilder { BooleanBuilder::with_capacity(capacity) }, |
|
0 commit comments