use std::collections::BTreeMap;
use arrow_array::Array;
use typed_arrow::{Map, OrderedMap, Record, arrow_array, bridge::ArrowBinding};
#[derive(Record)]
struct Row {
id: i32,
tags: Map<String, i32>,
notes: Option<Map<String, Option<String>>>, }
fn main() {
let mut b = <Map<String, i32> as ArrowBinding>::new_builder(0);
<Map<String, i32> as ArrowBinding>::append_value(
&mut b,
&Map::new(vec![("a".to_string(), 1), ("b".to_string(), 2)]),
);
<Map<String, i32> as ArrowBinding>::append_null(&mut b);
let a = <Map<String, i32> as ArrowBinding>::finish(b);
println!(
"standalone map rows={}, entries={}",
a.len(),
a.entries().len()
);
let dt_sorted = <Map<String, i32, true> as ArrowBinding>::data_type();
println!("sorted map datatype = {dt_sorted:?}");
let mut ord = BTreeMap::new();
ord.insert("b".to_string(), 2);
ord.insert("a".to_string(), 1);
let mut ob = <OrderedMap<String, i32> as ArrowBinding>::new_builder(0);
<OrderedMap<String, i32> as ArrowBinding>::append_value(&mut ob, &OrderedMap::new(ord));
let oa = <OrderedMap<String, i32> as ArrowBinding>::finish(ob);
println!("ordered map entries={}", oa.entries().len());
let rows = vec![
Row {
id: 1,
tags: Map::new(vec![("x".to_string(), 10)]),
notes: Some(Map::new(vec![
("hello".to_string(), Some("world".to_string())),
("empty".to_string(), None),
])),
},
Row {
id: 2,
tags: Map::new(vec![]),
notes: None,
},
];
let mut rb = <Row as typed_arrow::schema::BuildRows>::new_builders(rows.len());
rb.append_rows(rows);
let arrays = rb.finish();
let batch = arrays.into_record_batch();
println!(
"record rows={}, fields={}",
batch.num_rows(),
batch.schema().fields().len()
);
}