1
+ use parquet_variant_compute:: { VariantArrayBuilder , VariantPath } ;
2
+ use parquet_variant:: VariantBuilder ;
3
+
4
+ fn main ( ) {
5
+ // Create some sample data
6
+ let mut builder = VariantArrayBuilder :: new ( 2 ) ;
7
+
8
+ // Row 1: User Alice
9
+ {
10
+ let mut variant_builder = VariantBuilder :: new ( ) ;
11
+ {
12
+ let mut obj = variant_builder. new_object ( ) ;
13
+ obj. insert ( "name" , "Alice" ) ;
14
+ obj. insert ( "age" , 30i32 ) ;
15
+
16
+ {
17
+ let mut address = obj. new_object ( "address" ) ;
18
+ address. insert ( "city" , "New York" ) ;
19
+ address. insert ( "zip" , "10001" ) ;
20
+ let _ = address. finish ( ) ;
21
+ }
22
+
23
+ {
24
+ let mut hobbies = obj. new_list ( "hobbies" ) ;
25
+ hobbies. append_value ( "reading" ) ;
26
+ hobbies. append_value ( "hiking" ) ;
27
+ hobbies. append_value ( "cooking" ) ;
28
+ hobbies. finish ( ) ;
29
+ }
30
+
31
+ obj. finish ( ) . unwrap ( ) ;
32
+ }
33
+ let ( metadata, value) = variant_builder. finish ( ) ;
34
+ builder. append_variant_buffers ( & metadata, & value) ;
35
+ }
36
+
37
+ // Row 2: User Bob
38
+ {
39
+ let mut variant_builder = VariantBuilder :: new ( ) ;
40
+ {
41
+ let mut obj = variant_builder. new_object ( ) ;
42
+ obj. insert ( "name" , "Bob" ) ;
43
+ obj. insert ( "age" , 25i32 ) ;
44
+
45
+ {
46
+ let mut address = obj. new_object ( "address" ) ;
47
+ address. insert ( "city" , "San Francisco" ) ;
48
+ address. insert ( "zip" , "94102" ) ;
49
+ let _ = address. finish ( ) ;
50
+ }
51
+
52
+ {
53
+ let mut hobbies = obj. new_list ( "hobbies" ) ;
54
+ hobbies. append_value ( "swimming" ) ;
55
+ hobbies. append_value ( "gaming" ) ;
56
+ hobbies. finish ( ) ;
57
+ }
58
+
59
+ obj. finish ( ) . unwrap ( ) ;
60
+ }
61
+ let ( metadata, value) = variant_builder. finish ( ) ;
62
+ builder. append_variant_buffers ( & metadata, & value) ;
63
+ }
64
+
65
+ let variant_array = builder. build ( ) ;
66
+
67
+ // Demonstrate path access functionality
68
+ println ! ( "=== Path Access Examples ===" ) ;
69
+
70
+ // 1. Single field access
71
+ let name_path = VariantPath :: field ( "name" ) ;
72
+ let alice_name = variant_array. get_path ( 0 , & name_path) . unwrap ( ) ;
73
+ println ! ( "Alice's name: {}" , alice_name. as_string( ) . unwrap( ) ) ;
74
+
75
+ // 2. Nested field access
76
+ let city_path = VariantPath :: field ( "address" ) . push_field ( "city" ) ;
77
+ let alice_city = variant_array. get_path ( 0 , & city_path) . unwrap ( ) ;
78
+ let bob_city = variant_array. get_path ( 1 , & city_path) . unwrap ( ) ;
79
+ println ! ( "Alice's city: {}" , alice_city. as_string( ) . unwrap( ) ) ;
80
+ println ! ( "Bob's city: {}" , bob_city. as_string( ) . unwrap( ) ) ;
81
+
82
+ // 3. Array index access
83
+ let hobby_path = VariantPath :: field ( "hobbies" ) . push_index ( 0 ) ;
84
+ let alice_first_hobby = variant_array. get_path ( 0 , & hobby_path) . unwrap ( ) ;
85
+ let bob_first_hobby = variant_array. get_path ( 1 , & hobby_path) . unwrap ( ) ;
86
+ println ! ( "Alice's first hobby: {}" , alice_first_hobby. as_string( ) . unwrap( ) ) ;
87
+ println ! ( "Bob's first hobby: {}" , bob_first_hobby. as_string( ) . unwrap( ) ) ;
88
+
89
+ // 4. Multiple field extraction
90
+ let paths = vec ! [
91
+ VariantPath :: field( "name" ) ,
92
+ VariantPath :: field( "age" ) ,
93
+ VariantPath :: field( "address" ) . push_field( "city" ) ,
94
+ ] ;
95
+
96
+ let alice_data = variant_array. get_paths ( 0 , & paths) ;
97
+ println ! ( "Alice's data: name={}, age={}, city={}" ,
98
+ alice_data[ 0 ] . as_ref( ) . unwrap( ) . as_string( ) . unwrap( ) ,
99
+ alice_data[ 1 ] . as_ref( ) . unwrap( ) . as_int32( ) . unwrap( ) ,
100
+ alice_data[ 2 ] . as_ref( ) . unwrap( ) . as_string( ) . unwrap( ) ) ;
101
+
102
+ // 5. Column-wise extraction
103
+ let names = variant_array. extract_field ( & VariantPath :: field ( "name" ) ) ;
104
+ println ! ( "All names: {:?}" , names. iter( ) . map( |v| v. as_ref( ) . unwrap( ) . as_string( ) . unwrap( ) ) . collect:: <Vec <_>>( ) ) ;
105
+
106
+ println ! ( "=== Performance Benefit ===" ) ;
107
+ println ! ( "✓ Direct field access without reconstructing entire variants" ) ;
108
+ println ! ( "✓ Efficient batch operations for analytical workloads" ) ;
109
+ println ! ( "✓ Foundation for shredding/unshredding operations" ) ;
110
+ }
0 commit comments