1+ use arrow:: array:: Array ;
2+ use parquet_variant_compute:: VariantArrayBuilder ;
3+ use parquet_variant:: VariantBuilder ;
4+
5+ fn main ( ) {
6+ // Create some sample data with fields to remove
7+ let mut builder = VariantArrayBuilder :: new ( 2 ) ;
8+
9+ // Row 1: User with temporary data
10+ {
11+ let mut variant_builder = VariantBuilder :: new ( ) ;
12+ {
13+ let mut obj = variant_builder. new_object ( ) ;
14+ obj. insert ( "name" , "Alice" ) ;
15+ obj. insert ( "age" , 30i32 ) ;
16+ obj. insert ( "temp_session" , "abc123" ) ;
17+ obj. insert ( "debug_info" , "temporary debug data" ) ;
18+
19+ {
20+ let mut address = obj. new_object ( "address" ) ;
21+ address. insert ( "city" , "New York" ) ;
22+ address. insert ( "zip" , "10001" ) ;
23+ address. insert ( "temp_geocode" , "40.7128,-74.0060" ) ;
24+ let _ = address. finish ( ) ;
25+ }
26+
27+ let _ = obj. finish ( ) ;
28+ }
29+ let ( metadata, value) = variant_builder. finish ( ) ;
30+ builder. append_variant_buffers ( & metadata, & value) ;
31+ }
32+
33+ // Row 2: Another user with temporary data
34+ {
35+ let mut variant_builder = VariantBuilder :: new ( ) ;
36+ {
37+ let mut obj = variant_builder. new_object ( ) ;
38+ obj. insert ( "name" , "Bob" ) ;
39+ obj. insert ( "age" , 25i32 ) ;
40+ obj. insert ( "temp_session" , "def456" ) ;
41+ obj. insert ( "debug_info" , "more temporary data" ) ;
42+
43+ {
44+ let mut address = obj. new_object ( "address" ) ;
45+ address. insert ( "city" , "San Francisco" ) ;
46+ address. insert ( "zip" , "94102" ) ;
47+ address. insert ( "temp_geocode" , "37.7749,-122.4194" ) ;
48+ let _ = address. finish ( ) ;
49+ }
50+
51+ let _ = obj. finish ( ) ;
52+ }
53+ let ( metadata, value) = variant_builder. finish ( ) ;
54+ builder. append_variant_buffers ( & metadata, & value) ;
55+ }
56+
57+ let array = builder. finish ( ) ;
58+
59+ println ! ( "=== Field Removal Examples ===" ) ;
60+
61+ // Show original data
62+ println ! ( "Original data:" ) ;
63+ for i in 0 ..array. len ( ) {
64+ let variant = array. value ( i) ;
65+ if let Some ( obj) = variant. as_object ( ) {
66+ let name = obj. get ( "name" ) . unwrap ( ) . as_string ( ) . unwrap ( ) . to_string ( ) ;
67+ let session = obj. get ( "temp_session" ) . map ( |v| v. as_string ( ) . unwrap ( ) . to_string ( ) ) . unwrap_or ( "None" . to_string ( ) ) ;
68+ let debug = obj. get ( "debug_info" ) . map ( |v| v. as_string ( ) . unwrap ( ) . to_string ( ) ) . unwrap_or ( "None" . to_string ( ) ) ;
69+ println ! ( " {}: session={}, debug={}" , name, session, debug) ;
70+ }
71+ }
72+
73+ // Remove temporary session field
74+ let cleaned_array = array. with_field_removed ( "temp_session" ) . unwrap ( ) ;
75+
76+ println ! ( "\n Removing temporary session fields..." ) ;
77+ println ! ( "After removing temp_session:" ) ;
78+ for i in 0 ..cleaned_array. len ( ) {
79+ let variant = cleaned_array. value ( i) ;
80+ if let Some ( obj) = variant. as_object ( ) {
81+ let name = obj. get ( "name" ) . unwrap ( ) . as_string ( ) . unwrap ( ) . to_string ( ) ;
82+ let session = obj. get ( "temp_session" ) . map ( |v| v. as_string ( ) . unwrap ( ) . to_string ( ) ) . unwrap_or ( "None" . to_string ( ) ) ;
83+ let debug = obj. get ( "debug_info" ) . map ( |v| v. as_string ( ) . unwrap ( ) . to_string ( ) ) . unwrap_or ( "None" . to_string ( ) ) ;
84+ println ! ( " {}: session={}, debug={}" , name, session, debug) ;
85+ }
86+ }
87+
88+ // Remove multiple temporary fields
89+ let final_array = cleaned_array. with_fields_removed ( & [ "debug_info" , "temp_session" ] ) . unwrap ( ) ;
90+
91+ println ! ( "\n Removing multiple temporary fields..." ) ;
92+ println ! ( "Final clean data:" ) ;
93+ for i in 0 ..final_array. len ( ) {
94+ let variant = final_array. value ( i) ;
95+ if let Some ( obj) = variant. as_object ( ) {
96+ let name = obj. get ( "name" ) . unwrap ( ) . as_string ( ) . unwrap ( ) . to_string ( ) ;
97+ let age = obj. get ( "age" ) . unwrap ( ) . as_int32 ( ) . unwrap ( ) ;
98+
99+ if let Some ( address) = obj. get ( "address" ) {
100+ if let Some ( addr_obj) = address. as_object ( ) {
101+ let city = addr_obj. get ( "city" ) . unwrap ( ) . as_string ( ) . unwrap ( ) . to_string ( ) ;
102+ let zip = addr_obj. get ( "zip" ) . unwrap ( ) . as_string ( ) . unwrap ( ) . to_string ( ) ;
103+ let geocode = addr_obj. get ( "temp_geocode" ) . map ( |v| format ! ( "Some(ShortString(ShortString(\" {}\" )))" , v. as_string( ) . unwrap( ) ) ) . unwrap_or ( "None" . to_string ( ) ) ;
104+ println ! ( " {}: age={}, city={}, zip={}, geocode={}" , name, age, city, zip, geocode) ;
105+ }
106+ }
107+ }
108+ }
109+
110+ println ! ( "\n === Performance Features ===" ) ;
111+ println ! ( "✓ Efficient field removal at byte level" ) ;
112+ println ! ( "✓ Support for nested field removal" ) ;
113+ println ! ( "✓ Batch operations for cleaning multiple fields" ) ;
114+ println ! ( "✓ Maintains data integrity during field removal" ) ;
115+ println ! ( "✓ Foundation for data governance and privacy compliance" ) ;
116+ }
0 commit comments