From de8eb723938d346bb6b87ba00556b4fa112edc4c Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sun, 10 Aug 2025 11:20:53 +0800 Subject: [PATCH] :art: Improve av https://github.com/siyuan-note/siyuan/issues/14511 --- kernel/av/av_fix.go | 10 +++------- kernel/av/filter.go | 16 ++++++++-------- kernel/av/value.go | 2 +- kernel/model/attribute_view.go | 25 ++++++++++++------------- kernel/model/attribute_view_fix.go | 9 ++++----- kernel/sql/av.go | 9 +++++++-- 6 files changed, 35 insertions(+), 36 deletions(-) diff --git a/kernel/av/av_fix.go b/kernel/av/av_fix.go index f6b334f50..7a98cf9e7 100644 --- a/kernel/av/av_fix.go +++ b/kernel/av/av_fix.go @@ -120,15 +120,11 @@ func upgradeSpec1(av *AttributeView) { for _, v := range kv.Values { if 0 == v.Block.Created { logging.LogWarnf("block [%s] created time is empty", v.BlockID) - if "" == v.Block.ID { - v.Block.ID = v.BlockID - if "" == v.Block.ID { - v.Block.ID = ast.NewNodeID() - v.BlockID = v.Block.ID - } + if "" == v.BlockID { + v.BlockID = ast.NewNodeID() } - createdStr := v.Block.ID[:len("20060102150405")] + createdStr := v.BlockID[:len("20060102150405")] created, parseErr := time.ParseInLocation("20060102150405", createdStr, time.Local) if nil == parseErr { v.Block.Created = created.UnixMilli() diff --git a/kernel/av/filter.go b/kernel/av/filter.go index 7ec186445..34fafbf8d 100644 --- a/kernel/av/filter.go +++ b/kernel/av/filter.go @@ -865,21 +865,21 @@ func (filter *ViewFilter) GetAffectValue(key *Key, addingBlockID string) (ret *V case KeyTypeBlock: switch filter.Operator { case FilterOperatorIsEqual: - ret.Block = &ValueBlock{ID: addingBlockID, Content: filter.Value.Block.Content, Created: ret.CreatedAt, Updated: ret.UpdatedAt} + ret.Block = &ValueBlock{Content: filter.Value.Block.Content, Created: ret.CreatedAt, Updated: ret.UpdatedAt} case FilterOperatorIsNotEqual: - ret.Block = &ValueBlock{ID: addingBlockID, Content: "", Created: ret.CreatedAt, Updated: ret.UpdatedAt} + ret.Block = &ValueBlock{Content: "", Created: ret.CreatedAt, Updated: ret.UpdatedAt} case FilterOperatorContains: - ret.Block = &ValueBlock{ID: addingBlockID, Content: filter.Value.Block.Content, Created: ret.CreatedAt, Updated: ret.UpdatedAt} + ret.Block = &ValueBlock{Content: filter.Value.Block.Content, Created: ret.CreatedAt, Updated: ret.UpdatedAt} case FilterOperatorDoesNotContain: - ret.Block = &ValueBlock{ID: addingBlockID, Content: "", Created: ret.CreatedAt, Updated: ret.UpdatedAt} + ret.Block = &ValueBlock{Content: "", Created: ret.CreatedAt, Updated: ret.UpdatedAt} case FilterOperatorStartsWith: - ret.Block = &ValueBlock{ID: addingBlockID, Content: filter.Value.Block.Content, Created: ret.CreatedAt, Updated: ret.UpdatedAt} + ret.Block = &ValueBlock{Content: filter.Value.Block.Content, Created: ret.CreatedAt, Updated: ret.UpdatedAt} case FilterOperatorEndsWith: - ret.Block = &ValueBlock{ID: addingBlockID, Content: filter.Value.Block.Content, Created: ret.CreatedAt, Updated: ret.UpdatedAt} + ret.Block = &ValueBlock{Content: filter.Value.Block.Content, Created: ret.CreatedAt, Updated: ret.UpdatedAt} case FilterOperatorIsEmpty: - ret.Block = &ValueBlock{ID: addingBlockID, Content: "", Created: ret.CreatedAt, Updated: ret.UpdatedAt} + ret.Block = &ValueBlock{Content: "", Created: ret.CreatedAt, Updated: ret.UpdatedAt} case FilterOperatorIsNotEmpty: - ret.Block = &ValueBlock{ID: addingBlockID, Content: "", Created: ret.CreatedAt, Updated: ret.UpdatedAt} + ret.Block = &ValueBlock{Content: "", Created: ret.CreatedAt, Updated: ret.UpdatedAt} } case KeyTypeText: switch filter.Operator { diff --git a/kernel/av/value.go b/kernel/av/value.go index ad84355e7..8e979d45e 100644 --- a/kernel/av/value.go +++ b/kernel/av/value.go @@ -374,7 +374,7 @@ func (value *Value) GetValByType(typ KeyType) (ret interface{}) { } type ValueBlock struct { - ID string `json:"id"` + ID string `json:"id"` // 绑定的块 ID,非绑定块时为空 Icon string `json:"icon"` Content string `json:"content"` Created int64 `json:"created"` diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 5c8e06704..ab082b2a5 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -847,9 +847,9 @@ func AppendAttributeViewDetachedBlocksWithValues(avID string, blocksValues [][]* v.BlockID = blockID v.Type = keyValues.Key.Type if av.KeyTypeBlock == v.Type { - v.Block.ID = blockID v.Block.Created = now v.Block.Updated = now + v.Block.ID = "" // 非绑定块 ID 置空 } v.IsDetached = true v.CreatedAt = now @@ -1829,7 +1829,7 @@ func unbindAttributeViewBlock(operation *Operation, tx *Transaction) (err error) value.BlockID = operation.NextID value.IsDetached = true if nil != value.Block { - value.Block.ID = operation.NextID + value.Block.ID = "" } avIDs := replaceRelationAvValues(operation.AvID, operation.ID, operation.NextID) @@ -2877,7 +2877,11 @@ func addAttributeViewBlock(now int64, avID, blockID, groupID, previousBlockID, a IsDetached: isDetached, CreatedAt: now, UpdatedAt: now, - Block: &av.ValueBlock{ID: addingBlockID, Icon: blockIcon, Content: addingBlockContent, Created: now, Updated: now}} + Block: &av.ValueBlock{Icon: blockIcon, Content: addingBlockContent, Created: now, Updated: now}} + if !isDetached { + blockValue.Block.ID = addingBlockID + } + blockValues.Values = append(blockValues.Values, blockValue) view, err := getAttrViewViewByBlockID(attrView, blockID) @@ -4065,12 +4069,14 @@ func replaceAttributeViewBlock0(attrView *av.AttributeView, oldBlockID, newBlock value.BlockID = newBlockID if av.KeyTypeBlock == value.Type && nil != value.Block { - value.Block.ID = newBlockID value.IsDetached = isDetached if !isDetached { + value.Block.ID = newBlockID icon, content := getNodeAvBlockText(node) content = util.UnescapeHTML(content) value.Block.Icon, value.Block.Content = icon, content + } else { + value.Block.ID = "" } } @@ -4196,7 +4202,7 @@ func updateAttributeViewValue(tx *Transaction, attrView *av.AttributeView, keyID for _, kv := range attrView.KeyValues { if av.KeyTypeBlock == kv.Key.Type { for _, v := range kv.Values { - if blockID == v.Block.ID { + if blockID == v.BlockID { blockVal = v break } @@ -4314,14 +4320,7 @@ func updateAttributeViewValue(tx *Transaction, attrView *av.AttributeView, keyID if !val.IsDetached { // 现在绑定了块 // 将游离行绑定到新建的块上 - - if val.Block.ID != blockID { - // 从其他库拷贝主键值后会出现该情况 - blockID = val.Block.ID - val.BlockID = blockID - } - - bindBlockAv(tx, avID, blockID) + bindBlockAv(tx, avID, val.Block.ID) } } else { // 之前绑定了块 diff --git a/kernel/model/attribute_view_fix.go b/kernel/model/attribute_view_fix.go index 30218cc80..157649d5d 100644 --- a/kernel/model/attribute_view_fix.go +++ b/kernel/model/attribute_view_fix.go @@ -73,15 +73,14 @@ func checkAttrView(attrView *av.AttributeView, view *av.View) { if v.Type != kv.Key.Type { v.Type = kv.Key.Type if av.KeyTypeBlock == v.Type && nil == v.Block { - v.Block = &av.ValueBlock{ID: v.BlockID} + v.Block = &av.ValueBlock{} if nil != v.Text { v.Block.Content = v.Text.Content } - if "" == v.Block.ID { - v.Block.ID = ast.NewNodeID() - v.BlockID = v.Block.ID + if "" == v.BlockID { + v.BlockID = ast.NewNodeID() } - createdStr := v.Block.ID[:len("20060102150405")] + createdStr := v.BlockID[:len("20060102150405")] created, parseErr := time.ParseInLocation("20060102150405", createdStr, time.Local) if nil == parseErr { v.Block.Created = created.UnixMilli() diff --git a/kernel/sql/av.go b/kernel/sql/av.go index 84feb9988..1082ccff5 100644 --- a/kernel/sql/av.go +++ b/kernel/sql/av.go @@ -91,8 +91,13 @@ func renderView(attrView *av.AttributeView, view *av.View, query string, depth * func RenderTemplateField(ial map[string]string, keyValues []*av.KeyValues, tplContent string) (ret string, err error) { if "" == ial["id"] { block := getBlockValue(keyValues) - if nil != block && nil != block.Block { - ial["id"] = block.Block.ID + if nil != block { + if nil != block.Block { + ial["id"] = block.Block.ID + } + if "" == ial["id"] { + ial["id"] = block.BlockID + } } } if "" == ial["updated"] {