From 99808d4d5a31332912d3be7ee96c8e9151f8202e Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sun, 7 Apr 2024 00:28:16 +0800 Subject: [PATCH] :bug: Database rollup calculation range anomaly https://github.com/siyuan-note/siyuan/issues/10913 --- kernel/av/value.go | 66 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 4 deletions(-) diff --git a/kernel/av/value.go b/kernel/av/value.go index f6e8e4b8f..031e8c13d 100644 --- a/kernel/av/value.go +++ b/kernel/av/value.go @@ -748,7 +748,11 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc, destKey *Key) { } sort.Float64s(numbers) if 0 < len(numbers) { - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(numbers[len(numbers)/2], destKey.NumberFormat)}} + if 0 == len(numbers)%2 { + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber((numbers[len(numbers)/2-1]+numbers[len(numbers)/2])/2, destKey.NumberFormat)}} + } else { + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(numbers[len(numbers)/2], destKey.NumberFormat)}} + } } case CalcOperatorMin: minVal := math.MaxFloat64 @@ -759,7 +763,9 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc, destKey *Key) { } } } - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(minVal, destKey.NumberFormat)}} + if math.MaxFloat64 != minVal { + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(minVal, destKey.NumberFormat)}} + } case CalcOperatorMax: maxVal := -math.MaxFloat64 for _, v := range r.Contents { @@ -769,10 +775,15 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc, destKey *Key) { } } } - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(maxVal, destKey.NumberFormat)}} + if -math.MaxFloat64 != maxVal { + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(maxVal, destKey.NumberFormat)}} + } case CalcOperatorRange: minVal := math.MaxFloat64 maxVal := -math.MaxFloat64 + earliest := int64(0) + latest := int64(0) + var isNotTime, hasEndDate bool for _, v := range r.Contents { if KeyTypeNumber == v.Type && nil != v.Number && v.Number.IsNotEmpty { if v.Number.Content < minVal { @@ -781,9 +792,56 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc, destKey *Key) { if v.Number.Content > maxVal { maxVal = v.Number.Content } + } else if KeyTypeDate == v.Type && nil != v.Date && v.Date.IsNotEmpty { + if 0 == earliest || v.Date.Content < earliest { + earliest = v.Date.Content + isNotTime = v.Date.IsNotTime + hasEndDate = v.Date.HasEndDate + } + if 0 == latest || v.Date.Content > latest { + latest = v.Date.Content + isNotTime = v.Date.IsNotTime + hasEndDate = v.Date.HasEndDate + } } } - r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(maxVal-minVal, destKey.NumberFormat)}} + + if math.MaxFloat64 != minVal && -math.MaxFloat64 != maxVal { + r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(maxVal-minVal, destKey.NumberFormat)}} + } + if 0 != earliest && 0 != latest { + r.Contents = []*Value{{Date: NewFormattedValueDate(earliest, latest, DateFormatDuration, isNotTime, hasEndDate)}} + } + case CalcOperatorEarliest: + earliest := int64(0) + var isNotTime, hasEndDate bool + for _, v := range r.Contents { + if KeyTypeDate == v.Type && nil != v.Date && v.Date.IsNotEmpty { + if 0 == earliest || v.Date.Content < earliest { + earliest = v.Date.Content + isNotTime = v.Date.IsNotTime + hasEndDate = v.Date.HasEndDate + } + } + } + if 0 != earliest { + r.Contents = []*Value{{Date: NewFormattedValueDate(earliest, 0, DateFormatNone, isNotTime, hasEndDate)}} + } + case CalcOperatorLatest: + latest := int64(0) + var isNotTime, hasEndDate bool + for _, v := range r.Contents { + if KeyTypeDate == v.Type && nil != v.Date && v.Date.IsNotEmpty { + if 0 == latest || latest < v.Date.Content { + latest = v.Date.Content + isNotTime = v.Date.IsNotEmpty + hasEndDate = v.Date.HasEndDate + } + } + } + if 0 != latest { + r.Contents = []*Value{{Date: NewFormattedValueDate(latest, 0, DateFormatNone, isNotTime, hasEndDate)}} + } case CalcOperatorChecked: countChecked := 0 for _, v := range r.Contents {