🐛 Database rollup calculation range anomaly https://github.com/siyuan-note/siyuan/issues/10913
This commit is contained in:
parent
efc0d2b519
commit
99808d4d5a
1 changed files with 62 additions and 4 deletions
|
@ -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 {
|
||||
|
|
Loading…
Add table
Reference in a new issue