@@ -17,9 +17,19 @@ use std::sync::Arc;
1717use arrow_array:: make_array;
1818use arrow_array:: Array ;
1919use arrow_array:: ArrowPrimitiveType ;
20+ use arrow_array:: BooleanArray ;
21+ use arrow_array:: Int16Array ;
22+ use arrow_array:: Int32Array ;
23+ use arrow_array:: Int64Array ;
24+ use arrow_array:: Int8Array ;
2025use arrow_array:: LargeStringArray ;
2126use arrow_array:: NullArray ;
2227use arrow_array:: PrimitiveArray ;
28+ use arrow_array:: StringArray ;
29+ use arrow_array:: UInt16Array ;
30+ use arrow_array:: UInt32Array ;
31+ use arrow_array:: UInt64Array ;
32+ use arrow_array:: UInt8Array ;
2333use arrow_buffer:: i256;
2434use arrow_buffer:: ArrowNativeType ;
2535use arrow_buffer:: Buffer ;
@@ -28,12 +38,15 @@ use arrow_data::ArrayDataBuilder;
2838use arrow_schema:: ArrowError ;
2939use arrow_schema:: DataType ;
3040use arrow_schema:: TimeUnit ;
41+ use common_arrow:: arrow:: bitmap:: Bitmap ;
3142use common_arrow:: arrow:: buffer:: Buffer as Buffer2 ;
3243use common_arrow:: arrow:: Either ;
3344use ordered_float:: OrderedFloat ;
3445
3546use crate :: types:: decimal:: DecimalColumn ;
47+ use crate :: types:: nullable:: NullableColumn ;
3648use crate :: types:: number:: NumberColumn ;
49+ use crate :: types:: string:: StringColumn ;
3750use crate :: Column ;
3851
3952fn try_take_buffer < T : Clone > ( buffer : Buffer2 < T > ) -> Vec < T > {
@@ -65,6 +78,14 @@ impl Column {
6578 Column :: Null { len } => Arc :: new ( NullArray :: new ( len) ) ,
6679 Column :: EmptyArray { len } => Arc :: new ( NullArray :: new ( len) ) ,
6780 Column :: EmptyMap { len } => Arc :: new ( NullArray :: new ( len) ) ,
81+ Column :: Boolean ( bitmap) => {
82+ let buf = bitmap. as_slice ( ) . 0 ;
83+ let array_data = ArrayData :: builder ( DataType :: Boolean )
84+ . len ( bitmap. len ( ) )
85+ . add_buffer ( buf. into ( ) )
86+ . build ( ) ?;
87+ Arc :: new ( BooleanArray :: from ( array_data) )
88+ }
6889 Column :: String ( col) => {
6990 let len = col. len ( ) ;
7091 let values: Vec < u8 > = try_take_buffer ( col. data ) ;
@@ -160,10 +181,108 @@ impl Column {
160181 _ => {
161182 let data_type = self . data_type ( ) ;
162183 Err ( ArrowError :: NotYetImplemented ( format ! (
163- "Column::into_arrow_rs() for {data_type} not implemented yet"
184+ "Column::into_arrow_rs() for {data_type} not implemented yet"
164185 ) ) ) ?
165186 }
166187 } ;
167188 Ok ( array)
168189 }
190+
191+ pub fn from_arrow_rs ( array : Arc < dyn Array > ) -> Result < Self , ArrowError > {
192+ let data_type = array. data_type ( ) ;
193+ let column = match data_type {
194+ DataType :: Null => Column :: Null { len : array. len ( ) } ,
195+ DataType :: LargeUtf8 => {
196+ let array = array. as_any ( ) . downcast_ref :: < LargeStringArray > ( ) . unwrap ( ) ;
197+ let offsets = array. value_offsets ( ) . to_vec ( ) ;
198+ let offsets = unsafe { std:: mem:: transmute :: < Vec < i64 > , Vec < u64 > > ( offsets) } ;
199+ Column :: String ( StringColumn {
200+ offsets : offsets. into ( ) ,
201+ data : array. value_data ( ) . to_vec ( ) . into ( ) ,
202+ } )
203+ }
204+ DataType :: Utf8 => {
205+ let array = array. as_any ( ) . downcast_ref :: < StringArray > ( ) . unwrap ( ) ;
206+ let offsets = array
207+ . value_offsets ( )
208+ . iter ( )
209+ . map ( |x| * x as u64 )
210+ . collect :: < Vec < _ > > ( ) ;
211+ Column :: String ( StringColumn {
212+ offsets : offsets. into ( ) ,
213+ data : array. value_data ( ) . to_vec ( ) . into ( ) ,
214+ } )
215+ }
216+ DataType :: Boolean => {
217+ let array = array. as_any ( ) . downcast_ref :: < BooleanArray > ( ) . unwrap ( ) ;
218+ let bytes = array. values ( ) . clone ( ) . into_vec ( ) . map_err ( |_| {
219+ ArrowError :: CastError (
220+ "can not covert Buffer of BooleanArray to Vec" . to_string ( ) ,
221+ )
222+ } ) ?;
223+ let bitmap = Bitmap :: try_new ( bytes, array. len ( ) ) . map_err ( |e| {
224+ ArrowError :: CastError ( format ! (
225+ "can not covert BooleanArray to Column::Boolean: {e:?}"
226+ ) )
227+ } ) ?;
228+ Column :: Boolean ( bitmap)
229+ }
230+ DataType :: Int8 => {
231+ let array = array. as_any ( ) . downcast_ref :: < Int8Array > ( ) . unwrap ( ) ;
232+ let buffer2: Buffer2 < i8 > = array. values ( ) . to_vec ( ) . into ( ) ;
233+ Column :: Number ( NumberColumn :: Int8 ( buffer2) )
234+ }
235+ DataType :: UInt8 => {
236+ let array = array. as_any ( ) . downcast_ref :: < UInt8Array > ( ) . unwrap ( ) ;
237+ let buffer2: Buffer2 < u8 > = array. values ( ) . to_vec ( ) . into ( ) ;
238+ Column :: Number ( NumberColumn :: UInt8 ( buffer2) )
239+ }
240+ DataType :: Int16 => {
241+ let array = array. as_any ( ) . downcast_ref :: < Int16Array > ( ) . unwrap ( ) ;
242+ let buffer2: Buffer2 < i16 > = array. values ( ) . to_vec ( ) . into ( ) ;
243+ Column :: Number ( NumberColumn :: Int16 ( buffer2) )
244+ }
245+ DataType :: UInt16 => {
246+ let array = array. as_any ( ) . downcast_ref :: < UInt16Array > ( ) . unwrap ( ) ;
247+ let buffer2: Buffer2 < u16 > = array. values ( ) . to_vec ( ) . into ( ) ;
248+ Column :: Number ( NumberColumn :: UInt16 ( buffer2) )
249+ }
250+ DataType :: Int32 => {
251+ let array = array. as_any ( ) . downcast_ref :: < Int32Array > ( ) . unwrap ( ) ;
252+ let buffer2: Buffer2 < i32 > = array. values ( ) . to_vec ( ) . into ( ) ;
253+ Column :: Number ( NumberColumn :: Int32 ( buffer2) )
254+ }
255+ DataType :: UInt32 => {
256+ let array = array. as_any ( ) . downcast_ref :: < UInt32Array > ( ) . unwrap ( ) ;
257+ let buffer2: Buffer2 < u32 > = array. values ( ) . to_vec ( ) . into ( ) ;
258+ Column :: Number ( NumberColumn :: UInt32 ( buffer2) )
259+ }
260+ DataType :: Int64 => {
261+ let array = array. as_any ( ) . downcast_ref :: < Int64Array > ( ) . unwrap ( ) ;
262+ let buffer2: Buffer2 < i64 > = array. values ( ) . to_vec ( ) . into ( ) ;
263+ Column :: Number ( NumberColumn :: Int64 ( buffer2) )
264+ }
265+ DataType :: UInt64 => {
266+ let array = array. as_any ( ) . downcast_ref :: < UInt64Array > ( ) . unwrap ( ) ;
267+ let buffer2: Buffer2 < u64 > = array. values ( ) . to_vec ( ) . into ( ) ;
268+ Column :: Number ( NumberColumn :: UInt64 ( buffer2) )
269+ }
270+
271+ _ => Err ( ArrowError :: NotYetImplemented ( format ! (
272+ "Column::from_arrow_rs() for {data_type} not implemented yet"
273+ ) ) ) ?,
274+ } ;
275+ if let Some ( nulls) = array. into_data ( ) . nulls ( ) {
276+ let validity =
277+ Bitmap :: try_new ( nulls. buffer ( ) . to_vec ( ) , nulls. offset ( ) ) . map_err ( |e| {
278+ ArrowError :: CastError ( format ! (
279+ "fail to cast arrow_rs::NullBuffer to arrow2::Bitmap: {e}"
280+ ) )
281+ } ) ?;
282+ let column = NullableColumn { column, validity } ;
283+ Ok ( Column :: Nullable ( Box :: new ( column) ) )
284+ } else {
285+ Ok ( column)
286+ }
287+ }
169288}
0 commit comments