Spaces:
Running
Running
// _ _ | |
// __ _____ __ ___ ___ __ _| |_ ___ | |
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
// \ V V / __/ (_| |\ V /| | (_| | || __/ | |
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
// | |
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
// | |
// CONTACT: [email protected] | |
// | |
package helpers | |
import ( | |
"github.com/weaviate/sroar" | |
"github.com/weaviate/weaviate/adapters/repos/db/lsmkv/roaringset" | |
) | |
type AllowList interface { | |
Insert(ids ...uint64) | |
Contains(id uint64) bool | |
DeepCopy() AllowList | |
Slice() []uint64 | |
IsEmpty() bool | |
Len() int | |
Min() uint64 | |
Max() uint64 | |
Size() uint64 | |
Iterator() AllowListIterator | |
LimitedIterator(limit int) AllowListIterator | |
} | |
type AllowListIterator interface { | |
Next() (uint64, bool) | |
Len() int | |
} | |
func NewAllowList(ids ...uint64) AllowList { | |
return NewAllowListFromBitmap(roaringset.NewBitmap(ids...)) | |
} | |
func NewAllowListFromBitmap(bm *sroar.Bitmap) AllowList { | |
return &bitmapAllowList{bm: bm} | |
} | |
func NewAllowListFromBitmapDeepCopy(bm *sroar.Bitmap) AllowList { | |
return NewAllowListFromBitmap(bm.Clone()) | |
} | |
type bitmapAllowList struct { | |
bm *sroar.Bitmap | |
} | |
func (al *bitmapAllowList) Insert(ids ...uint64) { | |
al.bm.SetMany(ids) | |
} | |
func (al *bitmapAllowList) Contains(id uint64) bool { | |
return al.bm.Contains(id) | |
} | |
func (al *bitmapAllowList) DeepCopy() AllowList { | |
return NewAllowListFromBitmapDeepCopy(al.bm) | |
} | |
func (al *bitmapAllowList) Slice() []uint64 { | |
return al.bm.ToArray() | |
} | |
func (al *bitmapAllowList) IsEmpty() bool { | |
return al.bm.IsEmpty() | |
} | |
func (al *bitmapAllowList) Len() int { | |
return al.bm.GetCardinality() | |
} | |
func (al *bitmapAllowList) Min() uint64 { | |
return al.bm.Minimum() | |
} | |
func (al *bitmapAllowList) Max() uint64 { | |
return al.bm.Maximum() | |
} | |
func (al *bitmapAllowList) Size() uint64 { | |
// TODO provide better size estimation | |
return uint64(1.5 * float64(len(al.bm.ToBuffer()))) | |
} | |
func (al *bitmapAllowList) Iterator() AllowListIterator { | |
return al.LimitedIterator(0) | |
} | |
func (al *bitmapAllowList) LimitedIterator(limit int) AllowListIterator { | |
return newBitmapAllowListIterator(al.bm, limit) | |
} | |
type bitmapAllowListIterator struct { | |
len int | |
counter int | |
it *sroar.Iterator | |
} | |
func newBitmapAllowListIterator(bm *sroar.Bitmap, limit int) AllowListIterator { | |
len := bm.GetCardinality() | |
if limit > 0 && limit < len { | |
len = limit | |
} | |
return &bitmapAllowListIterator{ | |
len: len, | |
counter: 0, | |
it: bm.NewIterator(), | |
} | |
} | |
func (i *bitmapAllowListIterator) Next() (uint64, bool) { | |
if i.counter >= i.len { | |
return 0, false | |
} | |
i.counter++ | |
return i.it.Next(), true | |
} | |
func (i *bitmapAllowListIterator) Len() int { | |
return i.len | |
} | |