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