@@ -1155,6 +1155,32 @@ func TestCardinalityInRangeRunOptimized(t *testing.T) {
11551155 assert .EqualValues (t , 3000 + 5000 , rb .CardinalityInRange (2000 , 75000 ))
11561156}
11571157
1158+ // TestCardinalityInRangeRunGapWithinContainer tests CardinalityInRange when
1159+ // two run intervals exist in the same container with a gap between them.
1160+ func TestCardinalityInRangeRunGapWithinContainer (t * testing.T ) {
1161+ rb := NewBitmap ()
1162+ rb .AddRange (0 , 1024 )
1163+ rb .AddRange (2048 , 3072 )
1164+ rb .RunOptimize ()
1165+
1166+ // Querying within each run should return the correct count.
1167+ assert .EqualValues (t , 1024 , rb .CardinalityInRange (0 , 1024 ))
1168+ assert .EqualValues (t , 1024 , rb .CardinalityInRange (2048 , 3072 ))
1169+
1170+ // The gap [1024, 2048) has zero set bits.
1171+ assert .EqualValues (t , 0 , rb .CardinalityInRange (1024 , 2048 ))
1172+
1173+ // Ranges that span the gap should not count the gap.
1174+ assert .EqualValues (t , 2048 , rb .CardinalityInRange (0 , 3072 ))
1175+
1176+ // Boundary: bit 1023 is set, bit 1024 is not.
1177+ assert .EqualValues (t , 1 , rb .CardinalityInRange (1023 , 1024 ))
1178+ assert .EqualValues (t , 1 , rb .CardinalityInRange (1023 , 1025 ))
1179+
1180+ // Partial ranges touching each side of the gap.
1181+ assert .EqualValues (t , 512 + 512 , rb .CardinalityInRange (512 , 2560 ))
1182+ }
1183+
11581184// TestCardinalityInRangeBitmapContainer tests CardinalityInRange with bitmap containers (>4096 values in one container).
11591185func TestCardinalityInRangeBitmapContainer (t * testing.T ) {
11601186 rb := NewBitmap ()
0 commit comments