1use std::collections::BTreeMap;
2
3use arrow_array::Array;
4use typed_arrow::{Map, OrderedMap, Record, bridge::ArrowBinding};
5
6#[derive(Record)]
7struct Row {
8 id: i32,
9 tags: Map<String, i32>,
10 notes: Option<Map<String, Option<String>>>, }
12
13fn main() {
14 let mut b = <Map<String, i32> as ArrowBinding>::new_builder(0);
16 <Map<String, i32> as ArrowBinding>::append_value(
17 &mut b,
18 &Map::new(vec![("a".to_string(), 1), ("b".to_string(), 2)]),
19 );
20 <Map<String, i32> as ArrowBinding>::append_null(&mut b);
21 let a = <Map<String, i32> as ArrowBinding>::finish(b);
22 println!(
23 "standalone map rows={}, entries={}",
24 a.len(),
25 a.entries().len()
26 );
27
28 let dt_sorted = <Map<String, i32, true> as ArrowBinding>::data_type();
30 println!("sorted map datatype = {dt_sorted:?}");
31
32 let mut ord = BTreeMap::new();
34 ord.insert("b".to_string(), 2);
35 ord.insert("a".to_string(), 1);
36 let mut ob = <OrderedMap<String, i32> as ArrowBinding>::new_builder(0);
37 <OrderedMap<String, i32> as ArrowBinding>::append_value(&mut ob, &OrderedMap::new(ord));
38 let oa = <OrderedMap<String, i32> as ArrowBinding>::finish(ob);
39 println!("ordered map entries={}", oa.entries().len());
40
41 let rows = vec![
43 Row {
44 id: 1,
45 tags: Map::new(vec![("x".to_string(), 10)]),
46 notes: Some(Map::new(vec![
47 ("hello".to_string(), Some("world".to_string())),
48 ("empty".to_string(), None),
49 ])),
50 },
51 Row {
52 id: 2,
53 tags: Map::new(vec![]),
54 notes: None,
55 },
56 ];
57 let mut rb = <Row as typed_arrow::schema::BuildRows>::new_builders(rows.len());
58 rb.append_rows(rows);
59 let arrays = rb.finish();
60 let batch = arrays.into_record_batch();
61 println!(
62 "record rows={}, fields={}",
63 batch.num_rows(),
64 batch.schema().fields().len()
65 );
66}