From 266051dd26299293b115cfa136c7df11f3e271ef Mon Sep 17 00:00:00 2001 From: Yuce Tekol Date: Mon, 17 Sep 2018 16:25:34 +0300 Subject: [PATCH] Adds DirectAdd function to roaring.Bitmap --- roaring/roaring.go | 7 +++++++ roaring/roaring_test.go | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/roaring/roaring.go b/roaring/roaring.go index 41710de89..755e508b7 100644 --- a/roaring/roaring.go +++ b/roaring/roaring.go @@ -167,6 +167,13 @@ func (b *Bitmap) Add(a ...uint64) (changed bool, err error) { return changed, nil } +// DirectAdd adds values to the bitmap by bypassing the op log. +func (b *Bitmap) DirectAdd(values []uint64) { + for _, value := range values { + b.add(value) + } +} + func (b *Bitmap) add(v uint64) bool { cont := b.Containers.GetOrCreate(highbits(v)) return cont.add(lowbits(v)) diff --git a/roaring/roaring_test.go b/roaring/roaring_test.go index d29f1226f..073b96c6f 100644 --- a/roaring/roaring_test.go +++ b/roaring/roaring_test.go @@ -331,6 +331,21 @@ func TestBitmap_ArrayCountRange(t *testing.T) { } } +func TestBitmap_DirectAdd(t *testing.T) { + bits := []uint64{0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17, 1000000, 1000002, 1000003, 1000004, 1000005, 1000006, 1000010, 1000011, 1000012, 1000013, 1000014} + bm := roaring.NewBitmap() + bm.DirectAdd([]uint64{0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17}) + bm.DirectAdd([]uint64{1000000, 1000002, 1000003, 1000004, 1000005, 1000006, 1000010, 1000011, 1000012, 1000013, 1000014}) + if len(bits) != int(bm.Count()) { + t.Fatalf("count %d != %d", len(bits), bm.Count()) + } + for _, bit := range bits { + if !bm.Contains(bit) { + t.Fatalf("%d should be in the bitmap", bit) + } + } +} + func TestBitmap_RunCountRange(t *testing.T) { bm0 := roaring.NewFileBitmap(0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17, 1000000, 1000002, 1000003, 1000004, 1000005, 1000006, 1000010, 1000011, 1000012, 1000013, 1000014) bm0.Optimize() // convert to runs