go-common/app/interface/main/creative/dao/data/article.go

173 lines
4.8 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
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
}