128 lines
2.9 KiB
Go
128 lines
2.9 KiB
Go
|
package service
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"strconv"
|
||
|
"time"
|
||
|
|
||
|
"go-common/app/job/main/up-rating/model"
|
||
|
)
|
||
|
|
||
|
// DelRatings del ratings
|
||
|
func (s *Service) DelRatings(c context.Context, date time.Time) (err error) {
|
||
|
for {
|
||
|
var rows int64
|
||
|
rows, err = s.dao.DelRatings(c, date, _limit)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
if rows == 0 {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
return s.DelPastRecord(c, date)
|
||
|
}
|
||
|
|
||
|
// RatingFast close chan when part finished
|
||
|
func (s *Service) RatingFast(c context.Context, date time.Time, start, end int, ch chan []*model.Rating) (err error) {
|
||
|
defer close(ch)
|
||
|
return s.Ratings(c, date, start, end, ch)
|
||
|
}
|
||
|
|
||
|
// Ratings chan <- ratings, close chan outside
|
||
|
func (s *Service) Ratings(c context.Context, date time.Time, start, end int, ch chan []*model.Rating) (err error) {
|
||
|
for {
|
||
|
var rs []*model.Rating
|
||
|
rs, start, err = s.dao.GetRatingsFast(c, date, start, end, _limit)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
if len(rs) == 0 {
|
||
|
break
|
||
|
}
|
||
|
ch <- rs
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// RatingInfos rating infos
|
||
|
func (s *Service) RatingInfos(c context.Context, date time.Time, ch chan []*model.Rating) (err error) {
|
||
|
defer close(ch)
|
||
|
var id int
|
||
|
for {
|
||
|
var rs []*model.Rating
|
||
|
rs, id, err = s.dao.GetRatings(c, date, id, _limit)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
ch <- rs
|
||
|
if len(rs) == 0 {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// BatchInsertRatingStat batch insert rating stat
|
||
|
func (s *Service) BatchInsertRatingStat(c context.Context, wch chan []*model.Rating, date time.Time) (err error) {
|
||
|
var (
|
||
|
buff = make([]*model.Rating, _limit)
|
||
|
buffEnd = 0
|
||
|
)
|
||
|
dateStr := date.Format(_layout)
|
||
|
for rs := range wch {
|
||
|
for _, r := range rs {
|
||
|
buff[buffEnd] = r
|
||
|
buffEnd++
|
||
|
if buffEnd >= _limit {
|
||
|
values := ratingStatValues(buff[:buffEnd], dateStr)
|
||
|
buffEnd = 0
|
||
|
_, err = s.dao.InsertRatingStat(c, date.Month(), values)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if buffEnd > 0 {
|
||
|
values := ratingStatValues(buff[:buffEnd], dateStr)
|
||
|
buffEnd = 0
|
||
|
_, err = s.dao.InsertRatingStat(c, date.Month(), values)
|
||
|
}
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func ratingStatValues(rs []*model.Rating, date string) (values string) {
|
||
|
var buf bytes.Buffer
|
||
|
for _, r := range rs {
|
||
|
buf.WriteString("(")
|
||
|
buf.WriteString(strconv.FormatInt(r.MID, 10))
|
||
|
buf.WriteByte(',')
|
||
|
buf.WriteString(strconv.FormatInt(r.TagID, 10))
|
||
|
buf.WriteByte(',')
|
||
|
buf.WriteString(fmt.Sprintf("'%s'", date))
|
||
|
buf.WriteByte(',')
|
||
|
buf.WriteString(strconv.FormatInt(r.CreativityScore, 10))
|
||
|
buf.WriteByte(',')
|
||
|
buf.WriteString(strconv.FormatInt(r.InfluenceScore, 10))
|
||
|
buf.WriteByte(',')
|
||
|
buf.WriteString(strconv.FormatInt(r.CreditScore, 10))
|
||
|
buf.WriteByte(',')
|
||
|
buf.WriteString(strconv.FormatInt(r.MetaCreativityScore, 10))
|
||
|
buf.WriteByte(',')
|
||
|
buf.WriteString(strconv.FormatInt(r.MetaInfluenceScore, 10))
|
||
|
buf.WriteByte(',')
|
||
|
buf.WriteString(strconv.FormatInt(r.MagneticScore, 10))
|
||
|
buf.WriteString(")")
|
||
|
buf.WriteByte(',')
|
||
|
}
|
||
|
if buf.Len() > 0 {
|
||
|
buf.Truncate(buf.Len() - 1)
|
||
|
}
|
||
|
values = buf.String()
|
||
|
buf.Reset()
|
||
|
return
|
||
|
}
|