-
Notifications
You must be signed in to change notification settings - Fork 15
/
report.go
148 lines (137 loc) · 3 KB
/
report.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package survey
import (
"fmt"
"github.com/kercylan98/minotaur/utils/super"
"strings"
)
func newReport(analyzer *Analyzer) *Report {
report := &Report{
analyzer: analyzer,
Name: "ROOT",
Values: make(map[string]any),
Counter: analyzer.vc,
Subs: make([]*Report, 0, len(analyzer.subs)),
}
for k, v := range analyzer.v {
if format, exist := analyzer.format[k]; exist {
func() {
defer func() {
if err := recover(); err != nil {
panic(fmt.Errorf("format key[%s] value[%v] error: %v", k, v, err))
}
}()
report.Values[k] = format(v)
}()
continue
}
report.Values[k] = v
}
for k, v := range analyzer.subs {
sub := newReport(v)
sub.Name = k
report.Subs = append(report.Subs, sub)
}
return report
}
// Report 分析报告
type Report struct {
analyzer *Analyzer
Name string // 报告名称(默认为 ROOT)
Values map[string]any `json:"Values,omitempty"`
Counter map[string]int64 `json:"Count,omitempty"`
Subs []*Report `json:"Reports,omitempty"`
}
// Avg 计算平均值
func (slf *Report) Avg(key string) float64 {
value, exist := slf.Values[key]
if !exist {
return 0
}
valF, ok := value.(float64)
if !ok {
return 0
}
return valF / 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 {
value, exist := slf.Values[key]
if !exist {
continue
}
valF, ok := value.(float64)
if !ok {
continue
}
sum += valF
}
return sum
}
// Sub 获取特定名称的子报告
func (slf *Report) Sub(name string) *Report {
for _, sub := range slf.Subs {
if sub.Name == name {
return sub
}
}
return nil
}
// ReserveSubByPrefix 仅保留特定前缀的子报告
func (slf *Report) ReserveSubByPrefix(prefix string) *Report {
report := newReport(slf.analyzer)
var newSub []*Report
for _, sub := range slf.Subs {
if strings.HasPrefix(sub.Name, prefix) {
newSub = append(newSub, sub)
}
}
report.Subs = newSub
return report
}
// ReserveSub 仅保留特定名称子报告
func (slf *Report) ReserveSub(names ...string) *Report {
report := newReport(slf.analyzer)
var newSub []*Report
for _, sub := range slf.Subs {
var exist bool
for _, name := range names {
if sub.Name == name {
exist = true
break
}
}
if exist {
newSub = append(newSub, sub)
}
}
report.Subs = newSub
return report
}
// FilterSub 将特定名称的子报告过滤掉
func (slf *Report) FilterSub(names ...string) *Report {
report := newReport(slf.analyzer)
var newSub []*Report
for _, sub := range slf.Subs {
var exist bool
for _, name := range names {
if sub.Name == name {
exist = true
break
}
}
if !exist {
newSub = append(newSub, sub)
}
}
report.Subs = newSub
return report
}
func (slf *Report) String() string {
return string(super.MarshalIndentJSON(slf, "", " "))
}