go-common/app/interface/main/tv/model/search/elastic.go

267 lines
5.6 KiB
Go
Raw Normal View History

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