瀏覽代碼

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

Daniel 1 年之前
父節點
當前提交
b296771340
共有 3 個文件被更改,包括 22 次插入30 次删除
  1. 7 7
      kernel/av/value.go
  2. 9 13
      kernel/model/attribute_view.go
  3. 6 10
      kernel/treenode/node.go

+ 7 - 7
kernel/av/value.go

@@ -475,7 +475,7 @@ type ValueRollup struct {
 	Contents []*Value `json:"contents"`
 	Contents []*Value `json:"contents"`
 }
 }
 
 
-func (r *ValueRollup) RenderContents(calc *RollupCalc) {
+func (r *ValueRollup) RenderContents(calc *RollupCalc, destKey *Key) {
 	if nil == calc {
 	if nil == calc {
 		return
 		return
 	}
 	}
@@ -535,7 +535,7 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc) {
 				sum += v.Number.Content
 				sum += v.Number.Content
 			}
 			}
 		}
 		}
-		r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewValueNumber(sum)}}
+		r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(sum, destKey.NumberFormat)}}
 	case CalcOperatorAverage:
 	case CalcOperatorAverage:
 		sum := 0.0
 		sum := 0.0
 		count := 0
 		count := 0
@@ -546,7 +546,7 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc) {
 			}
 			}
 		}
 		}
 		if 0 < count {
 		if 0 < count {
-			r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewValueNumber(sum / float64(count))}}
+			r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(sum/float64(count), destKey.NumberFormat)}}
 		}
 		}
 	case CalcOperatorMedian:
 	case CalcOperatorMedian:
 		var numbers []float64
 		var numbers []float64
@@ -557,7 +557,7 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc) {
 		}
 		}
 		sort.Float64s(numbers)
 		sort.Float64s(numbers)
 		if 0 < len(numbers) {
 		if 0 < len(numbers) {
-			r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewValueNumber(numbers[len(numbers)/2])}}
+			r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(numbers[len(numbers)/2], destKey.NumberFormat)}}
 		}
 		}
 	case CalcOperatorMin:
 	case CalcOperatorMin:
 		min := math.MaxFloat64
 		min := math.MaxFloat64
@@ -568,7 +568,7 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc) {
 				}
 				}
 			}
 			}
 		}
 		}
-		r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewValueNumber(min)}}
+		r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(min, destKey.NumberFormat)}}
 	case CalcOperatorMax:
 	case CalcOperatorMax:
 		max := -math.MaxFloat64
 		max := -math.MaxFloat64
 		for _, v := range r.Contents {
 		for _, v := range r.Contents {
@@ -578,7 +578,7 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc) {
 				}
 				}
 			}
 			}
 		}
 		}
-		r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewValueNumber(max)}}
+		r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(max, destKey.NumberFormat)}}
 	case CalcOperatorRange:
 	case CalcOperatorRange:
 		min := math.MaxFloat64
 		min := math.MaxFloat64
 		max := -math.MaxFloat64
 		max := -math.MaxFloat64
@@ -592,7 +592,7 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc) {
 				}
 				}
 			}
 			}
 		}
 		}
