bilibili-backup/app/service/main/reply-feed/model/model.go
2019-04-22 02:59:20 +00:00

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 })
}
}