123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- package up
- import (
- "bytes"
- "context"
- "database/sql"
- "fmt"
- "sync"
- "go-common/app/admin/main/mcn/model"
- xsql "go-common/library/database/sql"
- "go-common/library/xstr"
- )
- const (
- // private condition
- _inMcnUpRecommendSQL = `INSERT mcn_up_recommend_pool(up_mid,fans_count,archive_count,play_count_accumulate,play_count_average,active_tid,source) VALUES (?,?,?,?,?,?,2)
- ON DUPLICATE KEY UPDATE fans_count=?, archive_count=?, play_count_accumulate=?, play_count_average=?, active_tid=?, state=1, source=2, fans_count_increase_month=0,
- last_archive_time='1970-01-01 08:00:00', generate_time='1970-01-01 08:00:00'`
- _upMcnUpRecommendOPSQL = "UPDATE mcn_up_recommend_pool SET state = ? WHERE up_mid IN (%s)"
- _mcnUpRecommendsSQL = `SELECT id,up_mid,fans_count,fans_count_increase_month,archive_count,
- play_count_accumulate,play_count_average,active_tid,last_archive_time,state,source,generate_time,ctime,mtime FROM mcn_up_recommend_pool %s`
- _mcnUpRecommendTotalSQL = "SELECT COUNT(1) FROM mcn_up_recommend_pool %s"
- _mcnUpBindMidsSQL = "SELECT up_mid FROM mcn_up WHERE up_mid IN (%s) AND state IN (2,10,11,15)"
- _mcnUpRecommendMidSQL = `SELECT id,up_mid,fans_count,fans_count_increase_month,archive_count,
- play_count_accumulate,play_count_average,active_tid,last_archive_time,state,source,generate_time,ctime,mtime FROM mcn_up_recommend_pool WHERE up_mid = ?`
- _mcnUpRecommendMidsSQL = `SELECT id,up_mid,fans_count,fans_count_increase_month,archive_count,
- play_count_accumulate,play_count_average,active_tid,last_archive_time,state,source,generate_time,ctime,mtime FROM mcn_up_recommend_pool WHERE up_mid IN (%s)`
- // common condition
- _orderByConditionSQL = " %s ORDER BY %s %s LIMIT ?,?"
- _orderByConditionNotLimitSQL = " %s ORDER BY %s %s"
- _orderByNoConditionSQL = " ORDER BY %s %s LIMIT ?,?"
- _orderByNoConditionNotLimitSQL = " ORDER BY %s %s"
- )
- // AddMcnUpRecommend .
- func (d *Dao) AddMcnUpRecommend(c context.Context, arg *model.McnUpRecommendPool) (rows int64, err error) {
- var res sql.Result
- if res, err = d.db.Exec(c, _inMcnUpRecommendSQL, arg.UpMid, arg.FansCount, arg.ArchiveCount, arg.PlayCountAccumulate, arg.PlayCountAverage, arg.ActiveTid,
- arg.FansCount, arg.ArchiveCount, arg.PlayCountAccumulate, arg.PlayCountAverage, arg.ActiveTid); err != nil {
- return rows, err
- }
- return res.RowsAffected()
- }
- // UpMcnUpsRecommendOP .
- func (d *Dao) UpMcnUpsRecommendOP(c context.Context, upMids []int64, state model.MCNUPRecommendState) (rows int64, err error) {
- var res sql.Result
- if res, err = d.db.Exec(c, fmt.Sprintf(_upMcnUpRecommendOPSQL, xstr.JoinInts(upMids)), state); err != nil {
- return rows, err
- }
- return res.RowsAffected()
- }
- // McnUpRecommends .
- func (d *Dao) McnUpRecommends(c context.Context, arg *model.MCNUPRecommendReq) (res []*model.McnUpRecommendPool, err error) {
- sql, values := d.buildUpRecommendSQL("list", arg)
- rows, err := d.db.Query(c, sql, values...)
- if err != nil {
- return
- }
- defer rows.Close()
- for rows.Next() {
- m := &model.McnUpRecommendPool{}
- err = rows.Scan(&m.ID, &m.UpMid, &m.FansCount, &m.FansCountIncreaseMonth, &m.ArchiveCount, &m.PlayCountAccumulate, &m.PlayCountAverage,
- &m.ActiveTid, &m.LastArchiveTime, &m.State, &m.Source, &m.GenerateTime, &m.Ctime, &m.Mtime)
- if err != nil {
- if err == xsql.ErrNoRows {
- err = nil
- }
- res = nil
- return
- }
- res = append(res, m)
- }
- return
- }
- // McnUpRecommendTotal .
- func (d *Dao) McnUpRecommendTotal(c context.Context, arg *model.MCNUPRecommendReq) (count int, err error) {
- sql, values := d.buildUpRecommendSQL("count", arg)
- row := d.db.QueryRow(c, sql, values...)
- if err = row.Scan(&count); err != nil {
- if err == xsql.ErrNoRows {
- err = nil
- return
- }
- }
- return
- }
- // McnUpBindMids .
- func (d *Dao) McnUpBindMids(c context.Context, mids []int64) (bmids []int64, err error) {
- rows, err := d.db.Query(c, fmt.Sprintf(_mcnUpBindMidsSQL, xstr.JoinInts(mids)))
- if err != nil {
- return
- }
- defer rows.Close()
- for rows.Next() {
- var upMids int64
- err = rows.Scan(&upMids)
- if err != nil {
- if err == xsql.ErrNoRows {
- err = nil
- }
- return
- }
- bmids = append(bmids, upMids)
- }
- return
- }
- // McnUpRecommendMid .
- func (d *Dao) McnUpRecommendMid(c context.Context, mid int64) (m *model.McnUpRecommendPool, err error) {
- row := d.db.QueryRow(c, _mcnUpRecommendMidSQL, mid)
- m = &model.McnUpRecommendPool{}
- err = row.Scan(&m.ID, &m.UpMid, &m.FansCount, &m.FansCountIncreaseMonth, &m.ArchiveCount, &m.PlayCountAccumulate, &m.PlayCountAverage,
- &m.ActiveTid, &m.LastArchiveTime, &m.State, &m.Source, &m.GenerateTime, &m.Ctime, &m.Mtime)
- if err != nil {
- if err == xsql.ErrNoRows {
- err = nil
- }
- m = nil
- return
- }
- return
- }
- // McnUpRecommendMids .
- func (d *Dao) McnUpRecommendMids(c context.Context, mids []int64) (mrp map[int64]*model.McnUpRecommendPool, err error) {
- rows, err := d.db.Query(c, fmt.Sprintf(_mcnUpRecommendMidsSQL, xstr.JoinInts(mids)))
- if err != nil {
- return
- }
- defer rows.Close()
- mrp = make(map[int64]*model.McnUpRecommendPool, len(mids))
- for rows.Next() {
- m := &model.McnUpRecommendPool{}
- err = rows.Scan(&m.ID, &m.UpMid, &m.FansCount, &m.FansCountIncreaseMonth, &m.ArchiveCount, &m.PlayCountAccumulate, &m.PlayCountAverage,
- &m.ActiveTid, &m.LastArchiveTime, &m.State, &m.Source, &m.GenerateTime, &m.Ctime, &m.Mtime)
- if err != nil {
- if err == xsql.ErrNoRows {
- err = nil
- }
- mrp = nil
- return
- }
- mrp[m.UpMid] = m
- }
- return
- }
- // buildUpRecommendSQL build a up recommend sql string.
- func (d *Dao) buildUpRecommendSQL(tp string, arg *model.MCNUPRecommendReq) (sql string, values []interface{}) {
- values = make([]interface{}, 0, 11)
- var (
- cond []string
- condStr string
- )
- if arg.TID != 0 {
- cond = append(cond, "active_tid = ?")
- values = append(values, arg.TID)
- }
- if arg.UpMid != 0 {
- cond = append(cond, "up_mid = ?")
- values = append(values, arg.UpMid)
- }
- if arg.FansMin != 0 {
- cond = append(cond, "fans_count >= ?")
- values = append(values, arg.FansMin)
- }
- if arg.FansMax != 0 {
- cond = append(cond, "fans_count <= ?")
- values = append(values, arg.FansMax)
- }
- if arg.PlayMin != 0 {
- cond = append(cond, "play_count_accumulate >= ?")
- values = append(values, arg.PlayMin)
- }
- if arg.PlayMax != 0 {
- cond = append(cond, "play_count_accumulate <= ?")
- values = append(values, arg.PlayMax)
- }
- if arg.PlayAverageMin != 0 {
- cond = append(cond, "play_count_average >= ?")
- values = append(values, arg.PlayAverageMin)
- }
- if arg.PlayAverageMax != 0 {
- cond = append(cond, "play_count_average <= ?")
- values = append(values, arg.PlayAverageMax)
- }
- if arg.State != model.MCNUPRecommendStateUnKnown {
- cond = append(cond, "state = ?")
- values = append(values, arg.State)
- } else {
- cond = append(cond, "state IN (1,2,3)")
- }
- if arg.Source != model.MCNUPRecommendSourceUnKnown {
- cond = append(cond, "source = ?")
- values = append(values, arg.Source)
- }
- condStr = d.joinStringSQL(cond)
- switch tp {
- case "count":
- if condStr != "" {
- sql = fmt.Sprintf(_mcnUpRecommendTotalSQL+" %s", "WHERE", condStr)
- return
- }
- sql = fmt.Sprintf(_mcnUpRecommendTotalSQL, condStr)
- case "list":
- // 导出
- if arg.Export == model.ResponeModelCSV {
- if condStr != "" {
- sql = fmt.Sprintf(_mcnUpRecommendsSQL+_orderByConditionNotLimitSQL, "WHERE", condStr, arg.Order, arg.Sort)
- return
- }
- sql = fmt.Sprintf(_mcnUpRecommendsSQL+_orderByNoConditionNotLimitSQL, condStr, arg.Order, arg.Sort)
- return
- }
- // 非导出
- if condStr != "" {
- sql = fmt.Sprintf(_mcnUpRecommendsSQL+_orderByConditionSQL, "WHERE", condStr, arg.Order, arg.Sort)
- } else {
- sql = fmt.Sprintf(_mcnUpRecommendsSQL+_orderByNoConditionSQL, condStr, arg.Order, arg.Sort)
- }
- limit, offset := arg.PageArg.CheckPageValidation()
- values = append(values, offset, limit)
- }
- return
- }
- func (d *Dao) joinStringSQL(is []string) string {
- if len(is) == 0 {
- return ""
- }
- if len(is) == 1 {
- return is[0]
- }
- var bfPool = sync.Pool{
- New: func() interface{} {
- return bytes.NewBuffer([]byte{})
- },
- }
- buf := bfPool.Get().(*bytes.Buffer)
- for _, i := range is {
- buf.WriteString(i)
- buf.WriteString(" AND ")
- }
- if buf.Len() > 0 {
- buf.Truncate(buf.Len() - 4)
- }
- s := buf.String()
- buf.Reset()
- bfPool.Put(buf)
- return s
- }
|