Skip to content

Commit 1621350

Browse files
authored
Support Utf8View in JSON serialization (#6651)
1 parent 5dd2b47 commit 1621350

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed

arrow-json/src/writer/encoder.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ fn make_encoder_impl<'a>(
8080
let array = array.as_string::<i64>();
8181
(Box::new(StringEncoder(array)) as _, array.nulls().cloned())
8282
}
83+
DataType::Utf8View => {
84+
let array = array.as_string_view();
85+
(Box::new(StringViewEncoder(array)) as _, array.nulls().cloned())
86+
}
8387
DataType::List(_) => {
8488
let array = array.as_list::<i32>();
8589
(Box::new(ListEncoder::try_new(array, options)?) as _, array.nulls().cloned())
@@ -311,6 +315,14 @@ impl<O: OffsetSizeTrait> Encoder for StringEncoder<'_, O> {
311315
}
312316
}
313317

318+
struct StringViewEncoder<'a>(&'a StringViewArray);
319+
320+
impl Encoder for StringViewEncoder<'_> {
321+
fn encode(&mut self, idx: usize, out: &mut Vec<u8>) {
322+
encode_string(self.0.value(idx), out);
323+
}
324+
}
325+
314326
struct ListEncoder<'a, O: OffsetSizeTrait> {
315327
offsets: OffsetBuffer<O>,
316328
nulls: Option<NullBuffer>,

arrow-json/src/writer/mod.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -462,16 +462,22 @@ mod tests {
462462
}
463463

464464
#[test]
465-
fn write_large_utf8() {
465+
fn write_large_utf8_and_utf8_view() {
466466
let schema = Schema::new(vec![
467467
Field::new("c1", DataType::Utf8, true),
468468
Field::new("c2", DataType::LargeUtf8, true),
469+
Field::new("c3", DataType::Utf8View, true),
469470
]);
470471

471472
let a = StringArray::from(vec![Some("a"), None, Some("c"), Some("d"), None]);
472473
let b = LargeStringArray::from(vec![Some("a"), Some("b"), None, Some("d"), None]);
474+
let c = StringViewArray::from(vec![Some("a"), Some("b"), None, Some("d"), None]);
473475

474-
let batch = RecordBatch::try_new(Arc::new(schema), vec![Arc::new(a), Arc::new(b)]).unwrap();
476+
let batch = RecordBatch::try_new(
477+
Arc::new(schema),
478+
vec![Arc::new(a), Arc::new(b), Arc::new(c)],
479+
)
480+
.unwrap();
475481

476482
let mut buf = Vec::new();
477483
{
@@ -481,10 +487,10 @@ mod tests {
481487

482488
assert_json_eq(
483489
&buf,
484-
r#"{"c1":"a","c2":"a"}
485-
{"c2":"b"}
490+
r#"{"c1":"a","c2":"a","c3":"a"}
491+
{"c2":"b","c3":"b"}
486492
{"c1":"c"}
487-
{"c1":"d","c2":"d"}
493+
{"c1":"d","c2":"d","c3":"d"}
488494
{}
489495
"#,
490496
);

0 commit comments

Comments
 (0)