#![allow(clippy::float_cmp)]
use arrow_array::{
Array,
cast::{as_primitive_array, as_string_array, as_struct_array},
types::{Float64Type, Int32Type},
};
use typed_arrow::prelude::*;
#[derive(Record)]
pub struct Geo {
pub lat: f64,
pub lon: f64,
}
#[derive(Record)]
pub struct Address {
pub city: String,
pub zip: Option<i32>,
pub geo: Option<Geo>,
}
#[derive(Record)]
pub struct Company {
pub name: String,
pub hq: Option<Address>,
}
#[derive(Record)]
pub struct PersonDeep {
pub id: i64,
pub company: Option<Company>,
pub address: Option<Address>,
pub scores: Option<typed_arrow::List<Option<i32>>>,
}
#[test]
fn deep_nested_schema_and_usage() {
let rows = vec![
PersonDeep {
id: 1,
company: Some(Company {
name: "Acme".into(),
hq: Some(Address {
city: "NYC".into(),
zip: None,
geo: Some(Geo {
lat: 40.7128,
lon: -74.0060,
}),
}),
}),
address: None,
scores: Some(typed_arrow::List::new(vec![Some(10), None, Some(20)])),
},
PersonDeep {
id: 2,
company: None,
address: Some(Address {
city: "SF".into(),
zip: Some(94107),
geo: None,
}),
scores: None,
},
PersonDeep {
id: 3,
company: Some(Company {
name: "Globex".into(),
hq: None,
}),
address: Some(Address {
city: "LA".into(),
zip: None,
geo: Some(Geo {
lat: 34.0522,
lon: -118.2437,
}),
}),
scores: Some(typed_arrow::List::new(vec![])),
},
];
let mut b = <PersonDeep as BuildRows>::new_builders(rows.len());
b.append_rows(rows);
let arrays = b.finish();
assert_eq!(<PersonDeep as Record>::LEN, 4);
let company = arrays.company; assert_eq!(company.len(), 3);
assert!(company.is_valid(0));
assert!(company.is_null(1));
assert!(company.is_valid(2));
let c_name = as_string_array(company.column(0));
assert_eq!(c_name.value(0), "Acme");
assert_eq!(c_name.value(2), "Globex");
let hq = as_struct_array(company.column(1));
assert!(hq.is_valid(0)); assert!(hq.is_null(1)); assert!(hq.is_null(2));
let hq_city = as_string_array(hq.column(0));
assert_eq!(hq_city.value(0), "NYC");
let hq_zip = as_primitive_array::<Int32Type>(hq.column(1));
assert!(hq_zip.is_null(0));
let hq_geo = as_struct_array(hq.column(2));
assert!(hq_geo.is_valid(0));
let lat = as_primitive_array::<Float64Type>(hq_geo.column(0));
let lon = as_primitive_array::<Float64Type>(hq_geo.column(1));
assert_eq!(lat.value(0), 40.7128);
assert_eq!(lon.value(0), -74.0060);
let addr = arrays.address; assert!(addr.is_null(0));
assert!(addr.is_valid(1));
assert!(addr.is_valid(2));
let a_city = as_string_array(addr.column(0));
assert_eq!(a_city.value(1), "SF");
assert_eq!(a_city.value(2), "LA");
let a_geo = as_struct_array(addr.column(2));
assert!(a_geo.is_null(1));
assert!(a_geo.is_valid(2));
let a_lat = as_primitive_array::<Float64Type>(a_geo.column(0));
let a_lon = as_primitive_array::<Float64Type>(a_geo.column(1));
assert_eq!(a_lat.value(2), 34.0522);
assert_eq!(a_lon.value(2), -118.2437);
let scores = arrays.scores; assert_eq!(scores.len(), 3);
assert_eq!(scores.value_length(0), 3);
assert!(scores.is_null(1));
assert_eq!(scores.value_length(2), 0);
}