From f6694810e2892bd95a7f4958fb1d8a9d2e38b890 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Wed, 6 Aug 2025 11:08:26 +0800 Subject: [PATCH] :art: The database rollup field supports using the template field https://github.com/siyuan-note/siyuan/issues/12384 --- kernel/model/attribute_view.go | 2 +- kernel/sql/av.go | 38 +++++++++++++--------------------- 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 8d09f1949..54c2d24e9 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -1022,7 +1022,7 @@ func SearchAttributeViewNonRelationKey(avID, keyword string) (ret []*av.Key) { } for _, keyValues := range attrView.KeyValues { - if av.KeyTypeRelation != keyValues.Key.Type && av.KeyTypeRollup != keyValues.Key.Type && av.KeyTypeTemplate != keyValues.Key.Type && av.KeyTypeCreated != keyValues.Key.Type && av.KeyTypeUpdated != keyValues.Key.Type && av.KeyTypeLineNumber != keyValues.Key.Type { + if av.KeyTypeRelation != keyValues.Key.Type && av.KeyTypeRollup != keyValues.Key.Type && av.KeyTypeCreated != keyValues.Key.Type && av.KeyTypeUpdated != keyValues.Key.Type && av.KeyTypeLineNumber != keyValues.Key.Type { if strings.Contains(strings.ToLower(keyValues.Key.Name), strings.ToLower(keyword)) { ret = append(ret, keyValues.Key) } diff --git a/kernel/sql/av.go b/kernel/sql/av.go index c629b16f1..14f2f09c3 100644 --- a/kernel/sql/av.go +++ b/kernel/sql/av.go @@ -334,8 +334,22 @@ func fillAttributeViewAutoGeneratedValues(attrView *av.AttributeView, collection return } + var viewable av.Viewable + if av.KeyTypeTemplate == destKey.Type { + viewable = RenderView(destAv, destAv.Views[0], "") + } + for _, blockID := range relVal.Relation.BlockIDs { destVal := destAv.GetValue(rollupKey.Rollup.KeyID, blockID) + if nil == destVal && av.KeyTypeTemplate == destKey.Type && nil != viewable { + for _, destItem := range viewable.(av.Collection).GetItems() { + if blockID == destItem.GetID() { + destVal = destItem.GetValue(destKey.ID) + break + } + } + } + if nil == destVal { if destAv.ExistBlock(blockID) { // 数据库中存在行但是列值不存在是数据未初始化,这里补一个默认值 destVal = av.GetAttributeViewDefaultValue(ast.NewNodeID(), rollupKey.Rollup.KeyID, blockID, destKey.Type) @@ -465,30 +479,6 @@ func fillAttributeViewTemplateValues(attrView *av.AttributeView, collection av.C return } -func fillAttributeViewTemplateValue(value *av.Value, item av.Item, attrView *av.AttributeView, ials map[string]map[string]string, items map[string][]*av.KeyValues) (err error) { - itemID := item.GetID() - - switch value.Type { - case av.KeyTypeTemplate: // 渲染模板字段 - keyValues := items[itemID] - ial := ials[itemID] - if nil == ial { - ial = map[string]string{} - } - content, renderErr := RenderTemplateField(ial, keyValues, value.Template.Content) - value.Template.Content = content - if nil != renderErr { - key, _ := attrView.GetKey(value.KeyID) - keyName := "" - if nil != key { - keyName = key.Name - } - err = fmt.Errorf("database [%s] template field [%s] rendering failed: %s", getAttrViewName(attrView), keyName, renderErr) - } - } - return -} - func FillAttributeViewNilValue(value *av.Value, typ av.KeyType) { value.Type = typ switch typ {