From 9e48a23a93dd4ae128f30c5fcc63081ab03a6984 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sat, 19 Oct 2024 17:05:26 +0800 Subject: [PATCH 1/3] :zap: Improve performance --- kernel/model/attribute_view.go | 31 +++++-------------------------- 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index e0e129f15..55ab3306a 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -1449,38 +1449,17 @@ func (tx *Transaction) doRemoveAttrViewView(operation *Operation) (ret *TxErr) { func getMirrorBlocksNodes(avID string) (trees []*parse.Tree, nodes []*ast.Node) { mirrorBlockIDs := treenode.GetMirrorAttrViewBlockIDs(avID) - mirrorBlockTree := map[string]*parse.Tree{} - treeCache := map[string]*parse.Tree{} - for _, mirrorBlock := range mirrorBlockIDs { - bt := treenode.GetBlockTree(mirrorBlock) - if nil == bt { - logging.LogErrorf("get block tree by block ID [%s] failed", mirrorBlock) - continue - } - - tree := mirrorBlockTree[mirrorBlock] - if nil == tree { - tree, _ = LoadTreeByBlockID(mirrorBlock) - if nil == tree { - logging.LogErrorf("load tree by block ID [%s] failed", mirrorBlock) - continue - } - treeCache[tree.ID] = tree - mirrorBlockTree[mirrorBlock] = tree - } - } - - for _, mirrorBlockID := range mirrorBlockIDs { - tree := mirrorBlockTree[mirrorBlockID] - node := treenode.GetNodeInTree(tree, mirrorBlockID) + mirrorBlockTrees := filesys.LoadTrees(mirrorBlockIDs) + for id, tree := range mirrorBlockTrees { + node := treenode.GetNodeInTree(tree, id) if nil == node { - logging.LogErrorf("get node in tree by block ID [%s] failed", mirrorBlockID) + logging.LogErrorf("get node in tree by block ID [%s] failed", id) continue } nodes = append(nodes, node) } - for _, tree := range treeCache { + for _, tree := range mirrorBlockTrees { trees = append(trees, tree) } return From f9a38c41a2089b487eef8dda4c9d90ed68da4daa Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sat, 19 Oct 2024 17:20:43 +0800 Subject: [PATCH 2/3] :zap: Improve performance for backmentions --- kernel/model/backlink.go | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/kernel/model/backlink.go b/kernel/model/backlink.go index f8a35a659..44400aa82 100644 --- a/kernel/model/backlink.go +++ b/kernel/model/backlink.go @@ -30,6 +30,7 @@ import ( "github.com/88250/lute/parse" "github.com/emirpasic/gods/sets/hashset" "github.com/siyuan-note/logging" + "github.com/siyuan-note/siyuan/kernel/filesys" "github.com/siyuan-note/siyuan/kernel/search" "github.com/siyuan-note/siyuan/kernel/sql" "github.com/siyuan-note/siyuan/kernel/treenode" @@ -82,32 +83,27 @@ func GetBackmentionDoc(defID, refTreeID, keyword string, containChildren bool) ( linkRefs, _, excludeBacklinkIDs := buildLinkRefs(rootID, refs, keyword) tmpMentions, mentionKeywords := buildTreeBackmention(sqlBlock, linkRefs, keyword, excludeBacklinkIDs, beforeLen) - luteEngine := NewLute() - treeCache := map[string]*parse.Tree{} + luteEngine := util.NewLute() var mentions []*Block for _, mention := range tmpMentions { if mention.RootID == refTreeID { mentions = append(mentions, mention) } } + var mentionBlockIDs []string + for _, mention := range mentions { + mentionBlockIDs = append(mentionBlockIDs, mention.ID) + } + mentionBlockIDs = gulu.Str.RemoveDuplicatedElem(mentionBlockIDs) if "" != keyword { mentionKeywords = append(mentionKeywords, keyword) } mentionKeywords = gulu.Str.RemoveDuplicatedElem(mentionKeywords) - for _, mention := range mentions { - refTree := treeCache[mention.RootID] - if nil == refTree { - var loadErr error - refTree, loadErr = LoadTreeByBlockID(mention.ID) - if nil != loadErr { - logging.LogWarnf("load ref tree [%s] failed: %s", mention.ID, loadErr) - continue - } - treeCache[mention.RootID] = refTree - } - backlink := buildBacklink(mention.ID, refTree, mentionKeywords, luteEngine) + trees := filesys.LoadTrees(mentionBlockIDs) + for id, tree := range trees { + backlink := buildBacklink(id, tree, mentionKeywords, luteEngine) ret = append(ret, backlink) } return @@ -138,7 +134,7 @@ func GetBacklinkDoc(defID, refTreeID, keyword string, containChildren bool) (ret return } - luteEngine := NewLute() + luteEngine := util.NewLute() for _, linkRef := range linkRefs { var keywords []string if "" != keyword { From fe8520d1aca7ccff66f443d3d957b319e328c2dc Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sat, 19 Oct 2024 17:33:04 +0800 Subject: [PATCH 3/3] :zap: Improve performance for transfer block ref --- kernel/model/block.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/kernel/model/block.go b/kernel/model/block.go index bfc295148..69e643a57 100644 --- a/kernel/model/block.go +++ b/kernel/model/block.go @@ -325,11 +325,13 @@ func TransferBlockRef(fromID, toID string, refIDs []string) (err error) { if 1 > len(refIDs) { // 如果不指定 refIDs,则转移所有引用了 fromID 的块 refIDs, _ = sql.QueryRefIDsByDefID(fromID, false) } - for _, refID := range refIDs { - tree, _ := LoadTreeByBlockID(refID) + + trees := filesys.LoadTrees(refIDs) + for refID, tree := range trees { if nil == tree { continue } + node := treenode.GetNodeInTree(tree, refID) textMarks := node.ChildrenByType(ast.NodeTextMark) for _, textMark := range textMarks {