瀏覽代碼

:art: Improve dynamic anchor text auto-refresh stability https://github.com/siyuan-note/siyuan/issues/8234

Daniel 10 月之前
父節點
當前提交
2dcd2747f3
共有 1 個文件被更改,包括 26 次插入18 次删除
  1. 26 18
      kernel/model/transaction.go

+ 26 - 18
kernel/model/transaction.go

@@ -374,6 +374,7 @@ func (tx *Transaction) doMove(operation *Operation) (ret *TxErr) {
 		}
 		}
 
 
 		refreshUpdated(srcNode)
 		refreshUpdated(srcNode)
+		tx.nodes[srcNode.ID] = srcNode
 		refreshUpdated(srcTree.Root)
 		refreshUpdated(srcTree.Root)
 		if err = tx.writeTree(srcTree); err != nil {
 		if err = tx.writeTree(srcTree); err != nil {
 			return
 			return
@@ -452,6 +453,7 @@ func (tx *Transaction) doMove(operation *Operation) (ret *TxErr) {
 	}
 	}
 
 
 	refreshUpdated(srcNode)
 	refreshUpdated(srcNode)
+	tx.nodes[srcNode.ID] = srcNode
 	refreshUpdated(srcTree.Root)
 	refreshUpdated(srcTree.Root)
 	if err = tx.writeTree(srcTree); err != nil {
 	if err = tx.writeTree(srcTree); err != nil {
 		return &TxErr{code: TxErrCodeWriteTree, msg: err.Error(), id: id}
 		return &TxErr{code: TxErrCodeWriteTree, msg: err.Error(), id: id}
@@ -1435,24 +1437,10 @@ func refreshDynamicRefText(updatedDefNode *ast.Node, updatedTree *parse.Tree) {
 // refreshDynamicRefTexts 用于批量刷新块引用的动态锚文本。
 // refreshDynamicRefTexts 用于批量刷新块引用的动态锚文本。
 // 该实现依赖了数据库缓存,导致外部调用时可能需要阻塞等待数据库写入后才能获取到 refs
 // 该实现依赖了数据库缓存,导致外部调用时可能需要阻塞等待数据库写入后才能获取到 refs
 func refreshDynamicRefTexts(updatedDefNodes map[string]*ast.Node, updatedTrees map[string]*parse.Tree) {
 func refreshDynamicRefTexts(updatedDefNodes map[string]*ast.Node, updatedTrees map[string]*parse.Tree) {
-	// 更新引用的动态锚文本
+	// 1. 更新引用的动态锚文本
 	treeRefNodeIDs := map[string]*hashset.Set{}
 	treeRefNodeIDs := map[string]*hashset.Set{}
 	for _, updateNode := range updatedDefNodes {
 	for _, updateNode := range updatedDefNodes {
-		refs := sql.GetRefsCacheByDefID(updateNode.ID)
-		if nil != updateNode.Parent && ast.NodeDocument != updateNode.Parent.Type &&
-			updateNode.Parent.IsContainerBlock() && updateNode == treenode.FirstLeafBlock(updateNode.Parent) { // 容器块下第一个叶子块
-			// 如果是容器块下第一个叶子块,则需要向上查找引用
-			for parent := updateNode.Parent; nil != parent; parent = parent.Parent {
-				if ast.NodeDocument == parent.Type {
-					break
-				}
-
-				parentRefs := sql.GetRefsCacheByDefID(parent.ID)
-				if 0 < len(parentRefs) {
-					refs = append(refs, parentRefs...)
-				}
-			}
-		}
+		refs := getRefsCacheByDefNode(updateNode)
 		for _, ref := range refs {
 		for _, ref := range refs {
 			if refIDs, ok := treeRefNodeIDs[ref.RootID]; !ok {
 			if refIDs, ok := treeRefNodeIDs[ref.RootID]; !ok {
 				refIDs = hashset.New()
 				refIDs = hashset.New()
@@ -1497,10 +1485,11 @@ func refreshDynamicRefTexts(updatedDefNodes map[string]*ast.Node, updatedTrees m
 
 
 		if refTreeChanged {
 		if refTreeChanged {
 			changedRefTree[refTreeID] = refTree
 			changedRefTree[refTreeID] = refTree
+			sql.UpdateRefsTreeQueue(refTree)
 		}
 		}
 	}
 	}
 
 
-	// 更新属性视图主键内容
+	// 2. 更新属性视图主键内容
 	for _, updatedDefNode := range updatedDefNodes {
 	for _, updatedDefNode := range updatedDefNodes {
 		avs := updatedDefNode.IALAttr(av.NodeAttrNameAvs)
 		avs := updatedDefNode.IALAttr(av.NodeAttrNameAvs)
 		if "" == avs {
 		if "" == avs {
@@ -1537,12 +1526,31 @@ func refreshDynamicRefTexts(updatedDefNodes map[string]*ast.Node, updatedTrees m
 		}
 		}
 	}
 	}
 
 
-	// 保存变更
+	// 3. 保存变更
 	for _, tree := range changedRefTree {
 	for _, tree := range changedRefTree {
 		indexWriteTreeUpsertQueue(tree)
 		indexWriteTreeUpsertQueue(tree)
 	}
 	}
 }
 }
 
 
+func getRefsCacheByDefNode(updateNode *ast.Node) (ret []*sql.Ref) {
+	ret = sql.GetRefsCacheByDefID(updateNode.ID)
+	if nil != updateNode.Parent && ast.NodeDocument != updateNode.Parent.Type &&
+		updateNode.Parent.IsContainerBlock() && updateNode == treenode.FirstLeafBlock(updateNode.Parent) { // 容器块下第一个叶子块
+		// 如果是容器块下第一个叶子块,则需要向上查找引用
+		for parent := updateNode.Parent; nil != parent; parent = parent.Parent {
+			if ast.NodeDocument == parent.Type {
+				break
+			}
+
+			parentRefs := sql.GetRefsCacheByDefID(parent.ID)
+			if 0 < len(parentRefs) {
+				ret = append(ret, parentRefs...)
+			}
+		}
+	}
+	return
+}
+
 var updateRefTextRenameDocs = map[string]*parse.Tree{}
 var updateRefTextRenameDocs = map[string]*parse.Tree{}
 var updateRefTextRenameDocLock = sync.Mutex{}
 var updateRefTextRenameDocLock = sync.Mutex{}