🎨 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:
parent
25ac2c0b19
commit
a4c05c25b4
2 changed files with 59 additions and 0 deletions
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue