You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
4.8 KiB
172 lines
4.8 KiB
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 |
|
}
|
|
|