303 lines
8.1 KiB
Go
303 lines
8.1 KiB
Go
package model
|
||
|
||
import (
|
||
xtime "go-common/library/time"
|
||
)
|
||
|
||
// const varialble
|
||
const (
|
||
DefaultAlgorithm = "default"
|
||
WilsonLHRRAlgorithm = "wilsonLHRR"
|
||
WilsonLHRRFluidAlgorithm = "wilsonLHRRFluid"
|
||
OriginAlgorithm = "origin"
|
||
LikeDescAlgorithm = "likeDesc"
|
||
StateInactive = int(0)
|
||
StateActive = int(1)
|
||
StateDelete = int(2)
|
||
|
||
// 用于redis中统计uv
|
||
StatisticActionRootReply = "rr"
|
||
StatisticActionChildReply = "cr"
|
||
StatisticActionLike = "l"
|
||
StatisticActionHate = "h"
|
||
StatisticActionReport = "r"
|
||
|
||
StatisticKindTotal = "t"
|
||
StatisticKindHot = "h"
|
||
|
||
DatabusActionReply = "reply"
|
||
DatabusActionReport = "report_add"
|
||
DatabusActionLike = "like"
|
||
DatabusActionCancelLike = "like_cancel"
|
||
DatabusActionHate = "hate"
|
||
DatabusActionCancelHate = "hate_cancel"
|
||
// user upper or admin delete
|
||
DatabusActionDel = "reply_del"
|
||
// admin delete by report
|
||
DatabusActionRptDel = "report_del"
|
||
// admin recover
|
||
DatabusActionRecover = "reply_recover"
|
||
// admin or upper top reply
|
||
DatabusActionTop = "top"
|
||
// admin or upper untop reply
|
||
DatabusActionUnTop = "untop"
|
||
|
||
DatabusActionReIdx = "re_idx"
|
||
|
||
// 只有大于等于3个赞且评论区根评论数目多余20才会被加入热门评论列表
|
||
MinLikeCount = 3
|
||
MinRootReplyCount = 20
|
||
SlotsNum = 100
|
||
)
|
||
|
||
// Statistics const
|
||
var (
|
||
StatisticActions = []string{StatisticActionRootReply, StatisticActionChildReply, StatisticActionLike, StatisticActionHate, StatisticActionReport}
|
||
StatisticKinds = []string{StatisticKindTotal, StatisticKindHot}
|
||
StatisticsDatabaseI = []string{"`name`", "`date`", "`hour`"}
|
||
StatisticsDatabaseU = []string{"hot_like", "hot_hate", "hot_report", "hot_child", "total_like", "total_hate", "total_report", "total_root", "total_child"}
|
||
StatisticsDatabaseS = []string{"hot_like_uv", "hot_hate_uv", "hot_report_uv", "hot_child_uv", "total_like_uv", "total_hate_uv", "total_report_uv", "total_child_uv", "total_root_uv"}
|
||
)
|
||
|
||
// ReplyScore reply score
|
||
type ReplyScore struct {
|
||
RpID int64
|
||
Score float64
|
||
}
|
||
|
||
// ReplyStat 放在MC里的衡量一条根评论质量的各个参数
|
||
type ReplyStat struct {
|
||
RpID int64 `json:"rpid"`
|
||
Like int `json:"like"`
|
||
Hate int `json:"hate"`
|
||
Reply int `json:"reply"`
|
||
Report int `json:"report"`
|
||
SubjectTime xtime.Time `json:"subject_time"`
|
||
ReplyTime xtime.Time `json:"reply_time"`
|
||
}
|
||
|
||
// ReplyResp 返回给reply-interface的评论ID数组,已按热度排好序
|
||
type ReplyResp struct {
|
||
RpIDs []int64
|
||
// 属于哪一个实验组
|
||
TestSetName string
|
||
}
|
||
|
||
// ReplyList 存在redis sorted set中的数据结构
|
||
type ReplyList struct {
|
||
RpID []int64
|
||
}
|
||
|
||
// SlotStat slot stat
|
||
type SlotStat struct {
|
||
Name string
|
||
Slot int
|
||
Algorithm string
|
||
Weight string
|
||
}
|
||
|
||
// SlotsStat SlotsStat
|
||
type SlotsStat struct {
|
||
Name string
|
||
Slots []int
|
||
Algorithm string
|
||
Weight string
|
||
}
|
||
|
||
// SlotsMapping E group slots
|
||
type SlotsMapping struct {
|
||
Name string
|
||
Slots []int
|
||
}
|
||
|
||
// StatisticsStat 实验组或者对照组的各项统计
|
||
type StatisticsStat struct {
|
||
// 流量所属槽位 0~99
|
||
Slot int
|
||
// 所属实验组名
|
||
Name string
|
||
// 用户在评论首页看到的热门评论被点赞点踩评论以及举报的次数
|
||
HotLike int64
|
||
HotHate int64
|
||
HotChildReply int64
|
||
HotReport int64
|
||
// 整个评论区
|
||
TotalLike int64
|
||
TotalHate int64
|
||
TotalReport int64
|
||
TotalRootReply int64
|
||
TotalChildReply int64
|
||
|
||
HotLikeUV int64
|
||
HotHateUV int64
|
||
HotReportUV int64
|
||
HotChildUV int64
|
||
|
||
TotalLikeUV int64
|
||
TotalHateUV int64
|
||
TotalReportUV int64
|
||
TotalChildUV int64
|
||
TotalRootUV int64
|
||
}
|
||
|
||
// Merge merge two statistics
|
||
func (stat1 *StatisticsStat) Merge(stat2 *StatisticsStat) (stat3 *StatisticsStat) {
|
||
stat3 = new(StatisticsStat)
|
||
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
|
||
stat3.HotLike = stat1.HotLike + stat2.HotLike
|
||
stat3.HotHate = stat1.HotHate + stat2.HotHate
|
||
stat3.HotReport = stat1.HotReport + stat2.HotReport
|
||
stat3.HotChildReply = stat1.HotChildReply + stat2.HotChildReply
|
||
|
||
stat3.HotLikeUV = stat1.HotLikeUV + stat2.HotLikeUV
|
||
stat3.HotHateUV = stat1.HotHateUV + stat2.HotHateUV
|
||
stat3.HotReportUV = stat1.HotReportUV + stat2.HotReportUV
|
||
stat3.HotChildUV = stat1.HotChildUV + stat2.HotChildUV
|
||
|
||
stat3.TotalLikeUV = stat1.TotalLikeUV + stat2.TotalLikeUV
|
||
stat3.TotalHateUV = stat1.TotalHateUV + stat2.TotalHateUV
|
||
stat3.TotalReportUV = stat1.TotalReportUV + stat2.TotalReportUV
|
||
stat3.TotalRootUV = stat1.TotalRootUV + stat2.TotalRootUV
|
||
stat3.TotalChildUV = stat1.TotalChildUV + stat2.TotalChildUV
|
||
return
|
||
}
|
||
|
||
// StrategyStat 实验组所使用算法,以及各个参数情况
|
||
type StrategyStat struct {
|
||
Name string `json:"name"`
|
||
Percent int `json:"percent"`
|
||
Algorithm string `json:"algorithm"`
|
||
Args map[string]float64 `json:"args"`
|
||
}
|
||
|
||
// RefreshChecker 刷新热门评论的触发条件,用来对同一个评论区的所有请求进行聚合
|
||
type RefreshChecker struct {
|
||
Oid int64
|
||
Type int
|
||
LastTimeStamp int64
|
||
}
|
||
|
||
// WilsonLHRRWeight wilson score interval weight
|
||
type WilsonLHRRWeight struct {
|
||
Like float64
|
||
Hate float64
|
||
Reply float64
|
||
Report float64
|
||
}
|
||
|
||
// WilsonLHRRFluidWeight wilson
|
||
type WilsonLHRRFluidWeight struct {
|
||
Like float64
|
||
Hate float64
|
||
Reply float64
|
||
Report float64
|
||
Slope float64
|
||
}
|
||
|
||
// EventMsg event message
|
||
type EventMsg struct {
|
||
Action string `json:"action"`
|
||
Oid int64 `json:"oid"`
|
||
Tp int `json:"tp"`
|
||
}
|
||
|
||
// StatsMsg stats message
|
||
type StatsMsg struct {
|
||
Action string `json:"action"`
|
||
Mid int64 `json:"mid"`
|
||
Subject *Subject `json:"subject"`
|
||
Reply *Reply `json:"reply"`
|
||
Report *Report `json:"report,omitempty"`
|
||
}
|
||
|
||
// Sharding 返回该用户属于哪一个组
|
||
// 将流量划分为100份
|
||
func (r *StatsMsg) Sharding() int64 {
|
||
return r.Mid % SlotsNum
|
||
}
|
||
|
||
// HotCondition return if should check exists in hot reply
|
||
func (r *StatsMsg) HotCondition() bool {
|
||
if r.Action == DatabusActionReply && !r.Reply.IsRoot() {
|
||
return true
|
||
}
|
||
if r.Reply.IsRoot() && r.Reply.Like >= MinLikeCount &&
|
||
(r.Action == DatabusActionLike || r.Action == DatabusActionHate ||
|
||
r.Action == DatabusActionCancelLike || r.Action == DatabusActionCancelHate || r.Action == DatabusActionReport) {
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
|
||
// Reply define reply object
|
||
type Reply struct {
|
||
RpID int64 `json:"rpid"`
|
||
Mid int64 `json:"mid"`
|
||
Root int64 `json:"root"`
|
||
Parent int64 `json:"parent"`
|
||
RCount int `json:"rcount"`
|
||
Floor int `json:"floor"`
|
||
State int8 `json:"state"`
|
||
Attr uint32 `json:"attr"`
|
||
CTime xtime.Time `json:"ctime"`
|
||
Like int `json:"like"`
|
||
Hate int `json:"hate"`
|
||
}
|
||
|
||
// Legal return a reply legal
|
||
func (r *Reply) Legal() bool {
|
||
// 0,1,2,5,6 所有需要显示给用户的评论state
|
||
return r.State == 0 || r.State == 1 || r.State == 2 || r.State == 5 || r.State == 6
|
||
}
|
||
|
||
// ShowAfterAudit ShowAfterAudit
|
||
func (r *Reply) ShowAfterAudit() bool {
|
||
return r.State == 11
|
||
}
|
||
|
||
// AuditButShow AuditButShow
|
||
func (r *Reply) AuditButShow() bool {
|
||
return r.State == 5
|
||
}
|
||
|
||
// IsRoot IsRoot
|
||
func (r *Reply) IsRoot() bool {
|
||
return r.Root == 0
|
||
}
|
||
|
||
// Qualified Qualified
|
||
func (r *Reply) Qualified() bool {
|
||
return r.Like >= MinLikeCount
|
||
}
|
||
|
||
// Report define reply report
|
||
type Report struct {
|
||
RpID int64 `json:"rpid"`
|
||
Mid int64 `json:"mid"`
|
||
Count int `json:"count"`
|
||
Score int `json:"score"`
|
||
State int8 `json:"state"`
|
||
CTime xtime.Time `json:"ctime"`
|
||
Attr uint32 `json:"attr"`
|
||
}
|
||
|
||
// Subject is subject of reply
|
||
type Subject struct {
|
||
Oid int64 `json:"oid"`
|
||
Type int `json:"type"`
|
||
Mid int64 `json:"mid"`
|
||
RCount int `json:"rcount"`
|
||
State int8 `json:"state"`
|
||
Attr uint32 `json:"attr"`
|
||
CTime xtime.Time `json:"ctime"`
|
||
}
|
||
|
||
// ShowHotReply if show
|
||
func (s *Subject) ShowHotReply() bool {
|
||
return s.RCount >= MinRootReplyCount
|
||
}
|