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
|
||
}
|