go-common/app/job/main/reply-feed/model/model.go

303 lines
8.1 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
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
}