173 lines
4.8 KiB
Go
173 lines
4.8 KiB
Go
|
package data
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"strconv"
|
|||
|
"time"
|
|||
|
|
|||
|
"go-common/app/interface/main/creative/model/data"
|
|||
|
"go-common/library/ecode"
|
|||
|
"go-common/library/log"
|
|||
|
|
|||
|
"github.com/tsuna/gohbase/hrpc"
|
|||
|
)
|
|||
|
|
|||
|
var (
|
|||
|
trendTBLNameMap = map[byte]string{
|
|||
|
data.ArtView: ArtViewTBL,
|
|||
|
data.ArtReply: ArtReplyTBL,
|
|||
|
data.ArtShare: ArtShareTBL,
|
|||
|
data.ArtCoin: ArtCoinTBL,
|
|||
|
data.ArtFavTBL: ArtFavTBL,
|
|||
|
data.ArtLikeTBL: ArtLikeTBL,
|
|||
|
}
|
|||
|
|
|||
|
rankTBLNameMap = map[byte]string{
|
|||
|
data.ArtView: ArtViewIncTBL,
|
|||
|
data.ArtReply: ArtReplyIncTBL,
|
|||
|
data.ArtShare: ArtShareIncTBL,
|
|||
|
data.ArtCoin: ArtCoinIncTBL,
|
|||
|
data.ArtFavTBL: ArtFavIncTBL,
|
|||
|
data.ArtLikeTBL: ArtLikeIncTBL,
|
|||
|
}
|
|||
|
)
|
|||
|
|
|||
|
// ArtThirtyDay for article trend 30 days.
|
|||
|
func (d *Dao) ArtThirtyDay(c context.Context, mid int64, ty byte) (res []*data.ArtTrend, err error) {
|
|||
|
var (
|
|||
|
result *hrpc.Result
|
|||
|
ctx, cancel = context.WithTimeout(c, time.Duration(d.c.HBase.ReadTimeout))
|
|||
|
key = hbaseMd5Key(mid)
|
|||
|
)
|
|||
|
defer cancel()
|
|||
|
|
|||
|
tableName, ok := trendTBLNameMap[ty]
|
|||
|
if !ok {
|
|||
|
log.Error("ArtThirtyDay not exist type(%d)|mid(%d)", ty, mid)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
log.Info("ArtThirtyDay mid(%d)|tableName(%s)|family(u)|rowkey(%s)", mid, tableName, key)
|
|||
|
if result, err = d.hbase.GetStr(ctx, tableName, key); err != nil {
|
|||
|
log.Error("ArtThirtyDay d.hbase.GetStr tableName(%s)|mid(%d)|key(%v)|error(%v)", tableName, mid, key, err)
|
|||
|
err = ecode.CreativeDataErr
|
|||
|
return
|
|||
|
}
|
|||
|
if result == nil || len(result.Cells) == 0 {
|
|||
|
log.Warn("ArtThirtyDay no data tableName(%s)|mid(%d)|key(%v)", tableName, mid, key)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
res = make([]*data.ArtTrend, 0, len(result.Cells))
|
|||
|
for _, c := range result.Cells {
|
|||
|
if c == nil {
|
|||
|
continue
|
|||
|
}
|
|||
|
qual := string(c.Qualifier[:])
|
|||
|
val := string(c.Value[:])
|
|||
|
if string(c.Family) == "u" {
|
|||
|
t, v, err := parseKeyValue(qual, val)
|
|||
|
if err != nil {
|
|||
|
break
|
|||
|
}
|
|||
|
td := &data.ArtTrend{}
|
|||
|
td.DateKey = t
|
|||
|
td.TotalIncr = v
|
|||
|
res = append(res, td)
|
|||
|
}
|
|||
|
}
|
|||
|
log.Info("ArtThirtyDay mid(%d)|tableName(%s)|family(u)|rowkey(%s)|res(%+v)", mid, tableName, key, res)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// ArtRank for article rank
|
|||
|
func (d *Dao) ArtRank(c context.Context, mid int64, ty byte, date string) (res *data.ArtRankMap, err error) {
|
|||
|
var (
|
|||
|
result *hrpc.Result
|
|||
|
ctx, cancel = context.WithTimeout(c, time.Duration(d.c.HBase.ReadTimeout))
|
|||
|
key = hbaseMd5Key(mid)
|
|||
|
)
|
|||
|
defer cancel()
|
|||
|
|
|||
|
tableName, ok := rankTBLNameMap[ty]
|
|||
|
if !ok {
|
|||
|
log.Error("ArtRank not exist type(%d)|mid(%d)", ty, mid)
|
|||
|
return
|
|||
|
}
|
|||
|
tableName += date
|
|||
|
|
|||
|
log.Info("ArtRank mid(%d)|tableName(%s)|family(rd,v)|rowkey(%s)", mid, tableName, key)
|
|||
|
if result, err = d.hbase.GetStr(ctx, tableName, key); err != nil {
|
|||
|
log.Error("ArtRank d.hbase.GetStr tableName(%s)|mid(%d)|key(%v)|error(%v)", tableName, mid, key, err)
|
|||
|
err = ecode.CreativeDataErr
|
|||
|
return
|
|||
|
}
|
|||
|
if result == nil || len(result.Cells) == 0 {
|
|||
|
log.Warn("ArtRank no data tableName(%s)|mid(%d)|key(%v)", tableName, mid, key)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
aids := make(map[int]int64)
|
|||
|
incrs := make(map[int]int)
|
|||
|
for _, c := range result.Cells {
|
|||
|
if c == nil {
|
|||
|
continue
|
|||
|
}
|
|||
|
if string(c.Family) == "rd" {
|
|||
|
k, _ := strconv.Atoi(string(c.Qualifier[:]))
|
|||
|
v, _ := strconv.ParseInt(string(c.Value[:]), 10, 64)
|
|||
|
aids[k] = v
|
|||
|
} else if string(c.Family) == "v" {
|
|||
|
k, _ := strconv.Atoi(string(c.Qualifier[:]))
|
|||
|
v, _ := strconv.Atoi(string(c.Value[:]))
|
|||
|
incrs[k] = v
|
|||
|
}
|
|||
|
}
|
|||
|
res = &data.ArtRankMap{}
|
|||
|
res.AIDs = aids
|
|||
|
res.Incrs = incrs
|
|||
|
log.Info("ArtRank mid(%d)|tableName(%s)|family(rd,v)|rowkey(%s)|res(%+v)", mid, tableName, key, res)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// 专栏阅读来源分析 rowkey mid倒置补(10位)+ yyyyMMdd
|
|||
|
func readSourceKey(id int64) string {
|
|||
|
idStr := strconv.FormatInt(id, 10)
|
|||
|
s := reverseString(idStr)
|
|||
|
s = s + time.Now().AddDate(0, 0, -1).Add(-12*time.Hour).Format("20060102")
|
|||
|
return s
|
|||
|
}
|
|||
|
|
|||
|
// ReadAnalysis for article read source.
|
|||
|
func (d *Dao) ReadAnalysis(c context.Context, mid int64) (res *data.ArtRead, err error) {
|
|||
|
var (
|
|||
|
result *hrpc.Result
|
|||
|
ctx, cancel = context.WithTimeout(c, time.Duration(d.c.HBase.ReadTimeout))
|
|||
|
tableName = ArtReadAnalysisTBL
|
|||
|
key = readSourceKey(mid)
|
|||
|
)
|
|||
|
defer cancel()
|
|||
|
|
|||
|
log.Info("ReadAnalysis mid(%d)|tableName(%s)|family(f)|rowkey(%s)", mid, tableName, key)
|
|||
|
if result, err = d.hbase.GetStr(ctx, tableName, key); err != nil {
|
|||
|
log.Error("ReadAnalysis d.hbase.GetStr tableName(%s)|mid(%d)|key(%v)|error(%v)", tableName, mid, key, err)
|
|||
|
err = ecode.CreativeDataErr
|
|||
|
return
|
|||
|
}
|
|||
|
if result == nil || len(result.Cells) == 0 {
|
|||
|
log.Warn("ReadAnalysis no data tableName(%s)|mid(%d)|key(%v)", tableName, mid, key)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
var cells data.ArtRead
|
|||
|
err = parser.Parse(result.Cells, &cells)
|
|||
|
if err != nil {
|
|||
|
log.Error("ReadAnalysis parser.Parse tableName(%s)|mid(%d)|rowkey(%+v)|error(%v)", tableName, mid, key, err)
|
|||
|
err = ecode.CreativeDataErr
|
|||
|
return
|
|||
|
}
|
|||
|
res = &cells
|
|||
|
log.Info("ReadAnalysis mid(%d)|tableName(%s)|family(f)|rowkey(%s)|res(%+v)", mid, tableName, key, res)
|
|||
|
return
|
|||
|
}
|