feat: survey 包 Report 新增 Avg、Count、Sum 等辅助计算函数
This commit is contained in:
parent
3c3dc83830
commit
8fd4e8f722
|
@ -7,8 +7,9 @@ import (
|
|||
|
||||
// Analyzer 分析器
|
||||
type Analyzer struct {
|
||||
v map[string]float64
|
||||
repeat map[string]struct{}
|
||||
v map[string]float64 // 记录了每个 key 的当前值
|
||||
vc map[string]int64 // 记录了每个 key 生效的计数数量
|
||||
repeat map[string]struct{} // 去重信息
|
||||
subs map[string]*Analyzer
|
||||
m sync.Mutex
|
||||
}
|
||||
|
@ -37,13 +38,10 @@ func (slf *Analyzer) Increase(key string, record R, recordKey string) {
|
|||
}
|
||||
if slf.v == nil {
|
||||
slf.v = make(map[string]float64)
|
||||
slf.vc = make(map[string]int64)
|
||||
}
|
||||
v, e := slf.v[key]
|
||||
if !e {
|
||||
slf.v[key] = record.GetFloat64(recordKey)
|
||||
return
|
||||
}
|
||||
slf.v[key] = v + record.GetFloat64(recordKey)
|
||||
slf.v[key] += record.GetFloat64(recordKey)
|
||||
slf.vc[key]++
|
||||
}
|
||||
|
||||
// IncreaseValue 在指定 key 现有值的基础上增加 value
|
||||
|
@ -52,8 +50,10 @@ func (slf *Analyzer) IncreaseValue(key string, value float64) {
|
|||
defer slf.m.Unlock()
|
||||
if slf.v == nil {
|
||||
slf.v = make(map[string]float64)
|
||||
slf.vc = make(map[string]int64)
|
||||
}
|
||||
slf.v[key] += value
|
||||
slf.vc[key]++
|
||||
}
|
||||
|
||||
// IncreaseNonRepeat 在指定 key 现有值的基础上增加 recordKey 的值,但是当去重维度 dimension 相同时,不会增加
|
||||
|
|
|
@ -9,6 +9,7 @@ func newReport(analyzer *Analyzer) *Report {
|
|||
analyzer: analyzer,
|
||||
Name: "ROOT",
|
||||
Values: analyzer.v,
|
||||
Counter: analyzer.vc,
|
||||
Subs: make([]*Report, 0, len(analyzer.subs)),
|
||||
}
|
||||
for k, v := range analyzer.subs {
|
||||
|
@ -24,9 +25,39 @@ type Report struct {
|
|||
analyzer *Analyzer
|
||||
Name string // 报告名称(默认为 ROOT)
|
||||
Values map[string]float64 `json:"Values,omitempty"`
|
||||
Counter map[string]int64 `json:"Count,omitempty"`
|
||||
Subs []*Report `json:"Reports,omitempty"`
|
||||
}
|
||||
|
||||
// Avg 计算平均值
|
||||
func (slf *Report) Avg(key string) float64 {
|
||||
return slf.Values[key] / float64(slf.Counter[key])
|
||||
}
|
||||
|
||||
// Count 获取特定 key 的计数次数
|
||||
func (slf *Report) Count(key string) int64 {
|
||||
return slf.Counter[key]
|
||||
}
|
||||
|
||||
// Sum 获取特定 key 的总和
|
||||
func (slf *Report) Sum(keys ...string) float64 {
|
||||
var sum float64
|
||||
for _, key := range keys {
|
||||
sum += slf.Values[key]
|
||||
}
|
||||
return sum
|
||||
}
|
||||
|
||||
// Sub 获取特定名称的子报告
|
||||
func (slf *Report) Sub(name string) *Report {
|
||||
for _, sub := range slf.Subs {
|
||||
if sub.Name == name {
|
||||
return sub
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ReserveSub 仅保留特定名称子报告
|
||||
func (slf *Report) ReserveSub(names ...string) *Report {
|
||||
report := newReport(slf.analyzer)
|
||||
|
|
Loading…
Reference in New Issue