Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-arrow/src/array/union/ffi.rs
6939 views
1
use polars_error::PolarsResult;
2
3
use super::super::Array;
4
use super::super::ffi::ToFfi;
5
use super::UnionArray;
6
use crate::array::FromFfi;
7
use crate::ffi;
8
9
unsafe impl ToFfi for UnionArray {
10
fn buffers(&self) -> Vec<Option<*const u8>> {
11
if let Some(offsets) = &self.offsets {
12
vec![
13
Some(self.types.storage_ptr().cast::<u8>()),
14
Some(offsets.storage_ptr().cast::<u8>()),
15
]
16
} else {
17
vec![Some(self.types.storage_ptr().cast::<u8>())]
18
}
19
}
20
21
fn children(&self) -> Vec<Box<dyn Array>> {
22
self.fields.clone()
23
}
24
25
fn offset(&self) -> Option<usize> {
26
Some(self.types.offset())
27
}
28
29
fn to_ffi_aligned(&self) -> Self {
30
self.clone()
31
}
32
}
33
34
impl<A: ffi::ArrowArrayRef> FromFfi<A> for UnionArray {
35
unsafe fn try_from_ffi(array: A) -> PolarsResult<Self> {
36
let dtype = array.dtype().clone();
37
let fields = Self::get_fields(&dtype);
38
39
let mut types = unsafe { array.buffer::<i8>(0) }?;
40
let offsets = if Self::is_sparse(&dtype) {
41
None
42
} else {
43
Some(unsafe { array.buffer::<i32>(1) }?)
44
};
45
46
let length = array.array().len();
47
let offset = array.array().offset();
48
let fields = (0..fields.len())
49
.map(|index| {
50
let child = array.child(index)?;
51
ffi::try_from(child)
52
})
53
.collect::<PolarsResult<Vec<Box<dyn Array>>>>()?;
54
55
if offset > 0 {
56
types.slice(offset, length);
57
};
58
59
Self::try_new(dtype, types, fields, offsets)
60
}
61
}
62
63