diff --git a/api.go b/api.go index 64931a0a9..5b8b09181 100644 --- a/api.go +++ b/api.go @@ -2283,7 +2283,11 @@ func (api *API) RestoreShard(ctx context.Context, indexName string, shard uint64 return err } } - _, err = view.CreateFragmentIfNotExists(shard) + frag, err := view.CreateFragmentIfNotExists(shard) + if err != nil { + return err + } + err = frag.RebuildRankCache(ctx) if err != nil { return err } diff --git a/fragment.go b/fragment.go index 915a29556..f7304f7ea 100644 --- a/fragment.go +++ b/fragment.go @@ -2890,6 +2890,31 @@ func (f *fragment) FlushCache() error { defer f.mu.Unlock() return f.flushCache() } +func (f *fragment) RebuildRankCache(ctx context.Context) error { + if f.CacheType != CacheTypeRanked { + return nil //only rebuild ranked caches + } + f.mu.Lock() + defer f.mu.Unlock() + tx, err := f.holder.BeginTx(false, f.idx, f.shard) + if err != nil { + return err + } + defer tx.Rollback() + rows, err := f.unprotectedRows(ctx, tx, uint64(0)) + if err != nil { + return err + } + for _, id := range rows { + n, err := tx.CountRange(f.index(), f.field(), f.view(), f.shard, id*ShardWidth, (id+1)*ShardWidth) + if err != nil { + return errors.Wrap(err, "CountRange") + } + f.cache.BulkAdd(id, n) + } + f.cache.Invalidate() + return nil +} func (f *fragment) flushCache() error { if f.cache == nil {