From 88e321b2d0f2fd23ae2382000e20b4efa1b40941 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 17 Oct 2024 16:53:18 +0800 Subject: [PATCH] :art: Improve interaction when deleting two-way relation field in a database https://github.com/siyuan-note/siyuan/issues/11252 --- kernel/api/av.go | 6 ++- kernel/model/attribute_view.go | 72 +++++++++++++++++----------------- kernel/model/transaction.go | 1 + 3 files changed, 42 insertions(+), 37 deletions(-) diff --git a/kernel/api/av.go b/kernel/api/av.go index 08113560c..190aab120 100644 --- a/kernel/api/av.go +++ b/kernel/api/av.go @@ -277,8 +277,12 @@ func removeAttributeViewKey(c *gin.Context) { avID := arg["avID"].(string) keyID := arg["keyID"].(string) + removeRelationDest := false + if nil != arg["removeRelationDest"] { + removeRelationDest = arg["removeRelationDest"].(bool) + } - err := model.RemoveAttributeViewKey(avID, keyID) + err := model.RemoveAttributeViewKey(avID, keyID, removeRelationDest) if err != nil { ret.Code = -1 ret.Msg = err.Error() diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 7231d5afc..13387a0df 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -2772,14 +2772,14 @@ func updateAttributeViewColumn(operation *Operation) (err error) { } func (tx *Transaction) doRemoveAttrViewColumn(operation *Operation) (ret *TxErr) { - err := RemoveAttributeViewKey(operation.AvID, operation.ID) + err := RemoveAttributeViewKey(operation.AvID, operation.ID, operation.RemoveDest) if err != nil { return &TxErr{code: TxErrWriteAttributeView, id: operation.AvID, msg: err.Error()} } return } -func RemoveAttributeViewKey(avID, keyID string) (err error) { +func RemoveAttributeViewKey(avID, keyID string, removeRelationDest bool) (err error) { attrView, err := av.ParseAttributeView(avID) if err != nil { return @@ -2796,47 +2796,47 @@ func RemoveAttributeViewKey(avID, keyID string) (err error) { if nil != removedKey && av.KeyTypeRelation == removedKey.Type && nil != removedKey.Relation { if removedKey.Relation.IsTwoWay { - // 删除双向关联的目标列 - - var destAv *av.AttributeView - if avID == removedKey.Relation.AvID { - destAv = attrView - } else { - destAv, _ = av.ParseAttributeView(removedKey.Relation.AvID) - } - - if nil != destAv { - destAvRelSrcAv := false - for i, keyValues := range destAv.KeyValues { - if keyValues.Key.ID == removedKey.Relation.BackKeyID { - destAv.KeyValues = append(destAv.KeyValues[:i], destAv.KeyValues[i+1:]...) - continue - } - - if av.KeyTypeRelation == keyValues.Key.Type && keyValues.Key.Relation.AvID == attrView.ID { - destAvRelSrcAv = true - } + if removeRelationDest { // 删除双向关联的目标列 + var destAv *av.AttributeView + if avID == removedKey.Relation.AvID { + destAv = attrView + } else { + destAv, _ = av.ParseAttributeView(removedKey.Relation.AvID) } - for _, view := range destAv.Views { - switch view.LayoutType { - case av.LayoutTypeTable: - for i, column := range view.Table.Columns { - if column.ID == removedKey.Relation.BackKeyID { - view.Table.Columns = append(view.Table.Columns[:i], view.Table.Columns[i+1:]...) - break + if nil != destAv { + destAvRelSrcAv := false + for i, keyValues := range destAv.KeyValues { + if keyValues.Key.ID == removedKey.Relation.BackKeyID { + destAv.KeyValues = append(destAv.KeyValues[:i], destAv.KeyValues[i+1:]...) + continue + } + + if av.KeyTypeRelation == keyValues.Key.Type && keyValues.Key.Relation.AvID == attrView.ID { + destAvRelSrcAv = true + } + } + + for _, view := range destAv.Views { + switch view.LayoutType { + case av.LayoutTypeTable: + for i, column := range view.Table.Columns { + if column.ID == removedKey.Relation.BackKeyID { + view.Table.Columns = append(view.Table.Columns[:i], view.Table.Columns[i+1:]...) + break + } } } } - } - if destAv != attrView { - av.SaveAttributeView(destAv) - ReloadAttrView(destAv.ID) - } + if destAv != attrView { + av.SaveAttributeView(destAv) + ReloadAttrView(destAv.ID) + } - if !destAvRelSrcAv { - av.RemoveAvRel(destAv.ID, attrView.ID) + if !destAvRelSrcAv { + av.RemoveAvRel(destAv.ID, attrView.ID) + } } } diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index 19c05849e..c9f29da80 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -1415,6 +1415,7 @@ type Operation struct { RowID string `json:"rowID"` // 属性视图行 ID IsTwoWay bool `json:"isTwoWay"` // 属性视图关联列是否是双向关系 BackRelationKeyID string `json:"backRelationKeyID"` // 属性视图关联列回链关联列的 ID + RemoveDest bool `json:"removeDest"` // 属性视图删除关联目标 } type Transaction struct {