🎨 The database relation fields follow the change after the primary key field is changed https://github.com/siyuan-note/siyuan/issues/11117

This commit is contained in:
Daniel 2024-04-23 18:22:51 +08:00
parent 25ac2c0b19
commit a4c05c25b4
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
2 changed files with 59 additions and 0 deletions

View file

@ -1343,6 +1343,8 @@ func unbindAttributeViewBlock(operation *Operation, tx *Transaction) (err error)
if nil != value.Block {
value.Block.ID = operation.NextID
}
replaceRelationAvValues(operation.AvID, operation.ID, operation.NextID)
}
}
@ -3022,6 +3024,8 @@ func replaceAttributeViewBlock(operation *Operation, tx *Transaction) (err error
if av.KeyTypeBlock == value.Type && !operation.IsDetached {
bindBlockAv(tx, operation.AvID, operation.NextID)
replaceRelationAvValues(operation.AvID, operation.PreviousID, operation.NextID)
}
}
}
@ -3537,3 +3541,43 @@ func getAttrViewName(attrView *av.AttributeView) string {
}
return ret
}
func replaceRelationAvValues(avID, previousID, nextID string) {
// The database relation fields follow the change after the primary key field is changed https://github.com/siyuan-note/siyuan/issues/11117
srcAvIDs := av.GetSrcAvIDs(avID)
for _, srcAvID := range srcAvIDs {
srcAv, parseErr := av.ParseAttributeView(srcAvID)
changed := false
if nil != parseErr {
continue
}
for _, srcKeyValues := range srcAv.KeyValues {
if av.KeyTypeRelation != srcKeyValues.Key.Type {
continue
}
if avID != srcKeyValues.Key.Relation.AvID {
continue
}
for _, srcValue := range srcKeyValues.Values {
if nil == srcValue.Relation {
continue
}
srcAvChanged := false
srcValue.Relation.BlockIDs, srcAvChanged = util.ReplaceStr(srcValue.Relation.BlockIDs, previousID, nextID)
if srcAvChanged {
changed = true
}
}
}
if changed {
av.SaveAttributeView(srcAv)
util.PushReloadAttrView(srcAvID)
}
}
}

View file

@ -135,3 +135,18 @@ func ContainsSubStr(s string, subStrs []string) bool {
}
return false
}
func ReplaceStr(strs []string, old, new string) (ret []string, changed bool) {
if old == new {
return strs, false
}
for i, v := range strs {
if v == old {
strs[i] = new
changed = true
}
}
ret = strs
return
}