237 lines
6.0 KiB
Go
237 lines
6.0 KiB
Go
package model
|
|
|
|
import (
|
|
"go-common/library/ecode"
|
|
"sort"
|
|
)
|
|
|
|
// const var
|
|
const (
|
|
WilsonLHRRAlgorithm = "wilsonLHRR"
|
|
WilsonLHRRFluidAlgorithm = "wilsonLHRRFluid"
|
|
OriginAlgorithm = "origin"
|
|
LikeDescAlgorithm = "likeDesc"
|
|
|
|
StateInactive = int(0)
|
|
StateActive = int(1)
|
|
|
|
SlotsNum = 100
|
|
|
|
DefaultSlotName = "default"
|
|
DefaultAlgorithm = "default"
|
|
DefaultWeight = ""
|
|
)
|
|
|
|
// EventMsg EventMsg
|
|
type EventMsg struct {
|
|
Action string `json:"action"`
|
|
Oid int64 `json:"oid"`
|
|
Tp int `json:"tp"`
|
|
}
|
|
|
|
// SlotsMapping slot name mapping
|
|
type SlotsMapping struct {
|
|
Name string
|
|
Slots []int
|
|
State int
|
|
}
|
|
|
|
// SlotsStat slots stat
|
|
type SlotsStat struct {
|
|
Name string
|
|
Slots []int
|
|
Algorithm string
|
|
Weight string
|
|
State int
|
|
}
|
|
|
|
// StatisticsStats StatisticsStats
|
|
type StatisticsStats []*StatisticsStat
|
|
|
|
// GroupByName group statistics by name
|
|
func (s StatisticsStats) GroupByName() (res map[string]StatisticsStats) {
|
|
res = make(map[string]StatisticsStats)
|
|
for _, stat := range s {
|
|
if _, ok := res[stat.Name]; ok {
|
|
res[stat.Name] = append(res[stat.Name], stat)
|
|
} else {
|
|
var tmp []*StatisticsStat
|
|
tmp = append(tmp, stat)
|
|
res[stat.Name] = tmp
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
// StatisticsStat 实验组或者对照组的各项统计
|
|
type StatisticsStat struct {
|
|
// 流量所属槽位 0~99
|
|
Slot int
|
|
// 所属实验组名
|
|
Name string
|
|
State int
|
|
Date int
|
|
Hour int
|
|
HotLike int64
|
|
HotHate int64
|
|
HotReport int64
|
|
HotChildReply int64
|
|
// 整个评论区
|
|
TotalLike int64
|
|
TotalHate int64
|
|
TotalReport int64
|
|
TotalChildReply int64
|
|
TotalRootReply int64
|
|
// 用户点开评论区次数
|
|
View uint32
|
|
// 评论列表接口调用次数
|
|
TotalView uint32
|
|
// 热门评论接口调用次数
|
|
HotView uint32
|
|
// 更多热门评论点击次数
|
|
HotClick uint32
|
|
// 用户在评论首页看到的热门评论被点赞点踩评论以及举报的次数
|
|
|
|
// UV的统计数据
|
|
HotLikeUV int64
|
|
HotHateUV int64
|
|
HotReportUV int64
|
|
HotChildUV int64
|
|
|
|
TotalLikeUV int64
|
|
TotalHateUV int64
|
|
TotalReportUV int64
|
|
TotalChildUV int64
|
|
TotalRootUV int64
|
|
}
|
|
|
|
// Merge Merge
|
|
func (stat1 *StatisticsStat) Merge(stat2 *StatisticsStat) (stat3 *StatisticsStat) {
|
|
stat3 = new(StatisticsStat)
|
|
stat3.View = stat1.View + stat2.View
|
|
stat3.HotView = stat1.HotView + stat2.HotView
|
|
stat3.HotClick = stat1.HotClick + stat2.HotClick
|
|
stat3.TotalView = stat1.TotalView + stat2.TotalView
|
|
return
|
|
}
|
|
|
|
// DivideByPercent ...
|
|
func (stat1 *StatisticsStat) DivideByPercent(percent int64) (stat2 *StatisticsStat) {
|
|
stat2 = new(StatisticsStat)
|
|
if percent <= 0 {
|
|
return
|
|
}
|
|
stat2.Name = stat1.Name
|
|
stat2.Date = stat1.Date
|
|
stat2.Hour = stat1.Hour
|
|
stat2.View = stat1.View / uint32(percent)
|
|
stat2.HotView = stat1.HotView / uint32(percent)
|
|
stat2.HotClick = stat1.HotClick / uint32(percent)
|
|
stat2.TotalView = stat1.TotalView / uint32(percent)
|
|
stat2.HotLike = stat1.HotLike / percent
|
|
stat2.HotHate = stat1.HotHate / percent
|
|
stat2.HotChildReply = stat1.HotChildReply / percent
|
|
stat2.HotReport = stat1.HotReport / percent
|
|
stat2.TotalLike = stat1.TotalLike / percent
|
|
stat2.TotalHate = stat1.TotalHate / percent
|
|
stat2.TotalReport = stat1.TotalReport / percent
|
|
stat2.TotalRootReply = stat1.TotalRootReply / percent
|
|
stat2.TotalChildReply = stat1.TotalChildReply / percent
|
|
return
|
|
}
|
|
|
|
// MergeByDate MergeByDate
|
|
func (stat1 *StatisticsStat) MergeByDate(stat2 *StatisticsStat) (stat3 *StatisticsStat) {
|
|
stat3 = new(StatisticsStat)
|
|
stat3.Name = stat1.Name
|
|
stat3.Date = stat1.Date
|
|
stat3.View = stat1.View + stat2.View
|
|
stat3.HotView = stat1.HotView + stat2.HotView
|
|
stat3.HotClick = stat1.HotClick + stat2.HotClick
|
|
stat3.TotalView = stat1.TotalView + stat2.TotalView
|
|
stat3.HotLike = stat1.HotLike + stat2.HotLike
|
|
stat3.HotHate = stat1.HotHate + stat2.HotHate
|
|
stat3.HotChildReply = stat1.HotChildReply + stat2.HotChildReply
|
|
stat3.HotReport = stat1.HotReport + stat2.HotReport
|
|
stat3.TotalLike = stat1.TotalLike + stat2.TotalLike
|
|
stat3.TotalHate = stat1.TotalHate + stat2.TotalHate
|
|
stat3.TotalReport = stat1.TotalReport + stat2.TotalReport
|
|
stat3.TotalRootReply = stat1.TotalRootReply + stat2.TotalRootReply
|
|
stat3.TotalChildReply = stat1.TotalChildReply + stat2.TotalChildReply
|
|
return
|
|
}
|
|
|
|
// WilsonLHRRWeight wilson score interval weight
|
|
type WilsonLHRRWeight struct {
|
|
Like float64 `json:"like"`
|
|
Hate float64 `json:"hate"`
|
|
Reply float64 `json:"reply"`
|
|
Report float64 `json:"report"`
|
|
}
|
|
|
|
// Validate Validate
|
|
func (weight WilsonLHRRWeight) Validate() (err error) {
|
|
if weight.Report*weight.Reply*weight.Hate*weight.Like <= 0 {
|
|
err = ecode.RequestErr
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// WilsonLHRRFluidWeight WilsonLHRRFluidWeight
|
|
type WilsonLHRRFluidWeight struct {
|
|
Like float64 `json:"like"`
|
|
Hate float64 `json:"hate"`
|
|
Reply float64 `json:"reply"`
|
|
Report float64 `json:"report"`
|
|
Slope float64 `json:"slope"`
|
|
}
|
|
|
|
// Validate Validate
|
|
func (weight WilsonLHRRFluidWeight) Validate() (err error) {
|
|
if weight.Report*weight.Reply*weight.Hate*weight.Like*weight.Slope <= 0 {
|
|
err = ecode.RequestErr
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
// SSReq ss req
|
|
type SSReq struct {
|
|
DateFrom int64 `form:"date_from" validate:"required"`
|
|
DateEnd int64 `form:"date_end" validate:"required"`
|
|
Hour bool `form:"hour"`
|
|
}
|
|
|
|
// SSHourRes ss res
|
|
type SSHourRes struct {
|
|
Legend []string `json:"legend"`
|
|
XAxis []string `json:"x_axis"`
|
|
Series map[string][]*StatisticsStat `json:"series"`
|
|
}
|
|
|
|
// Sort ...
|
|
func (s *SSHourRes) Sort() {
|
|
sort.Strings(s.Legend)
|
|
sort.Strings(s.XAxis)
|
|
for _, v := range s.Series {
|
|
sort.Slice(v, func(i, j int) bool { return v[i].Date*100+v[i].Hour < v[j].Date*100+v[j].Hour })
|
|
}
|
|
}
|
|
|
|
// SSDateRes ss res
|
|
type SSDateRes struct {
|
|
Legend []string `json:"legend"`
|
|
XAxis []int `json:"x_axis"`
|
|
Series map[string][]*StatisticsStat `json:"series"`
|
|
}
|
|
|
|
// Sort ...
|
|
func (s *SSDateRes) Sort() {
|
|
sort.Strings(s.Legend)
|
|
sort.Ints(s.XAxis)
|
|
for _, v := range s.Series {
|
|
sort.Slice(v, func(i, j int) bool { return v[i].Date < v[j].Date })
|
|
}
|
|
}
|