go-common/app/interface/main/dm2/dao/search.go

419 lines
12 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
package dao
import (
"context"
"fmt"
"strconv"
"strings"
"time"
"go-common/app/interface/main/dm2/model"
"go-common/library/database/elastic"
"go-common/library/log"
"go-common/library/xstr"
)
var (
_dataTimeFormat = "2006-01-02 15:03:04"
_subtitleFields = []string{"oid", "id"}
_dmRecentFields = []string{"attr", "color", "ctime", "fontsize", "id", "mid", "mode", "msg", "mtime", "oid", "pool", "progress", "state", "type", "pid"}
)
func hisDateIndex(month string) string {
return "dm_date_" + strings.Replace(month, "-", "_", -1)
}
// SearchDMHisIndex get dm date index by oid from search.
func (d *Dao) SearchDMHisIndex(c context.Context, tp int32, oid int64, month string) (dates []string, err error) {
var (
pn, ps = 1, 31
res model.SearchHistoryIdxResult
)
req := d.elastic.NewRequest("dm_date")
req.Fields("date").WhereEq("oid", oid)
req.Index(hisDateIndex(month)).Pn(pn).Ps(ps).Order("date", "asc")
if err = req.Scan(c, &res); err != nil {
log.Error("elastic search(%s) error(%v)", req.Params(), err)
return
}
for _, v := range res.Result {
dates = append(dates, v.Date)
}
return
}
// SearchDMHistory get history dmid from search.
// 搜索定制api改动需要沟通
func (d *Dao) SearchDMHistory(c context.Context, tp int32, oid, ctimeTo int64, pn, ps int) (dmids []int64, err error) {
var (
res model.SearchHistoryResult
end = time.Unix(ctimeTo, 0).Format("2006-01-02 15:04:05")
)
req := d.elastic.NewRequest("dm_history")
req.Index(fmt.Sprintf("dm_search_%03d", oid%_indexSharding))
req.Fields("id").WhereEq("oid", oid).WhereIn("state", []int64{0, 2, 6})
req.WhereRange("ctime", nil, end, elastic.RangeScopeLcRc)
req.Pn(pn).Ps(ps).Order("ctime", "desc")
if err = req.Scan(c, &res); err != nil {
log.Error("elastic search(%s) error(%v)", req.Params(), err)
return
}
for _, v := range res.Result {
dmids = append(dmids, v.ID)
}
return
}
// SearchDM 搜索弹幕
func (d *Dao) SearchDM(c context.Context, p *model.SearchDMParams) (res *model.SearchDMData, err error) {
req := d.elastic.NewRequest("dm_search")
req.Fields("id").Index(fmt.Sprintf("dm_search_%03d", p.Oid%_indexSharding)).WhereEq("oidstr", p.Oid)
if p.Mids != "" {
mids, _ := xstr.SplitInts(p.Mids)
req.WhereIn("mid", mids)
}
if p.State != "" {
states, _ := xstr.SplitInts(p.State)
req.WhereIn("state", states)
}
if p.Mode != "" {
modes, _ := xstr.SplitInts(p.Mode)
req.WhereIn("mode", modes)
}
if p.Pool != "" {
pools, _ := xstr.SplitInts(p.Pool)
req.WhereIn("pool", pools)
}
if p.Attrs != "" {
attrs, _ := xstr.SplitInts(p.Attrs)
req.WhereIn("attr_format", attrs)
}
req.WhereEq("type", p.Type)
switch {
case p.ProgressFrom != model.CondIntNil && p.ProgressTo != model.CondIntNil:
req.WhereRange("progress_long", p.ProgressFrom, p.ProgressTo, elastic.RangeScopeLcRc)
case p.ProgressFrom != model.CondIntNil:
req.WhereRange("progress_long", p.ProgressFrom, nil, elastic.RangeScopeLcRc)
case p.ProgressTo != model.CondIntNil:
req.WhereRange("progress_long", nil, p.ProgressTo, elastic.RangeScopeLcRc)
}
req.WhereRange("ctime", p.CtimeFrom, p.CtimeTo, elastic.RangeScopeLcRc)
if p.Keyword != "" {
req.WhereLike([]string{"msg"}, []string{p.Keyword}, true, elastic.LikeLevelHigh)
req.OrderScoreFirst(true)
}
if p.Order == "progress" {
p.Order = "progress_long"
}
req.Order(p.Order, p.Sort)
req.Pn(int(p.Pn)).Ps(int(p.Ps))
res = &model.SearchDMData{}
if err = req.Scan(c, &res); err != nil {
log.Error("search params(%s), error(%v)", req.Params(), err)
}
return
}
// UptSearchDMState update dm search state
func (d *Dao) UptSearchDMState(c context.Context, dmids []int64, oid int64, state, tp int32) (err error) {
upt := d.elastic.NewUpdate("dm_search")
for _, dmid := range dmids {
data := &model.UptSearchDMState{
ID: dmid,
Oid: oid,
State: state,
Type: tp,
Mtime: time.Now().Format("2006-01-02 15:04:05"),
}
upt.AddData(fmt.Sprintf("dm_search_%03d", oid%_indexSharding), data)
}
if err = upt.Do(c); err != nil {
log.Error("update.Do() params(%s) error(%v)", upt.Params(), err)
}
return
}
// UptSearchDMPool update dm search pool
func (d *Dao) UptSearchDMPool(c context.Context, dmids []int64, oid int64, pool, tp int32) (err error) {
upt := d.elastic.NewUpdate("dm_search")
for _, dmid := range dmids {
data := &model.UptSearchDMPool{
ID: dmid,
Oid: oid,
Pool: pool,
Type: tp,
Mtime: time.Now().Format("2006-01-02 15:04:05"),
}
upt.AddData(fmt.Sprintf("dm_search_%03d", oid%_indexSharding), data)
}
if err = upt.Do(c); err != nil {
log.Error("update.Do() params(%s) error(%v)", upt.Params(), err)
}
return
}
// UptSearchDMAttr update dm search attr
func (d *Dao) UptSearchDMAttr(c context.Context, dmids []int64, oid int64, attr, tp int32) (err error) {
var bits []int64
for k, v := range strconv.FormatInt(int64(attr), 2) {
if v == 49 {
bits = append(bits, int64(k+1))
}
}
upt := d.elastic.NewUpdate("dm_search")
for _, dmid := range dmids {
data := &model.UptSearchDMAttr{
ID: dmid,
Oid: oid,
Attr: attr,
AttrFormat: bits,
Type: tp,
Mtime: time.Now().Format("2006-01-02 15:04:05"),
}
upt.AddData(fmt.Sprintf("dm_search_%03d", oid%_indexSharding), data)
}
if err = upt.Do(c); err != nil {
log.Error("update.Do() params(%s) error(%v)", upt.Params(), err)
}
return
}
// SearchSubtitles .
func (d *Dao) SearchSubtitles(c context.Context, page, size int32, mid int64, upMids []int64, aid, oid int64, tp int32, status []int64) (res *model.SearchSubtitleResult, err error) {
var (
req *elastic.Request
fields []string
)
fields = _subtitleFields
req = d.elastic.NewRequest("dm_subtitle").Index("subtitle").Fields(fields...).Pn(int(page)).Ps(int(size))
if mid > 0 {
req.WhereEq("mid", mid)
}
if aid > 0 {
req.WhereEq("aid", aid)
}
if oid > 0 {
req.WhereEq("oid", oid)
req.WhereEq("type", tp)
}
switch {
case len(upMids) > 0 && len(status) > 0:
cmbs := &elastic.Combo{}
cmbu := &elastic.Combo{}
var (
statusInf []interface{}
upMidsInf []interface{}
)
for _, s := range status {
statusInf = append(statusInf, s)
}
for _, s := range upMids {
upMidsInf = append(upMidsInf, s)
}
cmbs.ComboIn([]map[string][]interface{}{
{"status": statusInf},
})
cmbu.ComboIn([]map[string][]interface{}{
{"up_mid": upMidsInf},
})
req = req.WhereCombo(cmbs.MinIn(1).MinAll(1), cmbu.MinIn(1).MinAll(1))
case len(upMids) > 0:
req.WhereIn("up_mid", upMids)
case len(status) > 0:
req.WhereIn("status", status)
}
req.Order("mtime", "desc")
if err = req.Scan(c, &res); err != nil {
log.Error("elastic search(%s) error(%v)", req.Params(), err)
return
}
return
}
// CountSubtitles .
func (d *Dao) CountSubtitles(c context.Context, mid int64, upMids []int64, aid, oid int64, tp int32) (countSubtitle *model.CountSubtitleResult, err error) {
var (
req *elastic.Request
fields []string
res map[string]interface{}
_searchStatus = []string{
fmt.Sprint(model.SubtitleStatusDraft),
fmt.Sprint(model.SubtitleStatusToAudit),
fmt.Sprint(model.SubtitleStatusAuditBack),
fmt.Sprint(model.SubtitleStatusPublish),
fmt.Sprint(model.SubtitleStatusCheckToAudit),
fmt.Sprint(model.SubtitleStatusCheckPublish),
fmt.Sprint(model.SubtitleStatusManagerBack),
}
result map[string]interface{}
groupStatus []interface{}
itemStatus map[string]interface{}
ok bool
)
req = d.elastic.NewRequest("dm_subtitle").Index("subtitle").Fields(fields...).Pn(0).Ps(0)
if mid > 0 {
req.WhereEq("mid", mid)
}
if aid > 0 {
req.WhereEq("aid", aid)
}
if oid > 0 {
req.WhereEq("oid", oid)
req.WhereEq("type", tp)
}
if len(upMids) > 0 {
req.WhereIn("up_mid", upMids)
}
req = req.GroupBy(elastic.EnhancedModeGroupBy, "status", nil).WhereIn("status", _searchStatus)
if err = req.Scan(c, &res); err != nil {
log.Error("elastic search(%s) error(%v)", req.Params(), err)
return
}
countSubtitle = &model.CountSubtitleResult{}
if result, ok = res["result"].(map[string]interface{}); !ok {
return
}
if groupStatus, ok = result["group_by_status"].([]interface{}); !ok {
return
}
for _, item := range groupStatus {
if itemStatus, ok = item.(map[string]interface{}); ok {
docCount, _ := itemStatus["doc_count"].(float64)
switch itemStatus["key"] {
case fmt.Sprint(model.SubtitleStatusDraft):
countSubtitle.Draft += int64(docCount)
case fmt.Sprint(model.SubtitleStatusToAudit):
countSubtitle.ToAudit += int64(docCount)
case fmt.Sprint(model.SubtitleStatusAuditBack):
countSubtitle.AuditBack += int64(docCount)
case fmt.Sprint(model.SubtitleStatusPublish):
countSubtitle.Publish += int64(docCount)
case fmt.Sprint(model.SubtitleStatusCheckToAudit):
countSubtitle.ToAudit += int64(docCount)
case fmt.Sprint(model.SubtitleStatusCheckPublish):
countSubtitle.Publish += int64(docCount)
case fmt.Sprint(model.SubtitleStatusManagerBack):
countSubtitle.AuditBack += int64(docCount)
}
}
}
return
}
// UptSearchRecentState .
func (d *Dao) UptSearchRecentState(c context.Context, dmids []int64, oid int64, state, tp int32) (err error) {
upt := d.elastic.NewUpdate("dm_home")
year, month, _ := time.Now().Date()
yearPre, monthPre, _ := time.Now().AddDate(0, -1, 0).Date()
for _, dmid := range dmids {
data := &model.UptSearchDMState{
ID: dmid,
Oid: oid,
State: state,
Type: tp,
Mtime: time.Now().Format("2006-01-02 15:04:05"),
}
upt.AddData(fmt.Sprintf("dm_home_%v",
fmt.Sprintf("%d_%02d", yearPre, int(monthPre)),
), data)
upt.AddData(fmt.Sprintf("dm_home_%v",
fmt.Sprintf("%d_%02d", year, int(month)),
), data)
}
if err = upt.Do(c); err != nil {
log.Error("update.Do() params(%s) error(%v)", upt.Params(), err)
}
return
}
// UptSearchRecentAttr .
func (d *Dao) UptSearchRecentAttr(c context.Context, dmids []int64, oid int64, attr, tp int32) (err error) {
var bits []int64
for k, v := range strconv.FormatInt(int64(attr), 2) {
if v == 49 {
bits = append(bits, int64(k+1))
}
}
upt := d.elastic.NewUpdate("dm_home")
year, month, _ := time.Now().Date()
yearPre, monthPre, _ := time.Now().AddDate(0, -1, 0).Date()
for _, dmid := range dmids {
data := &model.UptSearchDMAttr{
ID: dmid,
Oid: oid,
Attr: attr,
AttrFormat: bits,
Type: tp,
Mtime: time.Now().Format("2006-01-02 15:04:05"),
}
upt.AddData(fmt.Sprintf("dm_home_%v",
fmt.Sprintf("%d_%02d", yearPre, int(monthPre)),
), data)
upt.AddData(fmt.Sprintf("dm_home_%v",
fmt.Sprintf("%d_%02d", year, int(month)),
), data)
}
if err = upt.Do(c); err != nil {
log.Error("update.Do() params(%s) error(%v)", upt.Params(), err)
}
return
}
// UptSearchRecentPool .
func (d *Dao) UptSearchRecentPool(c context.Context, dmids []int64, oid int64, pool, tp int32) (err error) {
upt := d.elastic.NewUpdate("dm_home")
year, month, _ := time.Now().Date()
yearPre, monthPre, _ := time.Now().AddDate(0, -1, 0).Date()
for _, dmid := range dmids {
data := &model.UptSearchDMPool{
ID: dmid,
Oid: oid,
Pool: pool,
Type: tp,
Mtime: time.Now().Format("2006-01-02 15:04:05"),
}
upt.AddData(fmt.Sprintf("dm_home_%v",
fmt.Sprintf("%d_%02d", yearPre, int(monthPre)),
), data)
upt.AddData(fmt.Sprintf("dm_home_%v",
fmt.Sprintf("%d_%02d", year, int(month)),
), data)
}
if err = upt.Do(c); err != nil {
log.Error("update.Do() params(%s) error(%v)", upt.Params(), err)
}
return
}
// SearhcDmRecent .
func (d *Dao) SearhcDmRecent(c context.Context, param *model.SearchRecentDMParam) (res *model.SearchRecentDMResult, err error) {
var (
req *elastic.Request
)
year, month, _ := time.Now().Date()
yearPre, monthPre, _ := time.Now().AddDate(0, -1, 0).Date()
req = d.elastic.NewRequest("dm_home").Index(fmt.Sprintf("dm_home_%v,dm_home_%v",
fmt.Sprintf("%d_%02d", year, int(month)),
fmt.Sprintf("%d_%02d", yearPre, int(monthPre)),
)).Fields(_dmRecentFields...).Pn(param.Pn).Ps(param.Ps)
if param.Type > 0 {
req.WhereEq("type", param.Type)
}
if param.UpMid > 0 {
req.WhereEq("o_mid", param.UpMid)
}
if len(param.States) > 0 {
req.WhereIn("state", param.States)
}
req.WhereRange("ctime", time.Now().Local().AddDate(0, 0, -30).Format(_dataTimeFormat), time.Now().Local().Format(_dataTimeFormat), elastic.RangeScopeLcRo)
req.Order(param.Field, param.Sort)
res = &model.SearchRecentDMResult{}
if err = req.Scan(c, &res); err != nil {
log.Error("search params(%s), error(%v)", req.Params(), err)
}
return
}