selection/
selection.rs

1use minarrow::*;
2use minarrow::traits::selection::{FieldSelection, DataSelection};
3
4fn main() {
5    // Create a sample table
6    let table = create_sample_table();
7
8    println!("Original table:");
9    println!("{}\n", table);
10
11    // Table-specific API
12    println!("=== Table-specific API ===\n");
13
14    println!("table.c(&[\"name\", \"age\"]).r(1..4)");
15    let view1 = table.c(&["name", "age"]).r(1..4);
16    println!("{}\n", view1);
17
18    println!("table.c(&[0, 2]).r(&[0, 2, 4])");
19    let view2 = table.c(&[0, 2]).r(&[0, 2, 4]);
20    println!("{}\n", view2);
21
22    println!("table.c(0..2).r(0..5)");
23    let view3 = table.c(0..2).r(0..5);
24    println!("{}\n", view3);
25
26    println!("table.c(1).r(&[2, 4, 6])");
27    let view4 = table.c(1).r(&[2, 4, 6]);
28    println!("{}\n", view4);
29
30    // Aliased API
31    println!("=== Aliases ===\n");
32
33    println!("table.f(&[\"id\", \"age\"]).d(0..3)");
34    let view5 = table.f(&["id", "age"]).d(0..3);
35    println!("{}\n", view5);
36
37    println!("table.fields(&[\"name\"]).data(1..5)");
38    let view6 = table.fields(&["name"]).data(1..5);
39    println!("{}\n", view6);
40
41    println!("table.f(0..2).d(&[0, 3, 6, 9])");
42    let view7 = table.f(0..2).d(&[0, 3, 6, 9]);
43    println!("{}\n", view7);
44
45    println!("table.y(2).x(..5)");
46    let view8 = table.y(2).x(..5);
47    println!("{}\n", view8);
48
49    println!("table.fields(1..).data(5..)");
50    let view9 = table.fields(1..).data(5..);
51    println!("{}\n", view9);
52
53    // Materialise selections
54    println!("=== Materialisation ===\n");
55
56    println!("table.f(&[\"name\", \"age\"]).d(0..3).to_table()");
57    let view = table.f(&["name", "age"]).d(0..3);
58    let materialised = view.to_table();
59    println!("{}\n", materialised);
60
61    // Array and FieldArray selection
62    println!("=== Array & FieldArray Selection ===\n");
63
64    // Get a single column as FieldArray
65    let age_col = table.col(2).unwrap().clone();
66    println!("Original age column (FieldArray):");
67    println!("  Field: {} ({})", age_col.field.name, age_col.arrow_type());
68    println!("  Length: {}", age_col.len());
69    println!("  Values: {:?}\n", (0..age_col.len()).map(|i| age_col.array.inner::<IntegerArray<i32>>().get(i).unwrap()).collect::<Vec<_>>());
70
71    // Select specific rows from FieldArray using .d()
72    println!("age_col.d(&[1, 3, 5, 7])");
73    let age_view = age_col.d(&[1, 3, 5, 7]);
74    println!("  View length: {}", age_view.len());
75    println!("  Selected indices: {:?}\n", (0..age_view.len()).map(|i| age_view.get::<IntegerArray<i32>>(i).unwrap()).collect::<Vec<_>>());
76
77    // ArrayV selection (direct array view)
78    let id_array = Array::from_int32({
79        let mut arr = IntegerArray::<i32>::default();
80        for i in 0..10 {
81            arr.push(i * 10);
82        }
83        arr
84    });
85    let id_view = ArrayV::from(id_array);
86    println!("Original ArrayV:");
87    println!("  Length: {}", id_view.len());
88    println!("  Values: {:?}\n", (0..id_view.len()).map(|i| id_view.get::<IntegerArray<i32>>(i).unwrap()).collect::<Vec<_>>());
89
90    // Select from ArrayV using .data() and .x() aliases
91    println!("id_view.data(0..5)");
92    let id_selected1 = id_view.data(0..5);
93    println!("  Length: {}", id_selected1.len());
94    println!("  Values: {:?}\n", (0..id_selected1.len()).map(|i| id_selected1.get::<IntegerArray<i32>>(i).unwrap()).collect::<Vec<_>>());
95
96    println!("id_view.x(&[2, 4, 6, 8])");
97    let id_selected2 = id_view.x(&[2, 4, 6, 8]);
98    println!("  Length: {}", id_selected2.len());
99    println!("  Values: {:?}", (0..id_selected2.len()).map(|i| id_selected2.get::<IntegerArray<i32>>(i).unwrap()).collect::<Vec<_>>());
100}
101
102fn create_sample_table() -> Table {
103    // Create id column
104    let mut id_arr = IntegerArray::<i32>::default();
105    for i in 0..10 {
106        id_arr.push(i);
107    }
108
109    // Create name column
110    let mut name_arr = StringArray::<u32>::default();
111    let names = ["Alice", "Bob", "Charlie", "Diana", "Eve", "Frank", "Grace", "Henry", "Iris", "Jack"];
112    for name in names {
113        name_arr.push(name.to_string());
114    }
115
116    // Create age column
117    let mut age_arr = IntegerArray::<i32>::default();
118    for i in 0..10 {
119        age_arr.push(20 + (i * 3) as i32);
120    }
121
122    let col_id = FieldArray::from_arr("id", Array::from_int32(id_arr));
123    let col_name = FieldArray::from_arr("name", Array::from_string32(name_arr));
124    let col_age = FieldArray::from_arr("age", Array::from_int32(age_arr));
125
126    Table::new("People".to_string(), Some(vec![col_id, col_name, col_age]))
127}