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.
266 lines
5.6 KiB
266 lines
5.6 KiB
package search |
|
|
|
import ( |
|
"encoding/json" |
|
|
|
"go-common/app/interface/main/tv/model" |
|
"go-common/app/interface/main/tv/model/thirdp" |
|
"go-common/library/time" |
|
|
|
"github.com/siddontang/go-mysql/mysql" |
|
) |
|
|
|
const ( |
|
_pgcType = 1 |
|
_ugcType = 2 |
|
_hotestOrder = 2 |
|
// AllLabel is the string that means all data |
|
AllLabel = "-1" // it means all for index |
|
) |
|
|
|
// EsPage def. |
|
type EsPage struct { |
|
Num int `json:"num"` |
|
Size int `json:"size"` |
|
Total int `json:"total"` |
|
PageNum int `json:"page_num"` |
|
} |
|
|
|
// GetPageNb def. |
|
func (v *EsPage) GetPageNb() { |
|
if v.Total%v.Size == 0 { |
|
v.PageNum = v.Total / v.Size |
|
} else { |
|
v.PageNum = v.Total/v.Size + 1 |
|
} |
|
} |
|
|
|
// EsPgcResult def. |
|
type EsPgcResult struct { |
|
Page *EsPage `json:"page"` |
|
Result []*PgcEsMdl `json:"result"` |
|
} |
|
|
|
// EsUgcResult def. |
|
type EsUgcResult struct { |
|
Page *EsPage `json:"page"` |
|
Result []*UgcEsMdl `json:"result"` |
|
} |
|
|
|
// UgcEsMdl def. |
|
type UgcEsMdl struct { |
|
AID int64 `json:"aid"` |
|
TypeID int32 `json:"typeid"` |
|
} |
|
|
|
// PgcEsMdl def. |
|
type PgcEsMdl struct { |
|
SeasonID int64 `json:"season_id"` |
|
} |
|
|
|
// EsCard def. |
|
type EsCard struct { |
|
model.Card |
|
DataType int `json:"data_type"` // 1=pgc, 2=ugc |
|
} |
|
|
|
// EsPager def. |
|
type EsPager struct { |
|
Title string `json:"title"` |
|
Page *EsPage `json:"page"` |
|
Result []*EsCard `json:"result"` |
|
} |
|
|
|
// FromPgc def. |
|
func (v *EsCard) FromPgc(card *model.Card) { |
|
v.Card = *card |
|
v.DataType = _pgcType |
|
} |
|
|
|
// FromUgc def. |
|
func (v *EsCard) FromUgc(card *model.Card) { |
|
v.Card = *card |
|
v.DataType = _ugcType |
|
} |
|
|
|
// ReqEsPn is part of the es request for page related cfg |
|
type ReqEsPn struct { |
|
Ps int `form:"ps" default:"50"` |
|
Pn int `form:"pn" default:"1"` |
|
Order int `form:"order" validate:"required"` |
|
Sort int `form:"sort" default:"0"` |
|
} |
|
|
|
// ReqPgcIdx is bm request for pgc index |
|
type ReqPgcIdx struct { |
|
SeasonType int `form:"category" validate:"required,max=5"` |
|
ProducerID int `form:"producer_id"` |
|
Year string `form:"year"` |
|
StyleID int `form:"style_id"` |
|
PubDate string `form:"pub_date"` |
|
SeasonMonth int `form:"season_month" validate:"max=10"` |
|
SeasonStatus []int `form:"season_status,split"` |
|
Copyright []int `form:"copyright,split"` |
|
IsFinish string `form:"is_finish"` |
|
Area []int `form:"area,split"` |
|
SeasonVersion int `form:"season_version"` |
|
ReqEsPn |
|
} |
|
|
|
// IsDefault def. |
|
func (v *ReqPgcIdx) IsDefault() bool { |
|
return v.Order == _hotestOrder && v.ProducerID <= 0 && |
|
v.IsAllStr(v.Year) && v.StyleID <= 0 && v.IsAllStr(v.PubDate) && v.SeasonMonth <= 0 && |
|
v.IsAll(v.SeasonStatus) && v.IsAll(v.Copyright) && v.IsAllStr(v.IsFinish) && v.IsAll(v.Area) && |
|
v.SeasonVersion <= 0 |
|
} |
|
|
|
// IsDefault def. |
|
func (v *ReqUgcIdx) IsDefault() bool { |
|
return v.Order == _hotestOrder && v.SecondTID <= 0 && (v.PubTime == "" || v.PubTime == AllLabel) |
|
} |
|
|
|
// Title def. |
|
func (v *ReqPgcIdx) Title() string { |
|
return thirdp.PgcCat(v.SeasonType) |
|
} |
|
|
|
// PgcOrder treats the order to get the responding field |
|
func (v *ReqPgcIdx) PgcOrder() (field string) { |
|
switch v.Order { |
|
case 0: // update time |
|
return "latest_time" |
|
case 1: |
|
return "dm_count" |
|
case 2: |
|
return "play_count" |
|
case 3: // follow |
|
return "fav_count" |
|
case 4: |
|
return "score" |
|
case 5: // for others |
|
return "pub_time" |
|
case 6: // for movie |
|
return "release_date" |
|
default: |
|
return "play_count" |
|
} |
|
} |
|
|
|
// IdxSort treats the sort |
|
func IdxSort(sortV int) (sort string) { |
|
switch sortV { |
|
case 0: |
|
return "desc" |
|
case 1: |
|
return "asc" |
|
default: |
|
return "desc" |
|
} |
|
} |
|
|
|
// ReqUgcIdx is bm request for ugc index |
|
type ReqUgcIdx struct { |
|
ParentTID int32 `form:"category" validate:"required"` |
|
SecondTID int32 `form:"typeid"` |
|
PubTime string `form:"pubtime"` |
|
ReqEsPn |
|
} |
|
|
|
// TimeStr picks json str from request and returns the time range struct in String format |
|
func (v *ReqUgcIdx) TimeStr() (res *UgcTime, err error) { |
|
var pubTimeV = &UgcTimeV{} |
|
if err = json.Unmarshal([]byte(v.PubTime), &pubTimeV); err != nil { |
|
return |
|
} |
|
res = &UgcTime{ |
|
STime: pubTimeV.STime.Time().Format(mysql.TimeFormat), |
|
ETime: pubTimeV.ETime.Time().Format(mysql.TimeFormat), |
|
} |
|
return |
|
} |
|
|
|
// UgcTimeV def. INT64 for http |
|
type UgcTimeV struct { |
|
STime time.Time `json:"stime"` |
|
ETime time.Time `json:"etime"` |
|
} |
|
|
|
// UgcTime def. STRING for ES |
|
type UgcTime struct { |
|
STime string `json:"stime"` |
|
ETime string `json:"etime"` |
|
} |
|
|
|
// SrvUgcIdx is the request treated by service for DAO, like type_id field and pub_time |
|
type SrvUgcIdx struct { |
|
TIDs []int32 |
|
PubTime *UgcTime |
|
ReqEsPn |
|
} |
|
|
|
// UgcOrder treats the order to get the responding field |
|
func (v *SrvUgcIdx) UgcOrder() (field string) { |
|
switch v.Order { |
|
case 1: // update time |
|
return "pubtime" |
|
case 2: |
|
return "click" |
|
default: |
|
return "click" |
|
} |
|
} |
|
|
|
// ReqIdxInterv is used for index intervention treatment |
|
type ReqIdxInterv struct { |
|
EsIDs []int64 |
|
Category int |
|
IsPGC bool |
|
Pn int |
|
} |
|
|
|
// FromPGC def. |
|
func (v *ReqIdxInterv) FromPGC(sids []int64, req *ReqPgcIdx) { |
|
v.EsIDs = sids |
|
v.Category = req.SeasonType |
|
v.IsPGC = true |
|
v.Pn = req.Pn |
|
} |
|
|
|
// FromUGC def. |
|
func (v *ReqIdxInterv) FromUGC(aids []int64, req *ReqUgcIdx) { |
|
v.EsIDs = aids |
|
v.Category = int(req.ParentTID) |
|
v.IsPGC = false |
|
v.Pn = req.Pn |
|
} |
|
|
|
// IdxIntervSave def. |
|
type IdxIntervSave struct { |
|
Pgc map[int][]int64 |
|
Ugc map[int][]int64 |
|
} |
|
|
|
// IsAll checks whether a slice of int means all data |
|
func (v *ReqPgcIdx) IsAll(params []int) (res bool) { |
|
if len(params) == 0 { |
|
return true |
|
} |
|
for _, v := range params { |
|
if v < 0 { |
|
return true |
|
} |
|
} |
|
return false |
|
} |
|
|
|
// IsAllStr checks whether a string means all data |
|
func (v *ReqPgcIdx) IsAllStr(duration string) (res bool) { |
|
if duration == "" { |
|
return true |
|
} |
|
if duration == AllLabel { |
|
return true |
|
} |
|
return false |
|
}
|
|
|