Add DeletePrefix to LayeredCache

This commit is contained in:
Bjørn Erik Pedersen 2020-08-11 18:53:40 +02:00
parent 3b58df727e
commit a24d7f8c53
No known key found for this signature in database
GPG key ID: 330E6E2BD4859D8F
3 changed files with 39 additions and 0 deletions

View file

@ -61,6 +61,16 @@ func (b *layeredBucket) delete(primary, secondary string) *Item {
return bucket.delete(secondary) return bucket.delete(secondary)
} }
func (b *layeredBucket) deletePrefix(primary, prefix string, deletables chan *Item) int {
b.RLock()
bucket, exists := b.buckets[primary]
b.RUnlock()
if exists == false {
return 0
}
return bucket.deletePrefix(prefix, deletables)
}
func (b *layeredBucket) deleteAll(primary string, deletables chan *Item) bool { func (b *layeredBucket) deleteAll(primary string, deletables chan *Item) bool {
b.RLock() b.RLock()
bucket, exists := b.buckets[primary] bucket, exists := b.buckets[primary]

View file

@ -149,6 +149,11 @@ func (c *LayeredCache) DeleteAll(primary string) bool {
return c.bucket(primary).deleteAll(primary, c.deletables) return c.bucket(primary).deleteAll(primary, c.deletables)
} }
// Deletes all items that share the same primary key and prefix.
func (c *LayeredCache) DeletePrefix(primary, prefix string) int {
return c.bucket(primary).deletePrefix(primary, prefix, c.deletables)
}
//this isn't thread safe. It's meant to be called from non-concurrent tests //this isn't thread safe. It's meant to be called from non-concurrent tests
func (c *LayeredCache) Clear() { func (c *LayeredCache) Clear() {
for _, bucket := range c.buckets { for _, bucket := range c.buckets {

View file

@ -71,6 +71,30 @@ func (_ *LayeredCacheTests) DeletesAValue() {
Expect(cache.ItemCount()).To.Equal(2) Expect(cache.ItemCount()).To.Equal(2)
} }
func (_ *LayeredCacheTests) DeletesAPrefix() {
cache := newLayered()
Expect(cache.ItemCount()).To.Equal(0)
cache.Set("spice", "aaa", "1", time.Minute)
cache.Set("spice", "aab", "2", time.Minute)
cache.Set("spice", "aac", "3", time.Minute)
cache.Set("leto", "aac", "3", time.Minute)
cache.Set("spice", "ac", "4", time.Minute)
cache.Set("spice", "z5", "7", time.Minute)
Expect(cache.ItemCount()).To.Equal(6)
Expect(cache.DeletePrefix("spice", "9a")).To.Equal(0)
Expect(cache.ItemCount()).To.Equal(6)
Expect(cache.DeletePrefix("spice", "aa")).To.Equal(3)
Expect(cache.Get("spice", "aaa")).To.Equal(nil)
Expect(cache.Get("spice", "aab")).To.Equal(nil)
Expect(cache.Get("spice", "aac")).To.Equal(nil)
Expect(cache.Get("spice", "ac").Value()).To.Equal("4")
Expect(cache.Get("spice", "z5").Value()).To.Equal("7")
Expect(cache.ItemCount()).To.Equal(3)
}
func (_ *LayeredCacheTests) OnDeleteCallbackCalled() { func (_ *LayeredCacheTests) OnDeleteCallbackCalled() {
onDeleteFnCalled := false onDeleteFnCalled := false