package db import ( jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types" "gorm.io/gorm" "gorm.io/gorm/clause" ) type PackageAccessStatDB struct { *DB } func (db *DB) PackageAccessStat() *PackageAccessStatDB { return &PackageAccessStatDB{db} } func (*PackageAccessStatDB) Get(ctx SQLContext, pkgID jcstypes.PackageID, spaceID jcstypes.UserSpaceID) (jcstypes.PackageAccessStat, error) { var ret jcstypes.PackageAccessStat err := ctx.Table("PackageAccessStat").Where("PackageID = ? AND UserSpaceID = ?", pkgID, spaceID).First(&ret).Error return ret, err } func (*PackageAccessStatDB) GetByPackageID(ctx SQLContext, pkgID jcstypes.PackageID) ([]jcstypes.PackageAccessStat, error) { var ret []jcstypes.PackageAccessStat err := ctx.Table("PackageAccessStat").Where("PackageID = ?", pkgID).Find(&ret).Error return ret, err } func (*PackageAccessStatDB) BatchGetByPackageID(ctx SQLContext, pkgIDs []jcstypes.PackageID) ([]jcstypes.PackageAccessStat, error) { if len(pkgIDs) == 0 { return nil, nil } var ret []jcstypes.PackageAccessStat err := ctx.Table("PackageAccessStat").Where("PackageID IN (?)", pkgIDs).Find(&ret).Error return ret, err } func (*PackageAccessStatDB) BatchAddCounter(ctx SQLContext, entries []AddAccessStatEntry) error { if len(entries) == 0 { return nil } accs := make([]jcstypes.PackageAccessStat, len(entries)) for i, e := range entries { accs[i] = jcstypes.PackageAccessStat{ PackageID: e.PackageID, UserSpaceID: e.UserSpaceID, Counter: e.Counter, } } return ctx.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "PackageID"}, {Name: "UserSpaceID"}}, DoUpdates: clause.Assignments(map[string]any{ "Counter": gorm.Expr("Counter + values(Counter)"), }), }).Table("PackageAccessStat").Create(&accs).Error } func (*PackageAccessStatDB) BatchUpdateAmount(ctx SQLContext, pkgIDs []jcstypes.PackageID, historyWeight float64) error { if len(pkgIDs) == 0 { return nil } sql := "UPDATE PackageAccessStat SET Amount = Amount * ? + Counter * (1 - ?), Counter = 0 WHERE PackageID IN (?)" return ctx.Exec(sql, historyWeight, historyWeight, pkgIDs).Error } func (*PackageAccessStatDB) UpdateAllAmount(ctx SQLContext, historyWeight float64) error { sql := "UPDATE PackageAccessStat SET Amount = Amount * ? + Counter * (1 - ?), Counter = 0" return ctx.Exec(sql, historyWeight, historyWeight).Error } func (*PackageAccessStatDB) DeleteByPackageID(ctx SQLContext, pkgID jcstypes.PackageID) error { return ctx.Table("PackageAccessStat").Where("PackageID = ?", pkgID).Delete(&jcstypes.PackageAccessStat{}).Error } func (*PackageAccessStatDB) DeleteByUserSpaceID(ctx SQLContext, spaceID jcstypes.UserSpaceID) error { return ctx.Table("PackageAccessStat").Where("UserSpaceID = ?", spaceID).Delete(&jcstypes.PackageAccessStat{}).Error }