-		r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewValueNumber(max - min)}}
+		r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(max-min, destKey.NumberFormat)}}
 	case CalcOperatorChecked:
 	case CalcOperatorChecked:
 		countChecked := 0
 		countChecked := 0
 		for _, v := range r.Contents {
 		for _, v := range r.Contents {

+ 9 - 13
kernel/model/attribute_view.go

@@ -243,13 +243,9 @@ func GetBlockAttributeViewKeys(blockID string) (ret []*BlockAttributeViewKeys) {
 				relVal := attrView.GetValue(kv.Key.Rollup.RelationKeyID, kv.Values[0].BlockID)
 				relVal := attrView.GetValue(kv.Key.Rollup.RelationKeyID, kv.Values[0].BlockID)
 				if nil != relVal && nil != relVal.Relation {
 				if nil != relVal && nil != relVal.Relation {
 					destAv, _ := av.ParseAttributeView(relKey.Relation.AvID)
 					destAv, _ := av.ParseAttributeView(relKey.Relation.AvID)
-					if nil != destAv {
+					destKey, _ := destAv.GetKey(kv.Key.Rollup.KeyID)
+					if nil != destAv && nil != destKey {
 						for _, bID := range relVal.Relation.BlockIDs {
 						for _, bID := range relVal.Relation.BlockIDs {
-							destKey, _ := destAv.GetKey(kv.Key.Rollup.KeyID)
-							if nil == destKey {
-								continue
-							}
-
 							destVal := destAv.GetValue(kv.Key.Rollup.KeyID, bID)
 							destVal := destAv.GetValue(kv.Key.Rollup.KeyID, bID)
 							if nil == destVal {
 							if nil == destVal {
 								destVal = treenode.GetAttributeViewDefaultValue(ast.NewNodeID(), kv.Key.Rollup.KeyID, blockID, destKey.Type)
 								destVal = treenode.GetAttributeViewDefaultValue(ast.NewNodeID(), kv.Key.Rollup.KeyID, blockID, destKey.Type)
@@ -261,8 +257,8 @@ func GetBlockAttributeViewKeys(blockID string) (ret []*BlockAttributeViewKeys) {
 							}
 							}
 
 
 							kv.Values[0].Rollup.Contents = append(kv.Values[0].Rollup.Contents, destVal.Clone())
 							kv.Values[0].Rollup.Contents = append(kv.Values[0].Rollup.Contents, destVal.Clone())
-							kv.Values[0].Rollup.RenderContents(kv.Key.Rollup.Calc)
 						}
 						}
+						kv.Values[0].Rollup.RenderContents(kv.Key.Rollup.Calc, destKey)
 					}
 					}
 				}
 				}
 			case av.KeyTypeRelation:
 			case av.KeyTypeRelation:
@@ -817,12 +813,12 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a
 					break
 					break
 				}
 				}
 
 
-				for _, blockID := range relVal.Relation.BlockIDs {
-					destKey, _ := destAv.GetKey(rollupKey.Rollup.KeyID)
-					if nil == destKey {
-						continue
-					}
+				destKey, _ := destAv.GetKey(rollupKey.Rollup.KeyID)
+				if nil == destKey {
+					continue
+				}
 
 
+				for _, blockID := range relVal.Relation.BlockIDs {
 					destVal := destAv.GetValue(rollupKey.Rollup.KeyID, blockID)
 					destVal := destAv.GetValue(rollupKey.Rollup.KeyID, blockID)
 					if nil == destVal {
 					if nil == destVal {
 						destVal = treenode.GetAttributeViewDefaultValue(ast.NewNodeID(), rollupKey.Rollup.KeyID, blockID, destKey.Type)
 						destVal = treenode.GetAttributeViewDefaultValue(ast.NewNodeID(), rollupKey.Rollup.KeyID, blockID, destKey.Type)
@@ -835,7 +831,7 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a
 					cell.Value.Rollup.Contents = append(cell.Value.Rollup.Contents, destVal.Clone())
 					cell.Value.Rollup.Contents = append(cell.Value.Rollup.Contents, destVal.Clone())
 				}
 				}
 
 
-				cell.Value.Rollup.RenderContents(rollupKey.Rollup.Calc)
+				cell.Value.Rollup.RenderContents(rollupKey.Rollup.Calc, destKey)
 			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 {

+ 6 - 10
kernel/treenode/node.go

@@ -774,18 +774,14 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a
 					break
 					break
 				}
 				}
 
 
-				for _, blockID := range relVal.Relation.BlockIDs {
-					destKey, _ := destAv.GetKey(rollupKey.Rollup.KeyID)
-					if nil == destKey {
-						continue
-					}
+				destKey, _ := destAv.GetKey(rollupKey.Rollup.KeyID)
+				if nil == destKey {
+					continue
+				}
 
 
+				for _, blockID := range relVal.Relation.BlockIDs {
 					destVal := destAv.GetValue(rollupKey.Rollup.KeyID, blockID)
 					destVal := destAv.GetValue(rollupKey.Rollup.KeyID, blockID)
 					if nil == destVal {
 					if nil == destVal {
-						if nil == destKey {
-							continue
-						}
-
 						destVal = GetAttributeViewDefaultValue(ast.NewNodeID(), rollupKey.Rollup.KeyID, blockID, destKey.Type)
 						destVal = GetAttributeViewDefaultValue(ast.NewNodeID(), rollupKey.Rollup.KeyID, blockID, destKey.Type)
 					}
 					}
 					if av.KeyTypeNumber == destKey.Type {
 					if av.KeyTypeNumber == destKey.Type {
@@ -796,7 +792,7 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a
 					cell.Value.Rollup.Contents = append(cell.Value.Rollup.Contents, destVal.Clone())
 					cell.Value.Rollup.Contents = append(cell.Value.Rollup.Contents, destVal.Clone())
 				}
 				}
 
 
-				cell.Value.Rollup.RenderContents(rollupKey.Rollup.Calc)
+				cell.Value.Rollup.RenderContents(rollupKey.Rollup.Calc, destKey)
 			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 {