Thanks to visit codestin.com
Credit goes to docs.rs

arrow2/array/map/
data.rs

1use crate::array::{from_data, to_data, Arrow2Arrow, MapArray};
2use crate::bitmap::Bitmap;
3use crate::offset::OffsetsBuffer;
4use arrow_data::{ArrayData, ArrayDataBuilder};
5
6impl Arrow2Arrow for MapArray {
7    fn to_data(&self) -> ArrayData {
8        let data_type = self.data_type.clone().into();
9
10        let builder = ArrayDataBuilder::new(data_type)
11            .len(self.len())
12            .buffers(vec![self.offsets.clone().into_inner().into()])
13            .nulls(self.validity.as_ref().map(|b| b.clone().into()))
14            .child_data(vec![to_data(self.field.as_ref())]);
15
16        // Safety: Array is valid
17        unsafe { builder.build_unchecked() }
18    }
19
20    fn from_data(data: &ArrayData) -> Self {
21        let data_type = data.data_type().clone().into();
22        if data.is_empty() {
23            // Handle empty offsets
24            return Self::new_empty(data_type);
25        }
26
27        let mut offsets = unsafe { OffsetsBuffer::new_unchecked(data.buffers()[0].clone().into()) };
28        offsets.slice(data.offset(), data.len() + 1);
29
30        Self {
31            data_type: data.data_type().clone().into(),
32            offsets,
33            field: from_data(&data.child_data()[0]),
34            validity: data.nulls().map(|n| Bitmap::from_null_buffer(n.clone())),
35        }
36    }
37}