diff --git a/kernel/filesys/tree.go b/kernel/filesys/tree.go index 27ae1a036..fb768d2f3 100644 --- a/kernel/filesys/tree.go +++ b/kernel/filesys/tree.go @@ -36,6 +36,23 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) +func LoadTrees(ids []string) (ret map[string]*parse.Tree) { + ret = map[string]*parse.Tree{} + bts := treenode.GetBlockTrees(ids) + luteEngine := util.NewLute() + for id, bt := range bts { + if nil == ret[id] { + tree, err := LoadTree(bt.BoxID, bt.Path, luteEngine) + if nil != err { + logging.LogErrorf("load tree [%s] failed: %s", bt.Path, err) + continue + } + ret[id] = tree + } + } + return +} + func LoadTree(boxID, p string, luteEngine *lute.Lute) (ret *parse.Tree, err error) { filePath := filepath.Join(util.DataDir, boxID, p) data, err := filelock.ReadFile(filePath) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index eb14ce18e..9bdcb0f14 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -404,20 +404,9 @@ func SearchAttributeView(keyword string, excludeAvIDs []string) (ret []*SearchAt } blockIDs = gulu.Str.RemoveDuplicatedElem(blockIDs) - trees := map[string]*parse.Tree{} + trees := filesys.LoadTrees(blockIDs) for _, blockID := range blockIDs { - bt := treenode.GetBlockTree(blockID) - if nil == bt { - continue - } - - tree := trees[bt.RootID] - if nil == tree { - tree, _ = LoadTreeByBlockID(blockID) - if nil != tree { - trees[bt.RootID] = tree - } - } + tree := trees[blockID] if nil == tree { continue } @@ -1428,10 +1417,10 @@ func (tx *Transaction) doRemoveAttrViewView(operation *Operation) (ret *TxErr) { } func getMirrorBlocksNodes(avID string) (trees []*parse.Tree, nodes []*ast.Node) { - mirrorBlocks := treenode.GetMirrorAttrViewBlockIDs(avID) + mirrorBlockIDs := treenode.GetMirrorAttrViewBlockIDs(avID) mirrorBlockTree := map[string]*parse.Tree{} treeCache := map[string]*parse.Tree{} - for _, mirrorBlock := range mirrorBlocks { + for _, mirrorBlock := range mirrorBlockIDs { bt := treenode.GetBlockTree(mirrorBlock) if nil == bt { logging.LogErrorf("get block tree by block ID [%s] failed", mirrorBlock) @@ -1450,11 +1439,11 @@ func getMirrorBlocksNodes(avID string) (trees []*parse.Tree, nodes []*ast.Node) } } - for _, mirrorBlock := range mirrorBlocks { - tree := mirrorBlockTree[mirrorBlock] - node := treenode.GetNodeInTree(tree, mirrorBlock) + for _, mirrorBlockID := range mirrorBlockIDs { + tree := mirrorBlockTree[mirrorBlockID] + node := treenode.GetNodeInTree(tree, mirrorBlockID) if nil == node { - logging.LogErrorf("get node in tree by block ID [%s] failed", mirrorBlock) + logging.LogErrorf("get node in tree by block ID [%s] failed", mirrorBlockID) continue } nodes = append(nodes, node) diff --git a/kernel/model/blockial.go b/kernel/model/blockial.go index 4c0f35474..7a76d54c2 100644 --- a/kernel/model/blockial.go +++ b/kernel/model/blockial.go @@ -292,20 +292,7 @@ func BatchGetBlockAttrs(ids []string) (ret map[string]map[string]string) { WaitForWritingFiles() ret = map[string]map[string]string{} - trees := map[string]*parse.Tree{} - bts := treenode.GetBlockTrees(ids) - luteEngine := util.NewLute() - for id, bt := range bts { - if nil == trees[id] { - tree, err := filesys.LoadTree(bt.BoxID, bt.Path, luteEngine) - if nil != err { - logging.LogErrorf("load tree [%s] failed: %s", bt.Path, err) - continue - } - trees[id] = tree - } - } - + trees := filesys.LoadTrees(ids) for _, id := range ids { tree := trees[id] if nil == tree {