vortex_array/arrow/
record_batch.rs1use arrow_array::RecordBatch;
5use arrow_array::cast::AsArray;
6use arrow_schema::DataType;
7use arrow_schema::Schema;
8use vortex_error::VortexResult;
9
10use crate::LEGACY_SESSION;
11use crate::VortexSessionExecute;
12use crate::array::IntoArray;
13use crate::arrays::StructArray;
14use crate::arrow::ArrowArrayExecutor;
15
16impl StructArray {
17 pub fn into_record_batch_with_schema(
18 self,
19 schema: impl AsRef<Schema>,
20 ) -> VortexResult<RecordBatch> {
21 let data_type = DataType::Struct(schema.as_ref().fields.clone());
22 let array_ref = self
23 .into_array()
24 .execute_arrow(Some(&data_type), &mut LEGACY_SESSION.create_execution_ctx())?;
25 Ok(RecordBatch::from(array_ref.as_struct()))
26 }
27}
28
29#[cfg(test)]
30mod tests {
31 use std::sync::Arc;
32
33 use arrow_schema::DataType;
34 use arrow_schema::Field;
35 use arrow_schema::FieldRef;
36 use arrow_schema::Schema;
37
38 use crate::arrow::record_batch::StructArray;
39 use crate::builders::ArrayBuilder;
40 use crate::builders::ListBuilder;
41 use crate::dtype::DType;
42 use crate::dtype::Nullability;
43 use crate::dtype::PType;
44 use crate::scalar::Scalar;
45
46 #[test]
47 fn test_into_rb_with_schema() {
48 let mut xs = ListBuilder::<u32>::new(
49 Arc::new(DType::Primitive(PType::I32, Nullability::NonNullable)),
50 Nullability::Nullable,
51 );
52
53 xs.append_scalar(&Scalar::list(
54 xs.element_dtype().clone(),
55 vec![1i32.into(), 2i32.into(), 3i32.into()],
56 Nullability::Nullable,
57 ))
58 .unwrap();
59 xs.append_null();
60 xs.append_zero();
61
62 let xs = xs.finish();
63
64 let array = StructArray::from_fields(&[("xs", xs)]).unwrap();
65
66 let arrow_schema = Arc::new(Schema::new(vec![Field::new(
68 "xs",
69 DataType::LargeListView(FieldRef::new(Field::new_list_field(DataType::Int32, false))),
70 true,
71 )]));
72 let rb = array.into_record_batch_with_schema(arrow_schema).unwrap();
73
74 let xs = rb.column(0);
75 assert_eq!(
76 xs.data_type(),
77 &DataType::LargeListView(FieldRef::new(Field::new_list_field(DataType::Int32, false)))
78 );
79 }
80}