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 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 { 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 {