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