From e883bff31b86a7432b501f6afd3cd5c8d46224fb Mon Sep 17 00:00:00 2001 From: Andrzej Liszka Date: Thu, 5 Dec 2024 13:08:45 +0100 Subject: [PATCH] feature: introduces MoreKeys method to compare bitmaps' number of keys/containers --- bitmap_opt.go | 9 +++++++++ bitmap_opt_test.go | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/bitmap_opt.go b/bitmap_opt.go index 8351c31..b3b7e31 100644 --- a/bitmap_opt.go +++ b/bitmap_opt.go @@ -647,3 +647,12 @@ func andNotSelectedContainers(a, b *Bitmap, ai, an, bi, bn int, containerBuf []u } } } + +func (dst *Bitmap) MoreKeys(src *Bitmap) bool { + if dst != nil { + if src == nil || dst.keys.numKeys() > src.keys.numKeys() { + return true + } + } + return false +} diff --git a/bitmap_opt_test.go b/bitmap_opt_test.go index 7e45eeb..eedf3a1 100644 --- a/bitmap_opt_test.go +++ b/bitmap_opt_test.go @@ -871,6 +871,52 @@ func TestIssue_Or_NotMergeContainers(t *testing.T) { }) } +func TestMoreKeys(t *testing.T) { + var bmNil *Bitmap + + bm1Key := NewBitmap() + bm1Key.Set(1) + + bm2Keys := NewBitmap() + bm2Keys.Set(1) + bm2Keys.Set(1 + uint64(maxCardinality)) + + bm3Keys := NewBitmap() + bm3Keys.Set(1) + bm3Keys.Set(1 + uint64(maxCardinality)) + bm3Keys.Set(1 + uint64(maxCardinality)*2) + + t.Run("more keys", func(t *testing.T) { + for _, bms := range [][2]*Bitmap{ + {bm1Key, bmNil}, + {bm2Keys, bmNil}, + {bm2Keys, bm1Key}, + {bm3Keys, bmNil}, + {bm3Keys, bm1Key}, + {bm3Keys, bm2Keys}, + } { + require.True(t, bms[0].MoreKeys(bms[1])) + } + }) + + t.Run("no more keys", func(t *testing.T) { + for _, bms := range [][2]*Bitmap{ + {bmNil, bmNil}, + {bmNil, bm1Key}, + {bmNil, bm2Keys}, + {bmNil, bm3Keys}, + {bm1Key, bm1Key}, + {bm1Key, bm2Keys}, + {bm1Key, bm3Keys}, + {bm2Keys, bm2Keys}, + {bm2Keys, bm3Keys}, + {bm3Keys, bm3Keys}, + } { + require.False(t, bms[0].MoreKeys(bms[1])) + } + }) +} + func TestMergeToSuperset(t *testing.T) { run := func(t *testing.T, bufs [][]uint16) { containerThreshold := uint64(math.MaxUint16 + 1)