arrow2/array/utf8/
data.rs1use crate::array::{Arrow2Arrow, Utf8Array};
2use crate::bitmap::Bitmap;
3use crate::offset::{Offset, OffsetsBuffer};
4use arrow_data::{ArrayData, ArrayDataBuilder};
5
6impl<O: Offset> Arrow2Arrow for Utf8Array<O> {
7 fn to_data(&self) -> ArrayData {
8 let data_type = self.data_type().clone().into();
9 let builder = ArrayDataBuilder::new(data_type)
10 .len(self.offsets().len_proxy())
11 .buffers(vec![
12 self.offsets.clone().into_inner().into(),
13 self.values.clone().into(),
14 ])
15 .nulls(self.validity.as_ref().map(|b| b.clone().into()));
16
17 unsafe { builder.build_unchecked() }
19 }
20
21 fn from_data(data: &ArrayData) -> Self {
22 let data_type = data.data_type().clone().into();
23 if data.is_empty() {
24 return Self::new_empty(data_type);
26 }
27
28 let buffers = data.buffers();
29
30 let mut offsets = unsafe { OffsetsBuffer::new_unchecked(buffers[0].clone().into()) };
32 offsets.slice(data.offset(), data.len() + 1);
33
34 Self {
35 data_type,
36 offsets,
37 values: buffers[1].clone().into(),
38 validity: data.nulls().map(|n| Bitmap::from_null_buffer(n.clone())),
39 }
40 }
41}