go-common/app/interface/main/creative/dao/data/article.go
2019-04-22 18:49:16 +08:00

173 lines
4.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}