Skip to content

Commit 48b1214

Browse files
author
James Cor
committed
refactor
1 parent 3922847 commit 48b1214

File tree

1 file changed

+26
-16
lines changed

1 file changed

+26
-16
lines changed

sql/expression/function/aggregation/window_functions.go

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,6 +1460,29 @@ func (s *StdDevPopAgg) StartPartition(ctx *sql.Context, interval sql.WindowInter
14601460
return err
14611461
}
14621462

1463+
func computeVariance(ctx *sql.Context, interval sql.WindowInterval, buf sql.WindowBuffer, expr sql.Expression, m float64) (float64, error) {
1464+
var v float64
1465+
for i := interval.Start; i < interval.End; i++ {
1466+
row := buf[i]
1467+
val, err := expr.Eval(ctx, row)
1468+
if err != nil {
1469+
return 0, err
1470+
}
1471+
// TODO: consider saving conversions to avoid double Converts
1472+
val, _, err = types.Float64.Convert(ctx, val)
1473+
if err != nil {
1474+
val = 0.0
1475+
ctx.Warn(1292, "Truncated incorrect DOUBLE value: %s", v)
1476+
}
1477+
if val == nil {
1478+
continue
1479+
}
1480+
dv := val.(float64) - m
1481+
v += dv * dv
1482+
}
1483+
return v, nil
1484+
}
1485+
14631486
func (s *StdDevPopAgg) Compute(ctx *sql.Context, interval sql.WindowInterval, buf sql.WindowBuffer) interface{} {
14641487
startIdx := interval.Start - s.partitionStart - 1
14651488
endIdx := interval.End - s.partitionStart - 1
@@ -1478,22 +1501,9 @@ func (s *StdDevPopAgg) Compute(ctx *sql.Context, interval sql.WindowInterval, bu
14781501
}
14791502

14801503
m := computePrefixSum(interval, s.partitionStart, s.prefixSum) / float64(nonNullCnt)
1481-
v := 0.0
1482-
for i := interval.Start; i < interval.End; i++ {
1483-
row := buf[i]
1484-
val, err := s.expr.Eval(ctx, row)
1485-
if err != nil {
1486-
return err
1487-
}
1488-
val, _, err = types.Float64.Convert(ctx, val)
1489-
if err != nil {
1490-
return nil
1491-
}
1492-
if val == nil {
1493-
continue
1494-
}
1495-
dv := val.(float64) - m
1496-
v += dv * dv
1504+
v, err := computeVariance(ctx, interval, buf, s.expr, m)
1505+
if err != nil {
1506+
return err
14971507
}
14981508

14991509
return math.Sqrt(v / float64(nonNullCnt))

0 commit comments

Comments
 (0)