df_interchange/
to_polars.rs1use paste::paste;
2use std::mem::transmute;
3
4use crate::{error::InterchangeError, ArrowArray, ArrowSchema, Interchange};
5
6macro_rules! ffi_to_polars {
7 ($to_ver:literal) => {
8 paste! {
9 impl Interchange {
10 #[doc = "Move Arrow data interchange format to Polars version `" $to_ver "`."]
11 pub fn [<to_polars_ $to_ver>](self) -> Result<[<polars_crate_ $to_ver>]::frame::DataFrame, InterchangeError> {
12
13 let num_cols = self.ffi.len();
15 let mut series = Vec::with_capacity(num_cols);
16
17 for s in self.ffi {
19
20 let num_chunks = s.1.len();
22 let mut chunks = Vec::with_capacity(num_chunks);
23
24 let name = s.0;
26
27 for c in s.1 {
29
30 let ffi_array = unsafe { transmute::<ArrowArray, [<polars_arrow_ $to_ver>]::ffi::ArrowArray>(c.0) };
32
33 let ffi_field = unsafe { transmute::<ArrowSchema, [<polars_arrow_ $to_ver>]::ffi::ArrowSchema>(c.1) };
35
36 let field = unsafe {
38 [<polars_arrow_ $to_ver>]::ffi::import_field_from_c(&ffi_field)
39 }?;
40
41 let array = unsafe {
43 [<polars_arrow_ $to_ver>]::ffi::import_array_from_c(ffi_array, field.dtype().clone(),
44 )
45 }?;
46
47 chunks.push(array);
49 }
50
51 series.push(
53 [<polars_crate_ $to_ver>]::series::Series::from_arrow_chunks(
54 name.into(),
55 chunks,
56 )?,
57 );
58 }
59
60 Ok([<polars_crate_ $to_ver>]::frame::DataFrame::from_iter(series))
62 }
63 }
64 }
65 };
66}
67
68#[cfg(feature = "polars_0_43")]
69ffi_to_polars!("0_43");
70
71#[cfg(feature = "polars_0_44")]
72ffi_to_polars!("0_44");
73
74#[cfg(feature = "polars_0_45")]
75ffi_to_polars!("0_45");
76
77#[cfg(feature = "polars_0_46")]
78ffi_to_polars!("0_46");
79
80#[cfg(feature = "polars_0_47")]
81ffi_to_polars!("0_47");
82
83#[cfg(feature = "polars_0_48")]
84ffi_to_polars!("0_48");
85
86#[cfg(feature = "polars_0_49")]
87ffi_to_polars!("0_49");
88
89#[cfg(feature = "polars_0_50")]
90ffi_to_polars!("0_50");
91
92macro_rules! ffi_to_polars {
93 ($to_ver:literal) => {
94 paste! {
95 impl Interchange {
96 #[doc = "Move Arrow data interchange format to Polars version `" $to_ver "`."]
97 pub fn [<to_polars_ $to_ver>](self) -> Result<[<polars_crate_ $to_ver>]::frame::DataFrame, InterchangeError> {
98
99 let num_cols = self.ffi.len();
101 let mut series = Vec::with_capacity(num_cols);
102
103 for s in self.ffi {
105
106 let num_chunks = s.1.len();
108 let mut chunks = Vec::with_capacity(num_chunks);
109
110 let name = s.0;
112
113 for c in s.1 {
115
116 let ffi_array = unsafe { transmute::<ArrowArray, [<polars_arrow_ $to_ver>]::ffi::ArrowArray>(c.0) };
118
119 let ffi_field = unsafe { transmute::<ArrowSchema, [<polars_arrow_ $to_ver>]::ffi::ArrowSchema>(c.1) };
121
122 let field = unsafe {
124 [<polars_arrow_ $to_ver>]::ffi::import_field_from_c(&ffi_field)
125 }?;
126
127 let array = unsafe {
129 [<polars_arrow_ $to_ver>]::ffi::import_array_from_c(ffi_array, field.data_type().clone(),
130 )
131 }?;
132
133 chunks.push(array);
135 }
136
137 series.push(
139 [<polars_crate_ $to_ver>]::series::Series::from_arrow_chunks(
140 &name,
141 chunks,
142 )?,
143 );
144 }
145
146 Ok([<polars_crate_ $to_ver>]::frame::DataFrame::from_iter(series))
148 }
149 }
150 }
151 };
152}
153
154#[cfg(feature = "polars_0_41")]
155ffi_to_polars!("0_41");
156
157#[cfg(feature = "polars_0_42")]
158ffi_to_polars!("0_42");
159
160macro_rules! ffi_to_polars {
161 ($to_ver:literal) => {
162 paste! {
163 impl Interchange {
164 #[doc = "Move Arrow data interchange format to Polars version `" $to_ver "`."]
165 pub fn [<to_polars_ $to_ver>](self) -> Result<[<polars_crate_ $to_ver>]::frame::DataFrame, InterchangeError> {
166
167 let num_cols = self.ffi.len();
169 let mut series = Vec::with_capacity(num_cols);
170
171 for s in self.ffi {
173
174 let num_chunks = s.1.len();
176 let mut chunks = Vec::with_capacity(num_chunks);
177
178 let name = s.0;
180
181 for c in s.1 {
183
184 let ffi_array = unsafe { transmute::<ArrowArray, [<polars_arrow_ $to_ver>]::ffi::ArrowArray>(c.0) };
186
187 let ffi_field = unsafe { transmute::<ArrowSchema, [<polars_arrow_ $to_ver>]::ffi::ArrowSchema>(c.1) };
189
190 let field = unsafe {
192 [<polars_arrow_ $to_ver>]::ffi::import_field_from_c(&ffi_field)
193 }?;
194
195 let array = unsafe {
197 [<polars_arrow_ $to_ver>]::ffi::import_array_from_c(ffi_array, field.data_type().clone(),
198 )
199 }?;
200
201 let series_chunk = [<polars_crate_ $to_ver>]::series::Series::from_arrow(
202 &name,
203 array,
204 )?;
205
206 chunks.push(series_chunk);
208 }
209
210 let mut chunk_iter = chunks.into_iter();
212 let mut full_series = chunk_iter.next().unwrap();
213 for c in chunk_iter {
214 full_series.append(&c)?;
215 }
216
217 series.push(
218 full_series,
219 );
220 }
221
222 Ok([<polars_crate_ $to_ver>]::frame::DataFrame::from_iter(series))
224 }
225 }
226 }
227 };
228}
229
230#[cfg(feature = "polars_0_40")]
231ffi_to_polars!("0_40");