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.
121 lines
3.1 KiB
121 lines
3.1 KiB
package dao |
|
|
|
import ( |
|
"bytes" |
|
"context" |
|
"crypto/md5" |
|
"encoding/hex" |
|
"strconv" |
|
"time" |
|
|
|
"go-common/app/interface/main/space/model" |
|
"go-common/library/log" |
|
|
|
"github.com/tsuna/gohbase/hrpc" |
|
) |
|
|
|
const ( |
|
_hBaseArticleTable = "read_auth_stats_daily" |
|
_hBaseUpStatTablePrefix = "up_stats_" |
|
) |
|
|
|
func hbaseMd5Key(mid int64) string { |
|
hasher := md5.New() |
|
hasher.Write([]byte(strconv.Itoa(int(mid)))) |
|
return hex.EncodeToString(hasher.Sum(nil)) |
|
} |
|
|
|
// UpArcStat get up archive stat. |
|
func (d *Dao) UpArcStat(c context.Context, mid int64, date string) (stat *model.UpArcStat, err error) { |
|
var ( |
|
result *hrpc.Result |
|
ctx, cancel = context.WithTimeout(c, time.Duration(d.c.HBase.ReadTimeout)) |
|
key = hbaseMd5Key(mid) |
|
tableName = _hBaseUpStatTablePrefix + date // change table at 12:00am |
|
) |
|
defer cancel() |
|
if result, err = d.hbase.GetStr(ctx, tableName, key); err != nil { |
|
log.Error("UpArcStat d.hbase.GetStr tableName(%s)|mid(%d)|key(%v)|error(%v)", tableName, mid, key, err) |
|
return |
|
} |
|
if result == nil { |
|
return |
|
} |
|
stat = &model.UpArcStat{} |
|
for _, c := range result.Cells { |
|
if c == nil { |
|
continue |
|
} |
|
v, _ := strconv.ParseInt(string(c.Value[:]), 10, 64) |
|
if !bytes.Equal(c.Family, []byte("u")) { |
|
continue |
|
} |
|
switch { |
|
case bytes.Equal(c.Qualifier, []byte("play")): |
|
stat.View = v |
|
case bytes.Equal(c.Qualifier, []byte("dm")): |
|
stat.Dm = v |
|
case bytes.Equal(c.Qualifier, []byte("reply")): |
|
stat.Reply = v |
|
case bytes.Equal(c.Qualifier, []byte("fans")): |
|
stat.Fans = v |
|
} |
|
} |
|
return |
|
} |
|
|
|
// UpArtStat get up article stat. |
|
func (d *Dao) UpArtStat(c context.Context, mid int64) (stat *model.UpArtStat, err error) { |
|
var ( |
|
result *hrpc.Result |
|
ctx, cancel = context.WithTimeout(c, time.Duration(d.c.HBase.ReadTimeout)) |
|
key = hbaseMd5Key(mid) |
|
tableName = _hBaseArticleTable |
|
) |
|
defer cancel() |
|
if result, err = d.hbase.GetStr(ctx, tableName, key); err != nil { |
|
log.Error("UpArtStat d.hbase.GetStr tableName(%s)|mid(%d)|key(%v)|error(%v)", tableName, mid, key, err) |
|
return |
|
} |
|
if result == nil { |
|
return |
|
} |
|
stat = &model.UpArtStat{} |
|
for _, c := range result.Cells { |
|
if c == nil { |
|
continue |
|
} |
|
v, _ := strconv.ParseInt(string(c.Value[:]), 10, 64) |
|
if !bytes.Equal(c.Family, []byte("r")) { |
|
continue |
|
} |
|
switch { |
|
case bytes.Equal(c.Qualifier, []byte("view1")): |
|
stat.View = v |
|
case bytes.Equal(c.Qualifier, []byte("reply1")): |
|
stat.Reply = v |
|
case bytes.Equal(c.Qualifier, []byte("coin1")): |
|
stat.Coin = v |
|
case bytes.Equal(c.Qualifier, []byte("like1")): |
|
stat.Like = v |
|
case bytes.Equal(c.Qualifier, []byte("fav1")): |
|
stat.Fav = v |
|
case bytes.Equal(c.Qualifier, []byte("view0")): |
|
stat.PreView = v |
|
case bytes.Equal(c.Qualifier, []byte("reply0")): |
|
stat.PreReply = v |
|
case bytes.Equal(c.Qualifier, []byte("coin0")): |
|
stat.PreCoin = v |
|
case bytes.Equal(c.Qualifier, []byte("like0")): |
|
stat.PreLike = v |
|
case bytes.Equal(c.Qualifier, []byte("fav0")): |
|
stat.PreFav = v |
|
} |
|
} |
|
stat.IncrView = stat.View - stat.PreView |
|
stat.IncrReply = stat.Reply - stat.PreReply |
|
stat.IncrCoin = stat.Coin - stat.PreCoin |
|
stat.IncrLike = stat.Like - stat.PreLike |
|
stat.IncrFav = stat.Fav - stat.PreFav |
|
return |
|
}
|
|
|