@@ -1551,7 +1551,8 @@ mod tests {
1551
1551
use core:: str;
1552
1552
use rand:: distributions:: uniform:: SampleUniform ;
1553
1553
use std:: { fs:: File , sync:: Arc } ;
1554
-
1554
+ #[ cfg( feature = "encryption" ) ]
1555
+ use crate :: encryption:: encrypt:: EncryptionKey ;
1555
1556
use super :: * ;
1556
1557
1557
1558
#[ test]
@@ -3481,6 +3482,101 @@ mod tests {
3481
3482
assert_eq ! ( row_count, file_metadata. num_rows( ) as usize ) ;
3482
3483
}
3483
3484
3485
+ #[ cfg( feature = "encryption" ) ]
3486
+ #[ test]
3487
+ fn test_write_encrypted_column_non_uniform ( ) {
3488
+ let message_type = "
3489
+ message test_schema {
3490
+ OPTIONAL BYTE_ARRAY a (UTF8);
3491
+ }
3492
+ " ;
3493
+ let schema = Arc :: new ( parse_message_type ( message_type) . unwrap ( ) ) ;
3494
+ let data = vec ! [ ByteArray :: from( b"parquet" . to_vec( ) ) ; 7 ] ;
3495
+ let def_levels = [ 1 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 1 ] ;
3496
+
3497
+ let num_row_groups = 3 ;
3498
+ let num_batches = 3 ;
3499
+ let rows_per_batch = def_levels. len ( ) ;
3500
+ let valid_rows_per_batch = def_levels. iter ( ) . filter ( |& level| * level > 0 ) . count ( ) ;
3501
+
3502
+ let file: File = tempfile:: tempfile ( ) . unwrap ( ) ;
3503
+
3504
+ let builder = WriterProperties :: builder ( ) ;
3505
+ let footer_key: & [ u8 ] = "0123456789012345" . as_bytes ( ) ;
3506
+ let column_key = EncryptionKey :: new ( b"1234567890123450" . to_vec ( ) ) ;
3507
+ let file_encryption_properties =
3508
+ FileEncryptionProperties :: builder ( footer_key. to_vec ( ) )
3509
+ . with_column_key ( b"a" . to_vec ( ) , column_key. clone ( ) ) . build ( ) ;
3510
+
3511
+ let props = Arc :: new (
3512
+ builder
3513
+ . with_file_encryption_properties ( file_encryption_properties)
3514
+ . set_data_page_row_count_limit ( rows_per_batch)
3515
+ . build ( ) ,
3516
+ ) ;
3517
+ let mut writer = SerializedFileWriter :: new ( & file, schema, props) . unwrap ( ) ;
3518
+ for _ in 0 ..num_row_groups {
3519
+ let mut row_group_writer = writer. next_row_group ( ) . unwrap ( ) ;
3520
+ let mut col_writer = row_group_writer. next_column ( ) . unwrap ( ) . unwrap ( ) ;
3521
+
3522
+ for _ in 0 ..num_batches {
3523
+ col_writer
3524
+ . typed :: < ByteArrayType > ( )
3525
+ . write_batch ( & data, Some ( & def_levels) , None )
3526
+ . unwrap ( ) ;
3527
+ }
3528
+
3529
+ col_writer. close ( ) . unwrap ( ) ;
3530
+ row_group_writer. close ( ) . unwrap ( ) ;
3531
+ }
3532
+
3533
+ let _file_metadata = writer. close ( ) . unwrap ( ) ;
3534
+
3535
+ let decryption_properties = FileDecryptionProperties :: builder ( footer_key. to_vec ( ) )
3536
+ . with_column_key ( b"a" . to_vec ( ) , column_key. key ( ) . clone ( ) )
3537
+ . build ( )
3538
+ . unwrap ( ) ;
3539
+ let options = ArrowReaderOptions :: default ( )
3540
+ . with_file_decryption_properties ( decryption_properties. clone ( ) ) ;
3541
+ let metadata = ArrowReaderMetadata :: load ( & file, options. clone ( ) ) . unwrap ( ) ;
3542
+ let file_metadata = metadata. metadata . file_metadata ( ) ;
3543
+
3544
+ let builder = ParquetRecordBatchReaderBuilder :: try_new_with_options ( file, options) . unwrap ( ) ;
3545
+ let record_reader = builder. build ( ) . unwrap ( ) ;
3546
+
3547
+ assert_eq ! (
3548
+ file_metadata. num_rows( ) ,
3549
+ ( num_row_groups * num_batches * rows_per_batch) as i64
3550
+ ) ;
3551
+ assert_eq ! ( file_metadata. schema_descr( ) . num_columns( ) , 1 ) ;
3552
+
3553
+ assert_eq ! ( metadata. metadata. num_row_groups( ) , num_row_groups) ;
3554
+ metadata. metadata . row_groups ( ) . iter ( ) . for_each ( |rg| {
3555
+ assert_eq ! ( rg. num_columns( ) , 1 ) ;
3556
+ assert_eq ! ( rg. num_rows( ) , ( num_batches * rows_per_batch) as i64 ) ;
3557
+ } ) ;
3558
+
3559
+ let mut row_count = 0 ;
3560
+ for batch in record_reader {
3561
+ let batch = batch. unwrap ( ) ;
3562
+ row_count += batch. num_rows ( ) ;
3563
+
3564
+ let string_col = batch. column ( 0 ) . as_string_opt :: < i32 > ( ) . unwrap ( ) ;
3565
+
3566
+ let mut valid_count = 0 ;
3567
+ for x in string_col. iter ( ) . flatten ( ) {
3568
+ valid_count += 1 ;
3569
+ assert_eq ! ( x, "parquet" ) ;
3570
+ }
3571
+ assert_eq ! (
3572
+ valid_count,
3573
+ valid_rows_per_batch * num_batches * num_row_groups
3574
+ ) ;
3575
+ }
3576
+
3577
+ assert_eq ! ( row_count, file_metadata. num_rows( ) as usize ) ;
3578
+ }
3579
+
3484
3580
#[ test]
3485
3581
fn test_increment_max_binary_chars ( ) {
3486
3582
let r = increment ( vec ! [ 0xFF , 0xFE , 0xFD , 0xFF , 0xFF ] ) ;
0 commit comments