From 2a3d236d8e7ea8912afc4b8ade162aa91bfc3a02 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Wed, 3 Apr 2024 09:37:42 +0800 Subject: [PATCH] :bug: Database rollup calculation misses null values https://github.com/siyuan-note/siyuan/issues/10843 --- kernel/av/av.go | 16 ++++++++++++++++ kernel/model/attribute_view.go | 15 ++++++++++++--- kernel/treenode/node.go | 7 ++++++- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/kernel/av/av.go b/kernel/av/av.go index d42c0f306..eeb54627b 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -523,6 +523,22 @@ func (av *AttributeView) GetCurrentView(viewID string) (ret *View, err error) { return } +func (av *AttributeView) ExistBlock(blockID string) bool { + for _, kv := range av.KeyValues { + if KeyTypeBlock != kv.Key.Type { + continue + } + + for _, v := range kv.Values { + if v.BlockID == blockID { + return true + } + } + return false + } + return false +} + func (av *AttributeView) GetValue(keyID, blockID string) (ret *Value) { for _, kv := range av.KeyValues { if kv.Key.ID == keyID { diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 5dc0042a6..5a9dbdb46 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -340,9 +340,13 @@ func GetBlockAttributeViewKeys(blockID string) (ret []*BlockAttributeViewKeys) { for _, bID := range relVal.Relation.BlockIDs { destVal := destAv.GetValue(kv.Key.Rollup.KeyID, bID) if nil == destVal { - destVal = treenode.GetAttributeViewDefaultValue(ast.NewNodeID(), kv.Key.Rollup.KeyID, blockID, destKey.Type) + if destAv.ExistBlock(bID) { // 数据库中存在行但是列值不存在是数据未初始化,这里补一个默认值 + destVal = treenode.GetAttributeViewDefaultValue(ast.NewNodeID(), kv.Key.Rollup.KeyID, bID, destKey.Type) + } + if nil == destVal { + continue + } } - if av.KeyTypeNumber == destKey.Type { destVal.Number.Format = destKey.NumberFormat destVal.Number.FormatNumber() @@ -1001,7 +1005,12 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View, query s for _, blockID := range relVal.Relation.BlockIDs { destVal := destAv.GetValue(rollupKey.Rollup.KeyID, blockID) if nil == destVal { - continue + if destAv.ExistBlock(blockID) { // 数据库中存在行但是列值不存在是数据未初始化,这里补一个默认值 + destVal = treenode.GetAttributeViewDefaultValue(ast.NewNodeID(), rollupKey.Rollup.KeyID, blockID, destKey.Type) + } + if nil == destVal { + continue + } } if av.KeyTypeNumber == destKey.Type { destVal.Number.Format = destKey.NumberFormat diff --git a/kernel/treenode/node.go b/kernel/treenode/node.go index 8ebe61608..825865196 100644 --- a/kernel/treenode/node.go +++ b/kernel/treenode/node.go @@ -805,7 +805,12 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a for _, blockID := range relVal.Relation.BlockIDs { destVal := destAv.GetValue(rollupKey.Rollup.KeyID, blockID) if nil == destVal { - continue + if destAv.ExistBlock(blockID) { // 数据库中存在行但是列值不存在是数据未初始化,这里补一个默认值 + destVal = GetAttributeViewDefaultValue(ast.NewNodeID(), rollupKey.Rollup.KeyID, blockID, destKey.Type) + } + if nil == destVal { + continue + } } if av.KeyTypeNumber == destKey.Type { destVal.Number.Format = destKey.NumberFormat