@@ -3354,14 +3354,169 @@ mod tests {
33543354 back[ 0 ] . to_data ( ) . validate_full ( ) . unwrap ( ) ;
33553355 }
33563356
3357+ fn test_nested_list_view < O : OffsetSizeTrait > ( ) {
3358+ let mut builder = GenericListViewBuilder :: < O , _ > :: new ( GenericListViewBuilder :: < O , _ > :: new (
3359+ Int32Builder :: new ( ) ,
3360+ ) ) ;
3361+
3362+ // Row 0: [[1, 2], [1, null]]
3363+ builder. values ( ) . values ( ) . append_value ( 1 ) ;
3364+ builder. values ( ) . values ( ) . append_value ( 2 ) ;
3365+ builder. values ( ) . append ( true ) ;
3366+ builder. values ( ) . values ( ) . append_value ( 1 ) ;
3367+ builder. values ( ) . values ( ) . append_null ( ) ;
3368+ builder. values ( ) . append ( true ) ;
3369+ builder. append ( true ) ;
3370+
3371+ // Row 1: [[1, null], [1, null]]
3372+ builder. values ( ) . values ( ) . append_value ( 1 ) ;
3373+ builder. values ( ) . values ( ) . append_null ( ) ;
3374+ builder. values ( ) . append ( true ) ;
3375+ builder. values ( ) . values ( ) . append_value ( 1 ) ;
3376+ builder. values ( ) . values ( ) . append_null ( ) ;
3377+ builder. values ( ) . append ( true ) ;
3378+ builder. append ( true ) ;
3379+
3380+ // Row 2: [[1, null], null]
3381+ builder. values ( ) . values ( ) . append_value ( 1 ) ;
3382+ builder. values ( ) . values ( ) . append_null ( ) ;
3383+ builder. values ( ) . append ( true ) ;
3384+ builder. values ( ) . append ( false ) ;
3385+ builder. append ( true ) ;
3386+
3387+ // Row 3: null
3388+ builder. append ( false ) ;
3389+
3390+ // Row 4: [[1, 2]]
3391+ builder. values ( ) . values ( ) . append_value ( 1 ) ;
3392+ builder. values ( ) . values ( ) . append_value ( 2 ) ;
3393+ builder. values ( ) . append ( true ) ;
3394+ builder. append ( true ) ;
3395+
3396+ let list = Arc :: new ( builder. finish ( ) ) as ArrayRef ;
3397+ let d = list. data_type ( ) . clone ( ) ;
3398+
3399+ // [
3400+ // [[1, 2], [1, null]],
3401+ // [[1, null], [1, null]],
3402+ // [[1, null], null]
3403+ // null
3404+ // [[1, 2]]
3405+ // ]
3406+ let options = SortOptions :: default ( ) . asc ( ) . with_nulls_first ( true ) ;
3407+ let field = SortField :: new_with_options ( d. clone ( ) , options) ;
3408+ let converter = RowConverter :: new ( vec ! [ field] ) . unwrap ( ) ;
3409+ let rows = converter. convert_columns ( & [ Arc :: clone ( & list) ] ) . unwrap ( ) ;
3410+
3411+ assert ! ( rows. row( 0 ) > rows. row( 1 ) ) ;
3412+ assert ! ( rows. row( 1 ) > rows. row( 2 ) ) ;
3413+ assert ! ( rows. row( 2 ) > rows. row( 3 ) ) ;
3414+ assert ! ( rows. row( 4 ) < rows. row( 0 ) ) ;
3415+ assert ! ( rows. row( 4 ) > rows. row( 1 ) ) ;
3416+
3417+ let back = converter. convert_rows ( & rows) . unwrap ( ) ;
3418+ assert_eq ! ( back. len( ) , 1 ) ;
3419+ back[ 0 ] . to_data ( ) . validate_full ( ) . unwrap ( ) ;
3420+
3421+ // Verify the content matches (ListView may have different physical layout but same logical content)
3422+ let back_list_view = back[ 0 ]
3423+ . as_any ( )
3424+ . downcast_ref :: < GenericListViewArray < O > > ( )
3425+ . unwrap ( ) ;
3426+ let orig_list_view = list
3427+ . as_any ( )
3428+ . downcast_ref :: < GenericListViewArray < O > > ( )
3429+ . unwrap ( ) ;
3430+
3431+ assert_eq ! ( back_list_view. len( ) , orig_list_view. len( ) ) ;
3432+ for i in 0 ..back_list_view. len ( ) {
3433+ assert_eq ! ( back_list_view. is_valid( i) , orig_list_view. is_valid( i) ) ;
3434+ if back_list_view. is_valid ( i) {
3435+ assert_eq ! ( & back_list_view. value( i) , & orig_list_view. value( i) ) ;
3436+ }
3437+ }
3438+
3439+ let options = SortOptions :: default ( ) . desc ( ) . with_nulls_first ( true ) ;
3440+ let field = SortField :: new_with_options ( d. clone ( ) , options) ;
3441+ let converter = RowConverter :: new ( vec ! [ field] ) . unwrap ( ) ;
3442+ let rows = converter. convert_columns ( & [ Arc :: clone ( & list) ] ) . unwrap ( ) ;
3443+
3444+ assert ! ( rows. row( 0 ) > rows. row( 1 ) ) ;
3445+ assert ! ( rows. row( 1 ) > rows. row( 2 ) ) ;
3446+ assert ! ( rows. row( 2 ) > rows. row( 3 ) ) ;
3447+ assert ! ( rows. row( 4 ) > rows. row( 0 ) ) ;
3448+ assert ! ( rows. row( 4 ) > rows. row( 1 ) ) ;
3449+
3450+ let back = converter. convert_rows ( & rows) . unwrap ( ) ;
3451+ assert_eq ! ( back. len( ) , 1 ) ;
3452+ back[ 0 ] . to_data ( ) . validate_full ( ) . unwrap ( ) ;
3453+
3454+ // Verify the content matches
3455+ let back_list_view = back[ 0 ]
3456+ . as_any ( )
3457+ . downcast_ref :: < GenericListViewArray < O > > ( )
3458+ . unwrap ( ) ;
3459+
3460+ assert_eq ! ( back_list_view. len( ) , orig_list_view. len( ) ) ;
3461+ for i in 0 ..back_list_view. len ( ) {
3462+ assert_eq ! ( back_list_view. is_valid( i) , orig_list_view. is_valid( i) ) ;
3463+ if back_list_view. is_valid ( i) {
3464+ assert_eq ! ( & back_list_view. value( i) , & orig_list_view. value( i) ) ;
3465+ }
3466+ }
3467+
3468+ let options = SortOptions :: default ( ) . desc ( ) . with_nulls_first ( false ) ;
3469+ let field = SortField :: new_with_options ( d. clone ( ) , options) ;
3470+ let converter = RowConverter :: new ( vec ! [ field] ) . unwrap ( ) ;
3471+ let rows = converter. convert_columns ( & [ Arc :: clone ( & list) ] ) . unwrap ( ) ;
3472+
3473+ assert ! ( rows. row( 0 ) < rows. row( 1 ) ) ;
3474+ assert ! ( rows. row( 1 ) < rows. row( 2 ) ) ;
3475+ assert ! ( rows. row( 2 ) < rows. row( 3 ) ) ;
3476+ assert ! ( rows. row( 4 ) > rows. row( 0 ) ) ;
3477+ assert ! ( rows. row( 4 ) < rows. row( 1 ) ) ;
3478+
3479+ let back = converter. convert_rows ( & rows) . unwrap ( ) ;
3480+ assert_eq ! ( back. len( ) , 1 ) ;
3481+ back[ 0 ] . to_data ( ) . validate_full ( ) . unwrap ( ) ;
3482+
3483+ // Verify the content matches
3484+ let back_list_view = back[ 0 ]
3485+ . as_any ( )
3486+ . downcast_ref :: < GenericListViewArray < O > > ( )
3487+ . unwrap ( ) ;
3488+
3489+ assert_eq ! ( back_list_view. len( ) , orig_list_view. len( ) ) ;
3490+ for i in 0 ..back_list_view. len ( ) {
3491+ assert_eq ! ( back_list_view. is_valid( i) , orig_list_view. is_valid( i) ) ;
3492+ if back_list_view. is_valid ( i) {
3493+ assert_eq ! ( & back_list_view. value( i) , & orig_list_view. value( i) ) ;
3494+ }
3495+ }
3496+
3497+ let sliced_list = list. slice ( 1 , 3 ) ;
3498+ let rows = converter
3499+ . convert_columns ( & [ Arc :: clone ( & sliced_list) ] )
3500+ . unwrap ( ) ;
3501+
3502+ assert ! ( rows. row( 0 ) < rows. row( 1 ) ) ;
3503+ assert ! ( rows. row( 1 ) < rows. row( 2 ) ) ;
3504+
3505+ let back = converter. convert_rows ( & rows) . unwrap ( ) ;
3506+ assert_eq ! ( back. len( ) , 1 ) ;
3507+ back[ 0 ] . to_data ( ) . validate_full ( ) . unwrap ( ) ;
3508+ }
3509+
33573510 #[ test]
33583511 fn test_list_view ( ) {
33593512 test_single_list_view :: < i32 > ( ) ;
3513+ test_nested_list_view :: < i32 > ( ) ;
33603514 }
33613515
33623516 #[ test]
33633517 fn test_large_list_view ( ) {
33643518 test_single_list_view :: < i64 > ( ) ;
3519+ test_nested_list_view :: < i64 > ( ) ;
33653520 }
33663521
33673522 fn test_list_view_with_shared_values < O : OffsetSizeTrait > ( ) {
0 commit comments