From 20ecabc6c39919a1b7cde0b88fdbfe5df96302e0 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sun, 7 Apr 2024 17:39:58 +0800 Subject: [PATCH] :art: Remove rows in database bound to child blocks when deleting parent block https://github.com/siyuan-note/siyuan/issues/10923 --- kernel/model/transaction.go | 59 ++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index 39f480211..0d258f42a 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -811,35 +811,48 @@ func removeAvBlockRel(node *ast.Node) { } func syncDelete2AttributeView(node *ast.Node) { - avs := node.IALAttr(av.NodeAttrNameAvs) - if "" == avs { - return - } - - avIDs := strings.Split(avs, ",") - for _, avID := range avIDs { - attrView, parseErr := av.ParseAttributeView(avID) - if nil != parseErr { - continue + changedAvIDs := hashset.New() + ast.Walk(node, func(n *ast.Node, entering bool) ast.WalkStatus { + if !entering || !n.IsBlock() { + return ast.WalkContinue } - changedAv := false - blockValues := attrView.GetBlockKeyValues() - if nil == blockValues { - continue + avs := n.IALAttr(av.NodeAttrNameAvs) + if "" == avs { + return ast.WalkContinue } - for i, blockValue := range blockValues.Values { - if blockValue.Block.ID == node.ID { - blockValues.Values = append(blockValues.Values[:i], blockValues.Values[i+1:]...) - changedAv = true - break + avIDs := strings.Split(avs, ",") + for _, avID := range avIDs { + attrView, parseErr := av.ParseAttributeView(avID) + if nil != parseErr { + continue + } + + changedAv := false + blockValues := attrView.GetBlockKeyValues() + if nil == blockValues { + continue + } + + for i, blockValue := range blockValues.Values { + if blockValue.Block.ID == n.ID { + blockValues.Values = append(blockValues.Values[:i], blockValues.Values[i+1:]...) + changedAv = true + break + } + } + + if changedAv { + av.SaveAttributeView(attrView) + changedAvIDs.Add(avID) } } - if changedAv { - av.SaveAttributeView(attrView) - util.BroadcastByType("protyle", "refreshAttributeView", 0, "", map[string]interface{}{"id": avID}) - } + return ast.WalkContinue + }) + + for _, avID := range changedAvIDs.Values() { + util.BroadcastByType("protyle", "refreshAttributeView", 0, "", map[string]interface{}{"id": avID}) } }