diff --git a/kernel/api/setting.go b/kernel/api/setting.go index 00efef01a..3848dd326 100644 --- a/kernel/api/setting.go +++ b/kernel/api/setting.go @@ -215,6 +215,7 @@ func setSearch(c *gin.Context) { if s.CaseSensitive != oldCaseSensitive { model.FullReindex() } + sql.ClearVirtualRefKeywords() ret.Data = s } diff --git a/kernel/sql/block_ref_query.go b/kernel/sql/block_ref_query.go index a21b0b69c..0b6388c5b 100644 --- a/kernel/sql/block_ref_query.go +++ b/kernel/sql/block_ref_query.go @@ -28,6 +28,11 @@ import ( ) func QueryVirtualRefKeywords(name, alias, anchor, doc bool) (ret []string) { + ret, ok := getVirtualRefKeywordsCache() + if ok { + return ret + } + if name { ret = append(ret, queryNames()...) } @@ -44,6 +49,7 @@ func QueryVirtualRefKeywords(name, alias, anchor, doc bool) (ret []string) { sort.SliceStable(ret, func(i, j int) bool { return len(ret[i]) >= len(ret[j]) }) + setVirtualRefKeywords(ret) return } diff --git a/kernel/sql/cache.go b/kernel/sql/cache.go index b97b6cc99..f9ecaddfd 100644 --- a/kernel/sql/cache.go +++ b/kernel/sql/cache.go @@ -70,6 +70,29 @@ func removeBlockCache(id string) { removeRefCacheByDefID(id) } +func getVirtualRefKeywordsCache() ([]string, bool) { + if disabled { + return nil, false + } + + if val, ok := memCache.Get("virtual_ref"); ok { + return val.([]string), true + } + return nil, false +} + +func setVirtualRefKeywords(keywords []string) { + if disabled { + return + } + + memCache.Set("virtual_ref", keywords, 1) +} + +func ClearVirtualRefKeywords() { + memCache.Del("virtual_ref") +} + var defIDRefsCache = gcache.New(30*time.Minute, 5*time.Minute) // [defBlockID]map[refBlockID]*Ref func GetRefsCacheByDefID(defID string) (ret []*Ref) {