🎨 Synchronize the related entries when the database creates a two-way relation https://github.com/siyuan-note/siyuan/issues/11250 https://github.com/siyuan-note/siyuan/issues/11356

This commit is contained in:
Daniel 2024-05-12 17:18:23 +08:00
parent c197ca2018
commit b042355363
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
2 changed files with 32 additions and 6 deletions

View file

@ -1629,10 +1629,18 @@ func updateAttributeViewColRelation(operation *Operation) (err error) {
continue
}
srcKeyValues := keyValues
for _, srcVal := range srcKeyValues.Values {
for _, srcVal := range keyValues.Values {
for _, blockID := range srcVal.Relation.BlockIDs {
destVal := &av.Value{ID: ast.NewNodeID(), KeyID: destKeyValues.Key.ID, BlockID: blockID, Type: keyValues.Key.Type, Relation: &av.ValueRelation{}, CreatedAt: now, UpdatedAt: now + 1000}
destVal := destAv.GetValue(destKeyValues.Key.ID, blockID)
if nil == destVal {
destVal = &av.Value{ID: ast.NewNodeID(), KeyID: destKeyValues.Key.ID, BlockID: blockID, Type: keyValues.Key.Type, Relation: &av.ValueRelation{}, CreatedAt: now, UpdatedAt: now + 1000}
} else {
destVal.Type = keyValues.Key.Type
if nil == destVal.Relation {
destVal.Relation = &av.ValueRelation{}
}
destVal.UpdatedAt = now
}
destVal.Relation.BlockIDs = append(destVal.Relation.BlockIDs, srcVal.BlockID)
destVal.Relation.BlockIDs = gulu.Str.RemoveDuplicatedElem(destVal.Relation.BlockIDs)
destKeyValues.Values = append(destKeyValues.Values, destVal)
@ -3232,12 +3240,12 @@ func UpdateAttributeViewCell(tx *Transaction, avID, keyID, rowID, cellID string,
// 将游离行绑定到新建的块上
bindBlockAv(tx, avID, rowID)
}
} else { // 之前绑定了块
} else { // 之前绑定了块
if isUpdatingBlockKey { // 正在更新主键
if val.IsDetached { // 现在是游离行
// 将绑定的块从属性视图中移除
unbindBlockAv(tx, avID, rowID)
} else { // 现在绑定了块
} else { // 现在绑定了块
if oldBoundBlockID != val.BlockID { // 之前绑定的块和现在绑定的块不一样
// 换绑块
unbindBlockAv(tx, avID, oldBoundBlockID)

View file

@ -180,7 +180,7 @@ func ExportAv2CSV(avID, blockID string) (zipPath string, err error) {
}
writer.Flush()
zipPath = exportFolder + ".db.zip"
zipPath = getUniqueFilename(exportFolder + ".db.zip")
zip, err := gulu.Zip.Create(zipPath)
if nil != err {
logging.LogErrorf("create export .db.zip [%s] failed: %s", exportFolder, err)
@ -209,6 +209,24 @@ func ExportAv2CSV(avID, blockID string) (zipPath string, err error) {
return
}
func getUniqueFilename(filePath string) string {
if !gulu.File.IsExist(filePath) {
return filePath
}
ext := filepath.Ext(filePath)
base := strings.TrimSuffix(filepath.Base(filePath), ext)
dir := filepath.Dir(filePath)
i := 1
for {
newPath := filepath.Join(dir, base+" ("+strconv.Itoa(i)+ext) + ")"
if !gulu.File.IsExist(newPath) {
return newPath
}
i++
}
}
func Export2Liandi(id string) (err error) {
tree, err := LoadTreeByBlockID(id)
if nil != err {