From aa71c08f1254ef96c0cd1884becd9e35c084c0a3 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Tue, 19 Jun 2018 11:01:00 -0500 Subject: [PATCH] implemented count optimization for btree --- enterprise/b/containers_btree.go | 10 ++++++++++ roaring/roaring.go | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/enterprise/b/containers_btree.go b/enterprise/b/containers_btree.go index 257134a82..eb779fe06 100644 --- a/enterprise/b/containers_btree.go +++ b/enterprise/b/containers_btree.go @@ -121,6 +121,16 @@ func (btc *BTreeContainers) GetOrCreate(key uint64) *roaring.Container { return btc.lastContainer } +func (btc *BTreeContainers) Count() (n uint64) { + e, _ := btc.tree.Seek(0) + _, c, err := e.Next() + for err != io.EOF { + n += uint64(c.N()) + _, c, err = e.Next() + } + return +} + func (btc *BTreeContainers) Clone() roaring.Containers { nbtc := NewBTreeContainers() diff --git a/roaring/roaring.go b/roaring/roaring.go index 8d132e7e0..f4d9218e2 100644 --- a/roaring/roaring.go +++ b/roaring/roaring.go @@ -1026,6 +1026,11 @@ func (c *Container) Mapped() bool { return c.mapped } +// N returns the cached bit count of the container +func (c *Container) N() int { + return c.n +} + // Update updates the container func (c *Container) Update(containerType byte, n int, mapped bool) { c.containerType = containerType