浏览代码

:art: Add Rollup column to database table view https://github.com/siyuan-note/siyuan/issues/9958

Daniel 1 年之前
父节点
当前提交
0ce8b58a79
共有 3 个文件被更改,包括 110 次插入13 次删除
  1. 24 0
      kernel/av/av.go
  2. 62 13
      kernel/model/attribute_view.go
  3. 24 0
      kernel/treenode/node.go

+ 24 - 0
kernel/av/av.go

@@ -49,6 +49,16 @@ type KeyValues struct {
 	Values []*Value `json:"values,omitempty"` // 属性视图属性列值
 	Values []*Value `json:"values,omitempty"` // 属性视图属性列值
 }
 }
 
 
+func (kValues *KeyValues) GetValue(blockID string) (ret *Value) {
+	for _, v := range kValues.Values {
+		if v.BlockID == blockID {
+			ret = v
+			return
+		}
+	}
+	return
+}
+
 type KeyType string
 type KeyType string
 
 
 const (
 const (
@@ -306,6 +316,20 @@ func (av *AttributeView) GetCurrentView() (ret *View, err error) {
 	return
 	return
 }
 }
 
 
+func (av *AttributeView) GetValue(keyID, blockID string) (ret *Value) {
+	for _, kv := range av.KeyValues {
+		if kv.Key.ID == keyID {
+			for _, v := range kv.Values {
+				if v.BlockID == blockID {
+					ret = v
+					return
+				}
+			}
+		}
+	}
+	return
+}
+
 func (av *AttributeView) GetKey(keyID string) (ret *Key, err error) {
 func (av *AttributeView) GetKey(keyID string) (ret *Key, err error) {
 	for _, kv := range av.KeyValues {
 	for _, kv := range av.KeyValues {
 		if kv.Key.ID == keyID {
 		if kv.Key.ID == keyID {

+ 62 - 13
kernel/model/attribute_view.go

@@ -180,23 +180,48 @@ func GetBlockAttributeViewKeys(blockID string) (ret []*BlockAttributeViewKeys) {
 		}
 		}
 
 
 		// 渲染自动生成的列值,比如模板列、关联列、汇总列、创建时间列和更新时间列
 		// 渲染自动生成的列值,比如模板列、关联列、汇总列、创建时间列和更新时间列
-		// 先处理创建时间和更新时间
+		// 先处理关联列、汇总列、创建时间和更新时间
 		for _, kv := range keyValues {
 		for _, kv := range keyValues {
 			switch kv.Key.Type {
 			switch kv.Key.Type {
-			case av.KeyTypeRelation:
-				relKey, _ := attrView.GetKey(kv.Values[0].KeyID)
-				if nil != relKey && nil != relKey.Relation {
-					destAv, _ := av.ParseAttributeView(relKey.Relation.AvID)
-					if nil != destAv {
-						blocks := map[string]string{}
-						for _, blockValue := range destAv.GetBlockKeyValues().Values {
-							blocks[blockValue.BlockID] = blockValue.Block.Content
-						}
-						for _, blockID := range kv.Values[0].Relation.BlockIDs {
-							kv.Values[0].Relation.Contents = append(kv.Values[0].Relation.Contents, blocks[blockID])
-						}
+			case av.KeyTypeRollup:
+				if nil == kv.Key.Rollup {
+					break
+				}
+
+				relKey, _ := attrView.GetKey(kv.Key.Rollup.RelationKeyID)
+				if nil == relKey {
+					break
+				}
+
+				var blockIDs []string
+				relVal := attrView.GetValue(kv.Key.Rollup.RelationKeyID, kv.Values[0].BlockID)
+				if nil != relVal && nil != relVal.Relation {
+					blockIDs = relVal.Relation.BlockIDs
+				}
+
+				destAv, _ := av.ParseAttributeView(relKey.Relation.AvID)
+				if nil != destAv {
+					for _, bID := range blockIDs {
+						kv.Values[0].Rollup.Contents = append(kv.Values[0].Rollup.Contents, destAv.GetValue(kv.Key.Rollup.KeyID, bID).String())
 					}
 					}
 				}
 				}
+			case av.KeyTypeRelation:
+				if nil == kv.Key.Relation {
+					break
+				}
+
+				destAv, _ := av.ParseAttributeView(kv.Key.Relation.AvID)
+				if nil == destAv {
+					break
+				}
+
+				blocks := map[string]string{}
+				for _, blockValue := range destAv.GetBlockKeyValues().Values {
+					blocks[blockValue.BlockID] = blockValue.Block.Content
+				}
+				for _, bID := range kv.Values[0].Relation.BlockIDs {
+					kv.Values[0].Relation.Contents = append(kv.Values[0].Relation.Contents, blocks[bID])
+				}
 			case av.KeyTypeCreated:
 			case av.KeyTypeCreated:
 				createdStr := blockID[:len("20060102150405")]
 				createdStr := blockID[:len("20060102150405")]
 				created, parseErr := time.ParseInLocation("20060102150405", createdStr, time.Local)
 				created, parseErr := time.ParseInLocation("20060102150405", createdStr, time.Local)
@@ -699,6 +724,30 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a
 				}
 				}
 				content := renderTemplateCol(ial, cell.Value.Template.Content, keyValues)
 				content := renderTemplateCol(ial, cell.Value.Template.Content, keyValues)
 				cell.Value.Template.Content = content
 				cell.Value.Template.Content = content
+			case av.KeyTypeRollup: // 渲染汇总列
+				rollupKey, _ := attrView.GetKey(cell.Value.KeyID)
+				if nil == rollupKey || nil == rollupKey.Rollup {
+					break
+				}
+
+				relKey, _ := attrView.GetKey(rollupKey.Rollup.RelationKeyID)
+				if nil == relKey || nil == relKey.Relation {
+					break
+				}
+
+				relVal := attrView.GetValue(relKey.ID, row.ID)
+				if nil == relVal || nil == relVal.Relation {
+					break
+				}
+
+				destAv, _ := av.ParseAttributeView(relKey.Relation.AvID)
+				if nil == destAv {
+					break
+				}
+
+				for _, blockID := range relVal.Relation.BlockIDs {
+					cell.Value.Rollup.Contents = append(cell.Value.Rollup.Contents, destAv.GetValue(rollupKey.Rollup.KeyID, blockID).String())
+				}
 			case av.KeyTypeRelation: // 渲染关联列
 			case av.KeyTypeRelation: // 渲染关联列
 				relKey, _ := attrView.GetKey(cell.Value.KeyID)
 				relKey, _ := attrView.GetKey(cell.Value.KeyID)
 				if nil != relKey && nil != relKey.Relation {
 				if nil != relKey && nil != relKey.Relation {

+ 24 - 0
kernel/treenode/node.go

@@ -723,6 +723,30 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a
 				}
 				}
 				content := renderTemplateCol(ial, cell.Value.Template.Content, keyValues)
 				content := renderTemplateCol(ial, cell.Value.Template.Content, keyValues)
 				cell.Value.Template.Content = content
 				cell.Value.Template.Content = content
+			case av.KeyTypeRollup: // 渲染汇总列
+				rollupKey, _ := attrView.GetKey(cell.Value.KeyID)
+				if nil == rollupKey || nil == rollupKey.Rollup {
+					break
+				}
+
+				relKey, _ := attrView.GetKey(rollupKey.Rollup.RelationKeyID)
+				if nil == relKey || nil == relKey.Relation {
+					break
+				}
+
+				relVal := attrView.GetValue(relKey.ID, row.ID)
+				if nil == relVal || nil == relVal.Relation {
+					break
+				}
+
+				destAv, _ := av.ParseAttributeView(relKey.Relation.AvID)
+				if nil == destAv {
+					break
+				}
+
+				for _, blockID := range relVal.Relation.BlockIDs {
+					cell.Value.Rollup.Contents = append(cell.Value.Rollup.Contents, destAv.GetValue(rollupKey.Rollup.KeyID, blockID).String())
+				}
 			case av.KeyTypeRelation: // 渲染关联列
 			case av.KeyTypeRelation: // 渲染关联列
 				relKey, _ := attrView.GetKey(cell.Value.KeyID)
 				relKey, _ := attrView.GetKey(cell.Value.KeyID)
 				if nil != relKey && nil != relKey.Relation {
 				if nil != relKey && nil != relKey.Relation {