diff --git a/cache.go b/cache.go index 242e5a6ab..ba33fe258 100644 --- a/cache.go +++ b/cache.go @@ -273,6 +273,11 @@ func (c *RankCache) recalculate() { if cnt <= c.thresholdValue { delete(c.entries, id) } + // prevent from deleting the whole cache if all the same value + if len(c.entries) <= int(c.maxEntries) { + break + } + } } } diff --git a/cache_test.go b/cache_test.go new file mode 100644 index 000000000..21d8acf07 --- /dev/null +++ b/cache_test.go @@ -0,0 +1,35 @@ +// Copyright 2017 Pilosa Corp. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pilosa_test + +import ( + "testing" + + "github.com/pilosa/pilosa" +) + +// Ensure a bitmap query can be executed. +func TestCache_Rank(t *testing.T) { + cacheSize := uint32(3) + cache := pilosa.NewRankCache(cacheSize) + for i := 1; i < int(2*cacheSize); i++ { + cache.Add(uint64(i), 3) + } + cache.Recalculate() + if cache.Len() != int(cacheSize) { + t.Fatalf("unexpected cache Size: %d!=%d expected\n", cache.Len(), cacheSize) + } + +}