267 lines
5.6 KiB
Go
267 lines
5.6 KiB
Go
|
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
|
||
|
}
|