@@ -498,10 +498,10 @@ impl LevelInfoBuilder {
498
498
def_levels. reserve ( len) ;
499
499
info. non_null_indices . reserve ( len) ;
500
500
501
- match info. array . logical_nulls ( ) {
501
+ match & info. logical_nulls {
502
502
Some ( nulls) => {
503
503
assert ! ( range. end <= nulls. len( ) ) ;
504
- let nulls = nulls. into_inner ( ) ;
504
+ let nulls = nulls. inner ( ) ;
505
505
def_levels. extend ( range. clone ( ) . map ( |i| {
506
506
// Safety: range.end was asserted to be in bounds earlier
507
507
let valid = unsafe { nulls. value_unchecked ( i) } ;
@@ -568,6 +568,9 @@ pub(crate) struct ArrayLevels {
568
568
569
569
/// The arrow array
570
570
array : ArrayRef ,
571
+
572
+ /// cached logical nulls of the array.
573
+ logical_nulls : Option < NullBuffer > ,
571
574
}
572
575
573
576
impl PartialEq for ArrayLevels {
@@ -578,6 +581,7 @@ impl PartialEq for ArrayLevels {
578
581
&& self . max_def_level == other. max_def_level
579
582
&& self . max_rep_level == other. max_rep_level
580
583
&& self . array . as_ref ( ) == other. array . as_ref ( )
584
+ && self . logical_nulls . as_ref ( ) == other. logical_nulls . as_ref ( )
581
585
}
582
586
}
583
587
impl Eq for ArrayLevels { }
@@ -590,13 +594,16 @@ impl ArrayLevels {
590
594
false => ctx. def_level ,
591
595
} ;
592
596
597
+ let logical_nulls = array. logical_nulls ( ) ;
598
+
593
599
Self {
594
600
def_levels : ( max_def_level != 0 ) . then ( Vec :: new) ,
595
601
rep_levels : ( max_rep_level != 0 ) . then ( Vec :: new) ,
596
602
non_null_indices : vec ! [ ] ,
597
603
max_def_level,
598
604
max_rep_level,
599
605
array,
606
+ logical_nulls,
600
607
}
601
608
}
602
609
@@ -670,6 +677,7 @@ mod tests {
670
677
max_def_level : 2 ,
671
678
max_rep_level : 2 ,
672
679
array : Arc :: new ( primitives) ,
680
+ logical_nulls : None ,
673
681
} ;
674
682
assert_eq ! ( & levels[ 0 ] , & expected) ;
675
683
}
@@ -690,6 +698,7 @@ mod tests {
690
698
max_def_level : 0 ,
691
699
max_rep_level : 0 ,
692
700
array,
701
+ logical_nulls : None ,
693
702
} ;
694
703
assert_eq ! ( & levels[ 0 ] , & expected_levels) ;
695
704
}
@@ -709,13 +718,15 @@ mod tests {
709
718
let levels = calculate_array_levels ( & array, & field) . unwrap ( ) ;
710
719
assert_eq ! ( levels. len( ) , 1 ) ;
711
720
721
+ let logical_nulls = array. logical_nulls ( ) ;
712
722
let expected_levels = ArrayLevels {
713
723
def_levels : Some ( vec ! [ 1 , 0 , 1 , 1 , 0 ] ) ,
714
724
rep_levels : None ,
715
725
non_null_indices : vec ! [ 0 , 2 , 3 ] ,
716
726
max_def_level : 1 ,
717
727
max_rep_level : 0 ,
718
728
array,
729
+ logical_nulls,
719
730
} ;
720
731
assert_eq ! ( & levels[ 0 ] , & expected_levels) ;
721
732
}
@@ -750,6 +761,7 @@ mod tests {
750
761
max_def_level : 1 ,
751
762
max_rep_level : 1 ,
752
763
array : Arc :: new ( leaf_array) ,
764
+ logical_nulls : None ,
753
765
} ;
754
766
assert_eq ! ( & levels[ 0 ] , & expected_levels) ;
755
767
@@ -783,6 +795,7 @@ mod tests {
783
795
max_def_level : 2 ,
784
796
max_rep_level : 1 ,
785
797
array : Arc :: new ( leaf_array) ,
798
+ logical_nulls : None ,
786
799
} ;
787
800
assert_eq ! ( & levels[ 0 ] , & expected_levels) ;
788
801
}
@@ -832,6 +845,7 @@ mod tests {
832
845
max_def_level : 3 ,
833
846
max_rep_level : 1 ,
834
847
array : Arc :: new ( leaf) ,
848
+ logical_nulls : None ,
835
849
} ;
836
850
837
851
assert_eq ! ( & levels[ 0 ] , & expected_levels) ;
@@ -882,6 +896,7 @@ mod tests {
882
896
max_def_level : 5 ,
883
897
max_rep_level : 2 ,
884
898
array : Arc :: new ( leaf) ,
899
+ logical_nulls : None ,
885
900
} ;
886
901
887
902
assert_eq ! ( & levels[ 0 ] , & expected_levels) ;
@@ -919,6 +934,7 @@ mod tests {
919
934
max_def_level : 1 ,
920
935
max_rep_level : 1 ,
921
936
array : Arc :: new ( leaf) ,
937
+ logical_nulls : None ,
922
938
} ;
923
939
assert_eq ! ( & levels[ 0 ] , & expected_levels) ;
924
940
@@ -951,6 +967,7 @@ mod tests {
951
967
max_def_level : 3 ,
952
968
max_rep_level : 1 ,
953
969
array : Arc :: new ( leaf) ,
970
+ logical_nulls : None ,
954
971
} ;
955
972
assert_eq ! ( & levels[ 0 ] , & expected_levels) ;
956
973
@@ -999,6 +1016,7 @@ mod tests {
999
1016
max_def_level : 5 ,
1000
1017
max_rep_level : 2 ,
1001
1018
array : Arc :: new ( leaf) ,
1019
+ logical_nulls : None ,
1002
1020
} ;
1003
1021
assert_eq ! ( & levels[ 0 ] , & expected_levels) ;
1004
1022
}
@@ -1031,13 +1049,15 @@ mod tests {
1031
1049
let levels = calculate_array_levels ( & a_array, & a_field) . unwrap ( ) ;
1032
1050
assert_eq ! ( levels. len( ) , 1 ) ;
1033
1051
1052
+ let logical_nulls = leaf. logical_nulls ( ) ;
1034
1053
let expected_levels = ArrayLevels {
1035
1054
def_levels : Some ( vec ! [ 3 , 2 , 3 , 1 , 0 , 3 ] ) ,
1036
1055
rep_levels : None ,
1037
1056
non_null_indices : vec ! [ 0 , 2 , 5 ] ,
1038
1057
max_def_level : 3 ,
1039
1058
max_rep_level : 0 ,
1040
1059
array : leaf,
1060
+ logical_nulls,
1041
1061
} ;
1042
1062
assert_eq ! ( & levels[ 0 ] , & expected_levels) ;
1043
1063
}
@@ -1077,6 +1097,7 @@ mod tests {
1077
1097
max_def_level : 3 ,
1078
1098
max_rep_level : 1 ,
1079
1099
array : Arc :: new ( a_values) ,
1100
+ logical_nulls : None ,
1080
1101
} ;
1081
1102
assert_eq ! ( list_level, & expected_level) ;
1082
1103
}
@@ -1169,45 +1190,52 @@ mod tests {
1169
1190
max_def_level : 0 ,
1170
1191
max_rep_level : 0 ,
1171
1192
array : Arc :: new ( a) ,
1193
+ logical_nulls : None ,
1172
1194
} ;
1173
1195
assert_eq ! ( list_level, & expected_level) ;
1174
1196
1175
1197
// test "b" levels
1176
1198
let list_level = levels. get ( 1 ) . unwrap ( ) ;
1177
1199
1200
+ let b_logical_nulls = b. logical_nulls ( ) ;
1178
1201
let expected_level = ArrayLevels {
1179
1202
def_levels : Some ( vec ! [ 1 , 0 , 0 , 1 , 1 ] ) ,
1180
1203
rep_levels : None ,
1181
1204
non_null_indices : vec ! [ 0 , 3 , 4 ] ,
1182
1205
max_def_level : 1 ,
1183
1206
max_rep_level : 0 ,
1184
1207
array : Arc :: new ( b) ,
1208
+ logical_nulls : b_logical_nulls,
1185
1209
} ;
1186
1210
assert_eq ! ( list_level, & expected_level) ;
1187
1211
1188
1212
// test "d" levels
1189
1213
let list_level = levels. get ( 2 ) . unwrap ( ) ;
1190
1214
1215
+ let d_logical_nulls = d. logical_nulls ( ) ;
1191
1216
let expected_level = ArrayLevels {
1192
1217
def_levels : Some ( vec ! [ 1 , 1 , 1 , 2 , 1 ] ) ,
1193
1218
rep_levels : None ,
1194
1219
non_null_indices : vec ! [ 3 ] ,
1195
1220
max_def_level : 2 ,
1196
1221
max_rep_level : 0 ,
1197
1222
array : Arc :: new ( d) ,
1223
+ logical_nulls : d_logical_nulls,
1198
1224
} ;
1199
1225
assert_eq ! ( list_level, & expected_level) ;
1200
1226
1201
1227
// test "f" levels
1202
1228
let list_level = levels. get ( 3 ) . unwrap ( ) ;
1203
1229
1230
+ let f_logical_nulls = f. logical_nulls ( ) ;
1204
1231
let expected_level = ArrayLevels {
1205
1232
def_levels : Some ( vec ! [ 3 , 2 , 3 , 2 , 3 ] ) ,
1206
1233
rep_levels : None ,
1207
1234
non_null_indices : vec ! [ 0 , 2 , 4 ] ,
1208
1235
max_def_level : 3 ,
1209
1236
max_rep_level : 0 ,
1210
1237
array : Arc :: new ( f) ,
1238
+ logical_nulls : f_logical_nulls,
1211
1239
} ;
1212
1240
assert_eq ! ( list_level, & expected_level) ;
1213
1241
}
@@ -1303,6 +1331,7 @@ mod tests {
1303
1331
assert_eq ! ( levels. len( ) , 2 ) ;
1304
1332
1305
1333
let map = batch. column ( 0 ) . as_map ( ) ;
1334
+ let map_keys_logical_nulls = map. keys ( ) . logical_nulls ( ) ;
1306
1335
1307
1336
// test key levels
1308
1337
let list_level = & levels[ 0 ] ;
@@ -1314,11 +1343,13 @@ mod tests {
1314
1343
max_def_level : 1 ,
1315
1344
max_rep_level : 1 ,
1316
1345
array : map. keys ( ) . clone ( ) ,
1346
+ logical_nulls : map_keys_logical_nulls,
1317
1347
} ;
1318
1348
assert_eq ! ( list_level, & expected_level) ;
1319
1349
1320
1350
// test values levels
1321
1351
let list_level = levels. get ( 1 ) . unwrap ( ) ;
1352
+ let map_values_logical_nulls = map. values ( ) . logical_nulls ( ) ;
1322
1353
1323
1354
let expected_level = ArrayLevels {
1324
1355
def_levels : Some ( vec ! [ 2 , 2 , 2 , 1 , 2 , 1 , 2 ] ) ,
@@ -1327,6 +1358,7 @@ mod tests {
1327
1358
max_def_level : 2 ,
1328
1359
max_rep_level : 1 ,
1329
1360
array : map. values ( ) . clone ( ) ,
1361
+ logical_nulls : map_values_logical_nulls,
1330
1362
} ;
1331
1363
assert_eq ! ( list_level, & expected_level) ;
1332
1364
}
@@ -1405,13 +1437,15 @@ mod tests {
1405
1437
let levels = calculate_array_levels ( rb. column ( 0 ) , rb. schema ( ) . field ( 0 ) ) . unwrap ( ) ;
1406
1438
let list_level = & levels[ 0 ] ;
1407
1439
1440
+ let logical_nulls = values. logical_nulls ( ) ;
1408
1441
let expected_level = ArrayLevels {
1409
1442
def_levels : Some ( vec ! [ 4 , 1 , 0 , 2 , 2 , 3 , 4 ] ) ,
1410
1443
rep_levels : Some ( vec ! [ 0 , 0 , 0 , 0 , 1 , 0 , 0 ] ) ,
1411
1444
non_null_indices : vec ! [ 0 , 4 ] ,
1412
1445
max_def_level : 4 ,
1413
1446
max_rep_level : 1 ,
1414
1447
array : values,
1448
+ logical_nulls,
1415
1449
} ;
1416
1450
1417
1451
assert_eq ! ( list_level, & expected_level) ;
@@ -1445,13 +1479,15 @@ mod tests {
1445
1479
1446
1480
assert_eq ! ( levels. len( ) , 1 ) ;
1447
1481
1482
+ let logical_nulls = values. logical_nulls ( ) ;
1448
1483
let expected_level = ArrayLevels {
1449
1484
def_levels : Some ( vec ! [ 4 , 4 , 3 , 2 , 0 , 4 , 4 , 0 , 1 ] ) ,
1450
1485
rep_levels : Some ( vec ! [ 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 ] ) ,
1451
1486
non_null_indices : vec ! [ 0 , 1 , 5 , 6 ] ,
1452
1487
max_def_level : 4 ,
1453
1488
max_rep_level : 1 ,
1454
1489
array : values,
1490
+ logical_nulls,
1455
1491
} ;
1456
1492
1457
1493
assert_eq ! ( & levels[ 0 ] , & expected_level) ;
@@ -1530,24 +1566,28 @@ mod tests {
1530
1566
1531
1567
assert_eq ! ( levels. len( ) , 2 ) ;
1532
1568
1569
+ let a1_logical_nulls = a1_values. logical_nulls ( ) ;
1533
1570
let expected_level = ArrayLevels {
1534
1571
def_levels : Some ( vec ! [ 0 , 0 , 1 , 6 , 5 , 2 , 3 , 1 ] ) ,
1535
1572
rep_levels : Some ( vec ! [ 0 , 0 , 0 , 0 , 2 , 0 , 1 , 0 ] ) ,
1536
1573
non_null_indices : vec ! [ 1 ] ,
1537
1574
max_def_level : 6 ,
1538
1575
max_rep_level : 2 ,
1539
1576
array : a1_values,
1577
+ logical_nulls : a1_logical_nulls,
1540
1578
} ;
1541
1579
1542
1580
assert_eq ! ( & levels[ 0 ] , & expected_level) ;
1543
1581
1582
+ let a2_logical_nulls = a2_values. logical_nulls ( ) ;
1544
1583
let expected_level = ArrayLevels {
1545
1584
def_levels : Some ( vec ! [ 0 , 0 , 1 , 3 , 2 , 4 , 1 ] ) ,
1546
1585
rep_levels : Some ( vec ! [ 0 , 0 , 0 , 0 , 0 , 1 , 0 ] ) ,
1547
1586
non_null_indices : vec ! [ 4 ] ,
1548
1587
max_def_level : 4 ,
1549
1588
max_rep_level : 1 ,
1550
1589
array : a2_values,
1590
+ logical_nulls : a2_logical_nulls,
1551
1591
} ;
1552
1592
1553
1593
assert_eq ! ( & levels[ 1 ] , & expected_level) ;
@@ -1579,13 +1619,15 @@ mod tests {
1579
1619
1580
1620
let list_level = & levels[ 0 ] ;
1581
1621
1622
+ let logical_nulls = values. logical_nulls ( ) ;
1582
1623
let expected_level = ArrayLevels {
1583
1624
def_levels : Some ( vec ! [ 0 , 0 , 3 , 3 ] ) ,
1584
1625
rep_levels : Some ( vec ! [ 0 , 0 , 0 , 1 ] ) ,
1585
1626
non_null_indices : vec ! [ 6 , 7 ] ,
1586
1627
max_def_level : 3 ,
1587
1628
max_rep_level : 1 ,
1588
1629
array : values,
1630
+ logical_nulls,
1589
1631
} ;
1590
1632
assert_eq ! ( list_level, & expected_level) ;
1591
1633
}
@@ -1729,22 +1771,26 @@ mod tests {
1729
1771
let b_levels = & levels[ 1 ] ;
1730
1772
1731
1773
// [[{a: 1}, null], null, [null, null], [{a: null}, {a: 2}]]
1774
+ let values_a_logical_nulls = values_a. logical_nulls ( ) ;
1732
1775
let expected_a = ArrayLevels {
1733
1776
def_levels : Some ( vec ! [ 4 , 2 , 0 , 2 , 2 , 3 , 4 ] ) ,
1734
1777
rep_levels : Some ( vec ! [ 0 , 1 , 0 , 0 , 1 , 0 , 1 ] ) ,
1735
1778
non_null_indices : vec ! [ 0 , 7 ] ,
1736
1779
max_def_level : 4 ,
1737
1780
max_rep_level : 1 ,
1738
1781
array : values_a,
1782
+ logical_nulls : values_a_logical_nulls,
1739
1783
} ;
1740
1784
// [[{b: 2}, null], null, [null, null], [{b: 3}, {b: 4}]]
1785
+ let values_b_logical_nulls = values_b. logical_nulls ( ) ;
1741
1786
let expected_b = ArrayLevels {
1742
1787
def_levels : Some ( vec ! [ 3 , 2 , 0 , 2 , 2 , 3 , 3 ] ) ,
1743
1788
rep_levels : Some ( vec ! [ 0 , 1 , 0 , 0 , 1 , 0 , 1 ] ) ,
1744
1789
non_null_indices : vec ! [ 0 , 6 , 7 ] ,
1745
1790
max_def_level : 3 ,
1746
1791
max_rep_level : 1 ,
1747
1792
array : values_b,
1793
+ logical_nulls : values_b_logical_nulls,
1748
1794
} ;
1749
1795
1750
1796
assert_eq ! ( a_levels, & expected_a) ;
@@ -1769,13 +1815,15 @@ mod tests {
1769
1815
1770
1816
let list_level = & levels[ 0 ] ;
1771
1817
1818
+ let logical_nulls = values. logical_nulls ( ) ;
1772
1819
let expected_level = ArrayLevels {
1773
1820
def_levels : Some ( vec ! [ 1 , 0 , 1 ] ) ,
1774
1821
rep_levels : Some ( vec ! [ 0 , 0 , 0 ] ) ,
1775
1822
non_null_indices : vec ! [ ] ,
1776
1823
max_def_level : 3 ,
1777
1824
max_rep_level : 1 ,
1778
1825
array : values,
1826
+ logical_nulls,
1779
1827
} ;
1780
1828
assert_eq ! ( list_level, & expected_level) ;
1781
1829
}
@@ -1804,13 +1852,15 @@ mod tests {
1804
1852
builder. write ( 0 ..4 ) ;
1805
1853
let levels = builder. finish ( ) ;
1806
1854
1855
+ let logical_nulls = values. logical_nulls ( ) ;
1807
1856
let expected_level = ArrayLevels {
1808
1857
def_levels : Some ( vec ! [ 5 , 4 , 5 , 2 , 5 , 3 , 5 , 5 , 4 , 4 , 0 ] ) ,
1809
1858
rep_levels : Some ( vec ! [ 0 , 2 , 2 , 1 , 0 , 1 , 0 , 2 , 1 , 2 , 0 ] ) ,
1810
1859
non_null_indices : vec ! [ 0 , 2 , 3 , 4 , 5 ] ,
1811
1860
max_def_level : 5 ,
1812
1861
max_rep_level : 2 ,
1813
1862
array : values,
1863
+ logical_nulls,
1814
1864
} ;
1815
1865
1816
1866
assert_eq ! ( levels[ 0 ] , expected_level) ;
@@ -1834,13 +1884,16 @@ mod tests {
1834
1884
let mut builder = levels ( & item_field, dict. clone ( ) ) ;
1835
1885
builder. write ( 0 ..4 ) ;
1836
1886
let levels = builder. finish ( ) ;
1887
+
1888
+ let logical_nulls = dict. logical_nulls ( ) ;
1837
1889
let expected_level = ArrayLevels {
1838
1890
def_levels : Some ( vec ! [ 0 , 0 , 1 , 1 ] ) ,
1839
1891
rep_levels : None ,
1840
1892
non_null_indices : vec ! [ 2 , 3 ] ,
1841
1893
max_def_level : 1 ,
1842
1894
max_rep_level : 0 ,
1843
1895
array : Arc :: new ( dict) ,
1896
+ logical_nulls,
1844
1897
} ;
1845
1898
assert_eq ! ( levels[ 0 ] , expected_level) ;
1846
1899
}
0 commit comments