You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
302 lines
8.1 KiB
302 lines
8.1 KiB
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 |
|
}
|
|
|