@@ -59,6 +59,15 @@ impl DeletionVector {
5959 self . bitmap . len ( )
6060 }
6161
62+ /// Returns true if `position` is deleted. Positions above `u32::MAX` cannot be
63+ /// present in a roaring32 bitmap and are therefore reported as not deleted.
64+ /// Mirrors Java `BitmapDeletionVector#isDeleted` / the searchers' `LongPredicate`.
65+ pub fn is_deleted ( & self , position : u64 ) -> bool {
66+ u32:: try_from ( position)
67+ . ok ( )
68+ . is_some_and ( |p| self . bitmap . contains ( p) )
69+ }
70+
6271 /// Returns an iterator over deleted positions that supports [DeletionVectorIterator::advance_to].
6372 /// Required for efficient row selection building when skipping row groups (avoid re-scanning
6473 /// deletes in skipped ranges).
@@ -249,4 +258,15 @@ mod tests {
249258 let expected_bitmap = RoaringBitmap :: from_iter ( [ 1u32 , 2u32 ] ) ;
250259 assert_eq ! ( dv. bitmap( ) , & expected_bitmap, "bitmap should be [1, 2]" ) ;
251260 }
261+
262+ #[ test]
263+ fn test_is_deleted_reports_membership_and_guards_u32_overflow ( ) {
264+ let mut bitmap = RoaringBitmap :: new ( ) ;
265+ bitmap. insert ( 2 ) ;
266+ let dv = DeletionVector :: from_bitmap ( bitmap) ;
267+ assert ! ( dv. is_deleted( 2 ) , "position 2 was deleted" ) ;
268+ assert ! ( !dv. is_deleted( 0 ) , "position 0 was not deleted" ) ;
269+ // Positions above u32::MAX cannot exist in a roaring32 bitmap -> not deleted.
270+ assert ! ( !dv. is_deleted( u64 :: from( u32 :: MAX ) + 1 ) ) ;
271+ }
252272}
0 commit comments