@@ -5,9 +5,11 @@ import (
55 "fmt"
66 "math"
77 "sync"
8+
89 "sync/atomic"
910
1011 "github.com/redis/go-redis/v9/internal/util"
12+ uberAtomic "go.uber.org/atomic"
1113)
1214
1315var (
@@ -214,7 +216,7 @@ func (a *OneSucceededAggregator) Result() (interface{}, error) {
214216// AggSumAggregator sums numeric replies from all shards.
215217type AggSumAggregator struct {
216218 err atomic.Value
217- res int64
219+ res uberAtomic. Float64
218220}
219221
220222func (a * AggSumAggregator ) Add (result interface {}, err error ) error {
@@ -223,12 +225,12 @@ func (a *AggSumAggregator) Add(result interface{}, err error) error {
223225 }
224226
225227 if result != nil {
226- val , err := toInt64 (result )
228+ val , err := toFloat64 (result )
227229 if err != nil {
228230 a .err .CompareAndSwap (nil , err )
229231 return err
230232 }
231- atomic . AddInt64 ( & a .res , val )
233+ a .res . Add ( val )
232234 }
233235
234236 return nil
@@ -277,7 +279,7 @@ func (a *AggSumAggregator) BatchSlice(results []AggregatorResErr) error {
277279}
278280
279281func (a * AggSumAggregator ) Result () (interface {}, error ) {
280- res , err := atomic . LoadInt64 ( & a .res ), a .err .Load ()
282+ res , err := a .res . Load ( ), a .err .Load ()
281283 if err != nil {
282284 return nil , err .(error )
283285 }
@@ -297,13 +299,13 @@ func (a *AggMinAggregator) Add(result interface{}, err error) error {
297299 return nil
298300 }
299301
300- intVal , e := toInt64 (result )
302+ floatVal , e := toFloat64 (result )
301303 if e != nil {
302304 a .err .CompareAndSwap (nil , err )
303305 return nil
304306 }
305307
306- a .res .Value (intVal )
308+ a .res .Value (floatVal )
307309
308310 return nil
309311}
@@ -337,22 +339,22 @@ func (a *AggMinAggregator) AddWithKey(key string, result interface{}, err error)
337339}
338340
339341func (a * AggMinAggregator ) BatchSlice (results []AggregatorResErr ) error {
340- min := int64 (math .MaxInt64 )
342+ min := float64 (math .MaxFloat64 )
341343
342344 for _ , res := range results {
343345 if res .Err != nil {
344346 _ = a .Add (nil , res .Err )
345347 return nil
346348 }
347349
348- resInt , err := toInt64 (res .Result )
350+ floatVal , err := toFloat64 (res .Result )
349351 if err != nil {
350352 _ = a .Add (nil , res .Err )
351353 return nil
352354 }
353355
354- if resInt < min {
355- min = resInt
356+ if floatVal < min {
357+ min = floatVal
356358 }
357359
358360 }
@@ -385,13 +387,13 @@ func (a *AggMaxAggregator) Add(result interface{}, err error) error {
385387 return nil
386388 }
387389
388- intVal , e := toInt64 (result )
390+ floatVal , e := toFloat64 (result )
389391 if e != nil {
390392 a .err .CompareAndSwap (nil , err )
391393 return nil
392394 }
393395
394- a .res .Value (intVal )
396+ a .res .Value (floatVal )
395397
396398 return nil
397399}
@@ -650,6 +652,27 @@ func toInt64(val interface{}) (int64, error) {
650652 }
651653}
652654
655+ func toFloat64 (val interface {}) (float64 , error ) {
656+ if val == nil {
657+ return 0 , nil
658+ }
659+
660+ switch v := val .(type ) {
661+ case float64 :
662+ return v , nil
663+ case int :
664+ return float64 (v ), nil
665+ case int32 :
666+ return float64 (v ), nil
667+ case int64 :
668+ return float64 (v ), nil
669+ case float32 :
670+ return float64 (v ), nil
671+ default :
672+ return 0 , fmt .Errorf ("cannot convert %T to float64" , val )
673+ }
674+ }
675+
653676func toBool (val interface {}) (bool , error ) {
654677 if val == nil {
655678 return false , nil
0 commit comments