user_stat.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package dao
  2. import (
  3. "context"
  4. xsql "database/sql"
  5. "fmt"
  6. "go-common/app/service/bbq/user/api"
  7. "go-common/library/database/sql"
  8. "go-common/library/log"
  9. "go-common/library/xstr"
  10. )
  11. const (
  12. _batchUserStatistics = "select `mid`,`av_total` - `unshelf_av_total`,`follow_total`,`fan_total`,`like_total`,`rev_like_total`,`black_total`,`play_total` from user_statistics where mid in (%s)"
  13. _incrUserStatisticsFollow = "update user_statistics set `follow_total` = `follow_total` + 1 where `mid` = ?"
  14. _incrUserStatisticsFan = "update user_statistics set `fan_total` = `fan_total` + 1 where `mid` = ?"
  15. _decrUserStatisticsFollow = "update user_statistics set `follow_total` = `follow_total` - 1 where `mid` = ? and `follow_total` > 0"
  16. _decrUserStatisticsFan = "update user_statistics set `fan_total` = `fan_total` - 1 where `mid` = ? and `fan_total` > 0"
  17. _incrUserStatisticField = "insert into user_statistics (`mid`, `%s`) values (?, 1) on duplicate key update `%s` = `%s` + 1"
  18. _decrUserStatisticsField = "update user_statistics set `%s` = `%s` - 1 where `mid` = ? and `%s` > 0"
  19. _updateUserVideoView = "update `user_statistics` set `play_total` = ? where `mid` = ?;"
  20. )
  21. // RawBatchUserStatistics 从数据库获取用户基础信息
  22. func (d *Dao) RawBatchUserStatistics(c context.Context, mids []int64) (res map[int64]*api.UserStat, err error) {
  23. if len(mids) == 0 {
  24. return
  25. }
  26. res = make(map[int64]*api.UserStat)
  27. midStr := xstr.JoinInts(mids)
  28. querySQL := fmt.Sprintf(_batchUserStatistics, midStr)
  29. rows, err := d.db.Query(c, querySQL)
  30. if err != nil {
  31. log.Errorv(c, log.KV("event", "mysql_query"), log.KV("error", err), log.KV("sql", querySQL))
  32. return
  33. }
  34. defer rows.Close()
  35. for rows.Next() {
  36. var mid int64
  37. stat := new(api.UserStat)
  38. if err = rows.Scan(&mid, &stat.Sv, &stat.Follow, &stat.Fan, &stat.Like, &stat.Liked, &stat.Black, &stat.View); err != nil {
  39. log.Errorv(c, log.KV("event", "mysql_scan"), log.KV("error", err), log.KV("sql", querySQL))
  40. return
  41. }
  42. res[mid] = stat
  43. }
  44. log.Infov(c, log.KV("event", "mysql_query"), log.KV("row_num", len(res)), log.KV("sql", querySQL))
  45. return
  46. }
  47. //TxIncrUserStatisticsFollow .
  48. func (d *Dao) TxIncrUserStatisticsFollow(tx *sql.Tx, mid int64) (num int64, err error) {
  49. var res xsql.Result
  50. if res, err = tx.Exec(_incrUserStatisticsFollow, mid); err != nil {
  51. log.Error("incr user Video follow err(%v)", err)
  52. return
  53. }
  54. return res.RowsAffected()
  55. }
  56. //TxIncrUserStatisticsFan .
  57. func (d *Dao) TxIncrUserStatisticsFan(tx *sql.Tx, mid int64) (num int64, err error) {
  58. var res xsql.Result
  59. if res, err = tx.Exec(_incrUserStatisticsFan, mid); err != nil {
  60. log.Error("incr user Video fan err(%v)", err)
  61. return
  62. }
  63. return res.RowsAffected()
  64. }
  65. //TxDecrUserStatisticsFollow .
  66. func (d *Dao) TxDecrUserStatisticsFollow(tx *sql.Tx, mid int64) (num int64, err error) {
  67. var res xsql.Result
  68. if res, err = tx.Exec(_decrUserStatisticsFollow, mid); err != nil {
  69. log.Error("decr user Video follow err(%v)", err)
  70. return
  71. }
  72. return res.RowsAffected()
  73. }
  74. //TxDecrUserStatisticsFan .
  75. func (d *Dao) TxDecrUserStatisticsFan(tx *sql.Tx, mid int64) (num int64, err error) {
  76. var res xsql.Result
  77. if res, err = tx.Exec(_decrUserStatisticsFan, mid); err != nil {
  78. log.Error("decr user Video fan err(%v)", err)
  79. return
  80. }
  81. return res.RowsAffected()
  82. }
  83. //TxIncrUserStatisticsField .
  84. func (d *Dao) TxIncrUserStatisticsField(c context.Context, tx *sql.Tx, mid int64, field string) (rowsAffected int64, err error) {
  85. var res xsql.Result
  86. querySQL := fmt.Sprintf(_incrUserStatisticField, field, field, field)
  87. if res, err = tx.Exec(querySQL, mid); err != nil {
  88. log.Errorv(c, log.KV("event", "incr_user_statistic"), log.KV("field", field), log.KV("mid", mid), log.KV("err", err))
  89. return
  90. }
  91. return res.RowsAffected()
  92. }
  93. //TxDescUserStatisticsField .
  94. func (d *Dao) TxDescUserStatisticsField(c context.Context, tx *sql.Tx, mid int64, field string) (rowsAffected int64, err error) {
  95. var res xsql.Result
  96. querySQL := fmt.Sprintf(_decrUserStatisticsField, field, field, field)
  97. if res, err = tx.Exec(querySQL, mid); err != nil {
  98. log.Errorv(c, log.KV("event", "incr_user_statistic"), log.KV("field", field), log.KV("mid", mid), log.KV("err", err))
  99. return
  100. }
  101. return res.RowsAffected()
  102. }
  103. // UpdateUserVideoView .
  104. func (d *Dao) UpdateUserVideoView(c context.Context, mid int64, views int64) error {
  105. _, err := d.db.Exec(c, _updateUserVideoView, views, mid)
  106. return err
  107. }