diff --git a/cache.go b/cache.go index 242e5a6ab..2e66d35b9 100644 --- a/cache.go +++ b/cache.go @@ -256,8 +256,10 @@ func (c *RankCache) recalculate() { length := len(c.rankings) c.stats.Gauge("RankCache", float64(length), 1.0) + var removeItems []BitmapPair // cached, ordered list if length > int(c.maxEntries) { c.thresholdValue = rankings[c.maxEntries].Count + removeItems = c.rankings[c.maxEntries:] c.rankings = c.rankings[0:c.maxEntries] } else { c.thresholdValue = 1 @@ -269,10 +271,8 @@ func (c *RankCache) recalculate() { // If size is larger than the threshold then trim it. if len(c.entries) > c.thresholdBuffer { c.stats.Count("cache.threshold", 1, 1.0) - for id, cnt := range c.entries { - if cnt <= c.thresholdValue { - delete(c.entries, id) - } + for _, pair := range removeItems { + delete(c.entries, pair.ID) } } } 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) + } + +}