Skip to content

Commit 23df12f

Browse files
authored
Merge pull request #521 from e2b-dev/fix-cardinality-in-range-gap
fix: CardinalityInRange off-by-one for gaps between runs within a container
2 parents 8923a74 + 00ee8ae commit 23df12f

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

roaring_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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).
11591185
func TestCardinalityInRangeBitmapContainer(t *testing.T) {
11601186
rb := NewBitmap()

runcontainer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2543,7 +2543,7 @@ func (rc *runContainer16) getCardinalityInRange(start, end uint) int {
25432543
if firstIdx >= len(rc.iv) {
25442544
return 0
25452545
}
2546-
if lastIdx < 0 || lastIdx < firstIdx-1 {
2546+
if lastIdx < 0 || lastIdx < firstIdx {
25472547
return 0
25482548
}
25492549

0 commit comments

Comments
 (0)