selection/
selection.rs

1use minarrow::traits::selection::{ColumnSelection, RowSelection};
2use minarrow::*;
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.c(&["id", "age"]).r(0..3);
35    println!("{}\n", view5);
36
37    println!("table.fields(&[\"name\"]).data(1..5)");
38    let view6 = table.c(&["name"]).r(1..5);
39    println!("{}\n", view6);
40
41    println!("table.f(0..2).d(&[0, 3, 6, 9])");
42    let view7 = table.c(0..2).r(&[0, 3, 6, 9]);
43    println!("{}\n", view7);
44
45    println!("table.y(2).x(..5)");
46    let view8 = table.y(2).y(..5);
47    println!("{}\n", view8);
48
49    println!("table.fields(1..).data(5..)");
50    let view9 = table.c(1..).r(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.c(&["name", "age"]).r(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!("Age column (FieldArray):");
67    println!("  Field: {} ({})", age_col.field.name, age_col.arrow_type());
68    println!("  Length: {}", age_col.len());
69    println!(
70        "  Values: {:?}\n",
71        (0..age_col.len())
72            .map(|i| age_col.array.inner::<IntegerArray<i32>>().get(i).unwrap())
73            .collect::<Vec<_>>()
74    );
75
76    // Select specific rows from FieldArray using .d()
77    println!("age_col.d(&[1, 3, 5, 7])");
78    let age_view = age_col.r(&[1, 3, 5, 7]);
79    println!("  View length: {}", age_view.len());
80    println!(
81        "  Selected indices: {:?}\n",
82        (0..age_view.len())
83            .map(|i| age_view.get::<IntegerArray<i32>>(i).unwrap())
84            .collect::<Vec<_>>()
85    );
86
87    // ArrayV selection (direct array view)
88    let id_array = Array::from_int32({
89        let mut arr = IntegerArray::<i32>::default();
90        for i in 0..10 {
91            arr.push(i * 10);
92        }
93        arr
94    });
95    let id_view = ArrayV::from(id_array);
96    println!("ArrayV:");
97    println!("  Length: {}", id_view.len());
98    println!(
99        "  Values: {:?}\n",
100        (0..id_view.len())
101            .map(|i| id_view.get::<IntegerArray<i32>>(i).unwrap())
102            .collect::<Vec<_>>()
103    );
104
105    // Select from ArrayV using .data() and .x() aliases
106    println!("id_view.data(0..5)");
107    let id_selected1 = id_view.select_rows(0..5);
108    println!("  Length: {}", id_selected1.len());
109    println!(
110        "  Values: {:?}\n",
111        (0..id_selected1.len())
112            .map(|i| id_selected1.get::<IntegerArray<i32>>(i).unwrap())
113            .collect::<Vec<_>>()
114    );
115
116    println!("id_view.x(&[2, 4, 6, 8])");
117    let id_selected2 = id_view.y(&[2, 4, 6, 8]);
118    println!("  Length: {}", id_selected2.len());
119    println!(
120        "  Values: {:?}",
121        (0..id_selected2.len())
122            .map(|i| id_selected2.get::<IntegerArray<i32>>(i).unwrap())
123            .collect::<Vec<_>>()
124    );
125}
126
127fn create_sample_table() -> Table {
128    // Create id column
129    let mut id_arr = IntegerArray::<i32>::default();
130    for i in 0..10 {
131        id_arr.push(i);
132    }
133
134    // Create name column
135    let mut name_arr = StringArray::<u32>::default();
136    let names = [
137        "Alice", "Bob", "Charlie", "Diana", "Eve", "Frank", "Grace", "Henry", "Iris", "Jack",
138    ];
139    for name in names {
140        name_arr.push(name.to_string());
141    }
142
143    // Create age column
144    let mut age_arr = IntegerArray::<i32>::default();
145    for i in 0..10 {
146        age_arr.push(20 + (i * 3) as i32);
147    }
148
149    let col_id = FieldArray::from_arr("id", Array::from_int32(id_arr));
150    let col_name = FieldArray::from_arr("name", Array::from_string32(name_arr));
151    let col_age = FieldArray::from_arr("age", Array::from_int32(age_arr));
152
153    Table::new("People".to_string(), Some(vec![col_id, col_name, col_age]))
154}