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.
191 lines
6.0 KiB
191 lines
6.0 KiB
package dao |
|
|
|
import ( |
|
"context" |
|
"database/sql" |
|
"fmt" |
|
|
|
"go-common/app/service/main/rank/model" |
|
"go-common/library/log" |
|
xtime "go-common/library/time" |
|
"go-common/library/xstr" |
|
) |
|
|
|
const ( |
|
_maxArchiveIDSQL = `SELECT MAX(id) FROM archive` |
|
_archiveMetasSQL = `SELECT id,typeid,pubtime FROM archive WHERE id>? ORDER BY id LIMIT ?` |
|
_archiveMetasMtimeSQL = `SELECT id,typeid,pubtime FROM archive WHERE id>? AND mtime BETWEEN ? AND ? ORDER BY mtime,id LIMIT ?` |
|
_archiveTypesSQL = `SELECT id,pid FROM archive_type WHERE id in (%s)` |
|
_archiveStatsSQL = `SELECT aid,click FROM archive_stat_%s WHERE aid in (%s)` |
|
_archiveStatsMtimeSQL = `SELECT id,aid,click FROM archive_stat_%s WHERE id > ? AND mtime BETWEEN ? AND ? ORDER BY mtime,id LIMIT ?` |
|
_archiveTVsSQL = `SELECT aid,result,deleted,valid FROM ugc_archive WHERE aid in (%s)` |
|
_archiveTVsMtimeSQL = `SELECT id,aid,result,deleted,valid FROM ugc_archive WHERE id > ? AND mtime BETWEEN ? AND ? ORDER BY mtime,id LIMIT ?` |
|
|
|
_archiveStatSharding = 100 |
|
) |
|
|
|
// MaxOid . |
|
func (d *Dao) MaxOid(c context.Context) (oid int64, err error) { |
|
row := d.dbArchive.QueryRow(c, _maxArchiveIDSQL) |
|
if err = row.Scan(&oid); err != nil { |
|
if err == sql.ErrNoRows { |
|
err = nil |
|
} else { |
|
log.Error("row.Scan error(%v)", err) |
|
} |
|
} |
|
return |
|
} |
|
|
|
// ArchiveMetas . |
|
func (d *Dao) ArchiveMetas(c context.Context, id int64, limit int) ([]*model.ArchiveMeta, error) { |
|
rows, err := d.dbArchive.Query(c, _archiveMetasSQL, id, limit) |
|
if err != nil { |
|
log.Error("d.dbArchive.Query(%s,%d,%d) error()", _archiveMetasSQL, id, limit, err) |
|
return nil, err |
|
} |
|
defer rows.Close() |
|
as := make([]*model.ArchiveMeta, 0) |
|
for rows.Next() { |
|
a := new(model.ArchiveMeta) |
|
if err = rows.Scan(&a.ID, &a.Typeid, &a.Pubtime); err != nil { |
|
log.Error("rows.Scan() error(%v)", err) |
|
return nil, err |
|
} |
|
as = append(as, a) |
|
} |
|
return as, rows.Err() |
|
} |
|
|
|
// ArchiveMetasIncrs . |
|
func (d *Dao) ArchiveMetasIncrs(c context.Context, aid int64, begin, end xtime.Time, limit int) ([]*model.ArchiveMeta, error) { |
|
rows, err := d.dbArchive.Query(c, _archiveMetasMtimeSQL, aid, begin, end, limit) |
|
if err != nil { |
|
log.Error("d.dbArchive.Query(%s,%d,%s,%s,%d) error()", _archiveMetasMtimeSQL, aid, begin, end, limit, err) |
|
return nil, err |
|
} |
|
defer rows.Close() |
|
as := make([]*model.ArchiveMeta, 0) |
|
for rows.Next() { |
|
a := new(model.ArchiveMeta) |
|
if err = rows.Scan(&a.ID, &a.Typeid, &a.Pubtime); err != nil { |
|
log.Error("rows.Scan() error(%v)", err) |
|
return nil, err |
|
} |
|
as = append(as, a) |
|
} |
|
return as, rows.Err() |
|
} |
|
|
|
// ArchiveTypes . |
|
func (d *Dao) ArchiveTypes(c context.Context, ids []int64) (map[int64]*model.ArchiveType, error) { |
|
idsStr := xstr.JoinInts(ids) |
|
rows, err := d.dbArchive.Query(c, fmt.Sprintf(_archiveTypesSQL, idsStr)) |
|
if err != nil { |
|
log.Error("d.dbArchive.Query(%s) error(%v)", fmt.Sprintf(_archiveTypesSQL, idsStr), err) |
|
return nil, err |
|
} |
|
defer rows.Close() |
|
as := make(map[int64]*model.ArchiveType) |
|
for rows.Next() { |
|
a := new(model.ArchiveType) |
|
if err = rows.Scan(&a.ID, &a.Pid); err != nil { |
|
log.Error("rows.Scan() error(%v)", err) |
|
return nil, err |
|
} |
|
as[a.ID] = a |
|
} |
|
return as, rows.Err() |
|
} |
|
|
|
// ArchiveStats . |
|
func (d *Dao) ArchiveStats(c context.Context, aids []int64) (map[int64]*model.ArchiveStat, error) { |
|
tableMap := make(map[int64][]int64) |
|
for _, aid := range aids { |
|
mod := aid % _archiveStatSharding |
|
tableMap[mod] = append(tableMap[mod], aid) |
|
} |
|
as := make(map[int64]*model.ArchiveStat) |
|
for tbl, aids := range tableMap { |
|
aidsStr := xstr.JoinInts(aids) |
|
rows, err := d.dbStat.Query(c, fmt.Sprintf(_archiveStatsSQL, fmt.Sprintf("%02d", tbl), aidsStr)) |
|
if err != nil { |
|
log.Error("d.dbStat.Query(%s) error(%v)", fmt.Sprintf(_archiveStatsSQL, fmt.Sprintf("%02d", tbl), aidsStr), err) |
|
return nil, err |
|
} |
|
defer rows.Close() |
|
for rows.Next() { |
|
a := new(model.ArchiveStat) |
|
if err = rows.Scan(&a.Aid, &a.Click); err != nil { |
|
log.Error("rows.Scan() error(%v)", err) |
|
return nil, err |
|
} |
|
as[a.Aid] = a |
|
} |
|
if err = rows.Err(); err != nil { |
|
return nil, err |
|
} |
|
} |
|
return as, nil |
|
} |
|
|
|
// ArchiveStatsIncrs . |
|
func (d *Dao) ArchiveStatsIncrs(c context.Context, tbl int, id int64, begin, end xtime.Time, limit int) ([]*model.ArchiveStat, error) { |
|
rows, err := d.dbStat.Query(c, fmt.Sprintf(_archiveStatsMtimeSQL, fmt.Sprintf("%02d", tbl)), id, begin, end, limit) |
|
if err != nil { |
|
log.Error("d.dbStat.Query(%s,%d,%s,%s,%d) error(%v)", fmt.Sprintf(_archiveStatsMtimeSQL, fmt.Sprintf("%02d", tbl)), id, begin, end, limit, err) |
|
return nil, err |
|
} |
|
defer rows.Close() |
|
as := make([]*model.ArchiveStat, 0) |
|
for rows.Next() { |
|
a := new(model.ArchiveStat) |
|
if err = rows.Scan(&a.ID, &a.Aid, &a.Click); err != nil { |
|
log.Error("rows.Scan() error(%v)", err) |
|
return nil, err |
|
} |
|
as = append(as, a) |
|
} |
|
return as, rows.Err() |
|
} |
|
|
|
// ArchiveTVs . |
|
func (d *Dao) ArchiveTVs(c context.Context, aids []int64) (map[int64]*model.ArchiveTv, error) { |
|
aidsStr := xstr.JoinInts(aids) |
|
rows, err := d.dbTV.Query(c, fmt.Sprintf(_archiveTVsSQL, aidsStr)) |
|
if err != nil { |
|
log.Error("d.dbTV.Query(%s) error(%v)", fmt.Sprintf(_archiveTVsSQL, aidsStr), err) |
|
return nil, err |
|
} |
|
defer rows.Close() |
|
as := make(map[int64]*model.ArchiveTv) |
|
for rows.Next() { |
|
a := new(model.ArchiveTv) |
|
if err = rows.Scan(&a.Aid, &a.Result, &a.Deleted, &a.Valid); err != nil { |
|
log.Error("rows.Scan() error(%v)", err) |
|
return nil, err |
|
} |
|
as[a.Aid] = a |
|
} |
|
return as, rows.Err() |
|
} |
|
|
|
// ArchiveTVsIncrs . |
|
func (d *Dao) ArchiveTVsIncrs(c context.Context, id int64, begin, end xtime.Time, limit int) ([]*model.ArchiveTv, error) { |
|
rows, err := d.dbTV.Query(c, _archiveTVsMtimeSQL, id, begin, end, limit) |
|
if err != nil { |
|
log.Error("d.dbTV.Query(%s,%d,%s,%s,%d) error(%v)", _archiveTVsMtimeSQL, id, begin, end, limit, err) |
|
return nil, err |
|
} |
|
defer rows.Close() |
|
as := make([]*model.ArchiveTv, 0) |
|
for rows.Next() { |
|
a := new(model.ArchiveTv) |
|
if err = rows.Scan(&a.ID, &a.Aid, &a.Result, &a.Deleted, &a.Valid); err != nil { |
|
log.Error("rows.Scan() error(%v)", err) |
|
return nil, err |
|
} |
|
as = append(as, a) |
|
} |
|
return as, rows.Err() |
|
}
|
|
|