2020-06-01 19:05:33 +00:00
|
|
|
package cron
|
|
|
|
|
|
|
|
import (
|
2020-06-19 15:42:38 +00:00
|
|
|
"time"
|
2020-06-02 06:02:04 +00:00
|
|
|
|
2020-06-02 06:26:51 +00:00
|
|
|
"github.com/tribalwarshelp/shared/models"
|
2020-10-31 11:01:07 +00:00
|
|
|
"github.com/tribalwarshelp/shared/tw/dataloader"
|
2020-06-01 19:05:33 +00:00
|
|
|
|
|
|
|
"github.com/go-pg/pg/v10"
|
|
|
|
"github.com/go-pg/pg/v10/orm"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
)
|
|
|
|
|
2020-10-10 06:43:52 +00:00
|
|
|
type updateServerDataWorker struct {
|
2020-10-31 11:01:07 +00:00
|
|
|
db *pg.DB
|
|
|
|
dataloader dataloader.DataLoader
|
|
|
|
server *models.Server
|
2020-06-01 19:05:33 +00:00
|
|
|
}
|
|
|
|
|
2020-10-31 11:01:07 +00:00
|
|
|
func (h *updateServerDataWorker) loadPlayers(od map[int]*models.OpponentsDefeated) ([]*models.Player, error) {
|
|
|
|
ennoblements := []*models.Ennoblement{}
|
|
|
|
err := h.db.Model(&ennoblements).DistinctOn("new_owner_id").Order("new_owner_id ASC", "ennobled_at ASC").Select()
|
2020-06-01 19:05:33 +00:00
|
|
|
if err != nil {
|
2020-10-31 11:01:07 +00:00
|
|
|
return nil, errors.Wrap(err, "loadPlayers: Couldn't load ennoblements")
|
2020-06-01 19:05:33 +00:00
|
|
|
}
|
|
|
|
|
2020-10-31 11:01:07 +00:00
|
|
|
players, err := h.dataloader.LoadPlayers()
|
2020-06-01 19:05:33 +00:00
|
|
|
if err != nil {
|
2020-10-31 11:01:07 +00:00
|
|
|
return nil, err
|
2020-06-01 19:05:33 +00:00
|
|
|
}
|
|
|
|
|
2020-10-10 06:43:52 +00:00
|
|
|
now := time.Now()
|
2020-10-31 11:01:07 +00:00
|
|
|
searchableByNewOwnerID := &ennoblementsSearchableByNewOwnerID{ennoblements: ennoblements}
|
|
|
|
for _, player := range players {
|
2020-06-01 19:05:33 +00:00
|
|
|
playerOD, ok := od[player.ID]
|
|
|
|
if ok {
|
|
|
|
player.OpponentsDefeated = *playerOD
|
|
|
|
}
|
2020-10-31 11:01:07 +00:00
|
|
|
firstEnnoblementIndex := searchByID(searchableByNewOwnerID, player.ID)
|
|
|
|
if firstEnnoblementIndex != -1 {
|
|
|
|
firstEnnoblement := ennoblements[firstEnnoblementIndex]
|
2020-06-22 11:48:44 +00:00
|
|
|
diffInDays := getDateDifferenceInDays(now, firstEnnoblement.EnnobledAt)
|
|
|
|
player.DailyGrowth = calcPlayerDailyGrowth(diffInDays, player.Points)
|
|
|
|
}
|
2020-06-01 19:05:33 +00:00
|
|
|
}
|
|
|
|
return players, nil
|
|
|
|
}
|
|
|
|
|
2020-10-10 06:43:52 +00:00
|
|
|
func (h *updateServerDataWorker) loadTribes(od map[int]*models.OpponentsDefeated, numberOfVillages int) ([]*models.Tribe, error) {
|
2020-10-31 11:01:07 +00:00
|
|
|
tribes, err := h.dataloader.LoadTribes()
|
2020-06-01 19:05:33 +00:00
|
|
|
if err != nil {
|
2020-10-31 11:01:07 +00:00
|
|
|
return nil, err
|
2020-06-01 19:05:33 +00:00
|
|
|
}
|
2020-10-31 11:01:07 +00:00
|
|
|
for _, tribe := range tribes {
|
2020-06-01 19:05:33 +00:00
|
|
|
tribeOD, ok := od[tribe.ID]
|
|
|
|
if ok {
|
|
|
|
tribe.OpponentsDefeated = *tribeOD
|
|
|
|
}
|
2020-06-23 16:18:56 +00:00
|
|
|
if tribe.TotalVillages > 0 && numberOfVillages > 0 {
|
|
|
|
tribe.Dominance = float64(tribe.TotalVillages) / float64(numberOfVillages) * 100
|
|
|
|
} else {
|
|
|
|
tribe.Dominance = 0
|
|
|
|
}
|
2020-06-01 19:05:33 +00:00
|
|
|
}
|
|
|
|
return tribes, nil
|
|
|
|
}
|
|
|
|
|
2020-10-31 11:01:07 +00:00
|
|
|
func (h *updateServerDataWorker) loadEnnoblements() ([]*models.Ennoblement, error) {
|
2020-06-20 18:16:27 +00:00
|
|
|
lastEnnoblement := &models.Ennoblement{}
|
|
|
|
if err := h.db.
|
|
|
|
Model(lastEnnoblement).
|
|
|
|
Limit(1).
|
|
|
|
Order("ennobled_at DESC").
|
|
|
|
Select(); err != nil && err != pg.ErrNoRows {
|
2020-10-31 11:01:07 +00:00
|
|
|
return nil, errors.Wrapf(err, "couldnt load last ennoblement")
|
2020-06-20 18:16:27 +00:00
|
|
|
}
|
|
|
|
|
2020-10-31 11:01:07 +00:00
|
|
|
return h.dataloader.LoadEnnoblements(&dataloader.LoadEnnoblementsConfig{
|
|
|
|
EnnobledAtGTE: lastEnnoblement.EnnobledAt,
|
|
|
|
})
|
2020-06-19 15:42:38 +00:00
|
|
|
}
|
|
|
|
|
2020-10-10 06:43:52 +00:00
|
|
|
func (h *updateServerDataWorker) calculateODifference(od1 models.OpponentsDefeated, od2 models.OpponentsDefeated) models.OpponentsDefeated {
|
2020-06-25 11:24:06 +00:00
|
|
|
return models.OpponentsDefeated{
|
|
|
|
RankAtt: (od1.RankAtt - od2.RankAtt) * -1,
|
|
|
|
ScoreAtt: od1.ScoreAtt - od2.ScoreAtt,
|
|
|
|
RankDef: (od1.RankDef - od2.RankDef) * -1,
|
|
|
|
ScoreDef: od1.ScoreDef - od2.ScoreDef,
|
|
|
|
RankSup: (od1.RankSup - od2.RankSup) * -1,
|
|
|
|
ScoreSup: od1.ScoreSup - od2.ScoreSup,
|
|
|
|
RankTotal: (od1.RankTotal - od2.RankTotal) * -1,
|
|
|
|
ScoreTotal: od1.ScoreTotal - od2.ScoreTotal,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-24 10:24:05 +00:00
|
|
|
func (h *updateServerDataWorker) calculateTodaysTribeStats(tribes []*models.Tribe,
|
2020-06-25 11:24:06 +00:00
|
|
|
history []*models.TribeHistory) []*models.DailyTribeStats {
|
2020-10-24 10:24:05 +00:00
|
|
|
todaysStats := []*models.DailyTribeStats{}
|
2020-07-07 15:41:16 +00:00
|
|
|
searchableTribes := makeTribesSearchable(tribes)
|
2020-06-25 11:24:06 +00:00
|
|
|
|
|
|
|
for _, historyRecord := range history {
|
2020-10-31 11:01:07 +00:00
|
|
|
if index := searchByID(searchableTribes, historyRecord.TribeID); index != -1 {
|
2020-06-25 11:24:06 +00:00
|
|
|
tribe := tribes[index]
|
2020-10-24 10:24:05 +00:00
|
|
|
todaysStats = append(todaysStats, &models.DailyTribeStats{
|
2020-06-25 11:24:06 +00:00
|
|
|
TribeID: tribe.ID,
|
|
|
|
Members: tribe.TotalMembers - historyRecord.TotalMembers,
|
|
|
|
Villages: tribe.TotalVillages - historyRecord.TotalVillages,
|
|
|
|
Points: tribe.Points - historyRecord.Points,
|
|
|
|
AllPoints: tribe.AllPoints - historyRecord.AllPoints,
|
|
|
|
Rank: (tribe.Rank - historyRecord.Rank) * -1,
|
|
|
|
Dominance: tribe.Dominance - historyRecord.Dominance,
|
2020-06-29 13:01:16 +00:00
|
|
|
CreateDate: historyRecord.CreateDate,
|
2020-07-07 07:57:41 +00:00
|
|
|
OpponentsDefeated: h.calculateODifference(tribe.OpponentsDefeated, historyRecord.OpponentsDefeated),
|
2020-06-25 11:24:06 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-24 10:24:05 +00:00
|
|
|
return todaysStats
|
2020-06-25 11:24:06 +00:00
|
|
|
}
|
|
|
|
|
2020-10-10 06:43:52 +00:00
|
|
|
func (h *updateServerDataWorker) calculateDailyPlayerStats(players []*models.Player,
|
2020-06-25 11:24:06 +00:00
|
|
|
history []*models.PlayerHistory) []*models.DailyPlayerStats {
|
2020-10-24 10:24:05 +00:00
|
|
|
todaysStats := []*models.DailyPlayerStats{}
|
2020-07-07 15:41:16 +00:00
|
|
|
searchablePlayers := makePlayersSearchable(players)
|
2020-06-25 11:24:06 +00:00
|
|
|
|
|
|
|
for _, historyRecord := range history {
|
2020-10-31 11:01:07 +00:00
|
|
|
if index := searchByID(searchablePlayers, historyRecord.PlayerID); index != -1 {
|
2020-06-25 11:24:06 +00:00
|
|
|
player := players[index]
|
2020-10-24 10:24:05 +00:00
|
|
|
todaysStats = append(todaysStats, &models.DailyPlayerStats{
|
2020-06-25 11:24:06 +00:00
|
|
|
PlayerID: player.ID,
|
|
|
|
Villages: player.TotalVillages - historyRecord.TotalVillages,
|
|
|
|
Points: player.Points - historyRecord.Points,
|
|
|
|
Rank: (player.Rank - historyRecord.Rank) * -1,
|
2020-06-29 13:01:16 +00:00
|
|
|
CreateDate: historyRecord.CreateDate,
|
2020-07-07 07:57:41 +00:00
|
|
|
OpponentsDefeated: h.calculateODifference(player.OpponentsDefeated, historyRecord.OpponentsDefeated),
|
2020-06-25 11:24:06 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-10-24 10:24:05 +00:00
|
|
|
return todaysStats
|
2020-06-25 11:24:06 +00:00
|
|
|
}
|
|
|
|
|
2020-10-10 06:43:52 +00:00
|
|
|
func (h *updateServerDataWorker) update() error {
|
2020-10-31 11:01:07 +00:00
|
|
|
pod, err := h.dataloader.LoadOD(false)
|
2020-06-01 19:05:33 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2020-10-31 11:01:07 +00:00
|
|
|
tod, err := h.dataloader.LoadOD(true)
|
2020-06-01 19:05:33 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2020-06-21 09:27:56 +00:00
|
|
|
|
2020-10-31 11:01:07 +00:00
|
|
|
ennoblements, err := h.loadEnnoblements()
|
2020-06-22 11:48:44 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2020-10-31 11:01:07 +00:00
|
|
|
villages, err := h.dataloader.LoadVillages()
|
2020-06-01 19:05:33 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2020-06-21 09:27:56 +00:00
|
|
|
numberOfVillages := len(villages)
|
|
|
|
|
2020-10-10 06:43:52 +00:00
|
|
|
tribes, err := h.loadTribes(tod, countPlayerVillages(villages))
|
2020-06-01 19:05:33 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2020-06-21 09:27:56 +00:00
|
|
|
numberOfTribes := len(tribes)
|
|
|
|
|
2020-10-31 11:01:07 +00:00
|
|
|
players, err := h.loadPlayers(pod)
|
2020-06-01 19:05:33 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2020-06-21 09:27:56 +00:00
|
|
|
numberOfPlayers := len(players)
|
|
|
|
|
2020-10-31 11:01:07 +00:00
|
|
|
cfg, err := h.dataloader.GetConfig()
|
2020-06-19 15:42:38 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2020-10-31 11:01:07 +00:00
|
|
|
buildingCfg, err := h.dataloader.GetBuildingConfig()
|
2020-06-19 15:42:38 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2020-10-31 11:01:07 +00:00
|
|
|
unitCfg, err := h.dataloader.GetUnitConfig()
|
2020-06-19 15:42:38 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2020-06-21 09:27:56 +00:00
|
|
|
|
2020-10-24 10:24:05 +00:00
|
|
|
tx, err := h.db.Begin()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer tx.Close()
|
2020-06-02 10:09:32 +00:00
|
|
|
|
2020-06-02 06:26:51 +00:00
|
|
|
if len(tribes) > 0 {
|
|
|
|
ids := []int{}
|
|
|
|
for _, tribe := range tribes {
|
|
|
|
ids = append(ids, tribe.ID)
|
|
|
|
}
|
2020-10-24 10:24:05 +00:00
|
|
|
|
|
|
|
if _, err := tx.Model(&tribes).
|
|
|
|
OnConflict("(id) DO UPDATE").
|
|
|
|
Set("name = EXCLUDED.name").
|
|
|
|
Set("tag = EXCLUDED.tag").
|
|
|
|
Set("total_members = EXCLUDED.total_members").
|
|
|
|
Set("total_villages = EXCLUDED.total_villages").
|
|
|
|
Set("points = EXCLUDED.points").
|
|
|
|
Set("all_points = EXCLUDED.all_points").
|
|
|
|
Set("rank = EXCLUDED.rank").
|
|
|
|
Set("exists = EXCLUDED.exists").
|
|
|
|
Set("dominance = EXCLUDED.dominance").
|
|
|
|
Apply(appendODSetClauses).
|
|
|
|
Insert(); err != nil {
|
2020-10-24 18:49:02 +00:00
|
|
|
return errors.Wrap(err, "couldnt insert tribes")
|
2020-10-24 10:24:05 +00:00
|
|
|
}
|
|
|
|
if _, err := tx.Model(&tribes).
|
2020-10-31 11:01:07 +00:00
|
|
|
Where("NOT (tribe.id = ANY (?))", pg.Array(ids)).
|
2020-10-24 10:24:05 +00:00
|
|
|
Set("exists = false").
|
|
|
|
Update(); err != nil && err != pg.ErrNoRows {
|
2020-10-24 18:49:02 +00:00
|
|
|
return errors.Wrap(err, "couldnt update nonexistent tribes")
|
2020-10-24 10:24:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
tribesHistory := []*models.TribeHistory{}
|
|
|
|
if err := h.db.Model(&tribesHistory).
|
|
|
|
DistinctOn("tribe_id").
|
|
|
|
Column("*").
|
2020-10-31 11:01:07 +00:00
|
|
|
Where("tribe_id = ANY (?)", pg.Array(ids)).
|
2020-10-24 10:24:05 +00:00
|
|
|
Order("tribe_id DESC", "create_date DESC").
|
|
|
|
Select(); err != nil && err != pg.ErrNoRows {
|
2020-10-24 18:49:02 +00:00
|
|
|
return errors.Wrap(err, "couldnt select tribe history records")
|
2020-10-24 10:24:05 +00:00
|
|
|
}
|
|
|
|
todaysTribeStats := h.calculateTodaysTribeStats(tribes, tribesHistory)
|
|
|
|
if len(todaysTribeStats) > 0 {
|
|
|
|
if _, err := tx.
|
|
|
|
Model(&todaysTribeStats).
|
|
|
|
OnConflict("ON CONSTRAINT daily_tribe_stats_tribe_id_create_date_key DO UPDATE").
|
|
|
|
Set("members = EXCLUDED.members").
|
|
|
|
Set("villages = EXCLUDED.villages").
|
2020-06-25 11:24:06 +00:00
|
|
|
Set("points = EXCLUDED.points").
|
|
|
|
Set("all_points = EXCLUDED.all_points").
|
|
|
|
Set("rank = EXCLUDED.rank").
|
|
|
|
Set("dominance = EXCLUDED.dominance").
|
2020-10-10 06:43:52 +00:00
|
|
|
Apply(appendODSetClauses).
|
2020-06-25 11:24:06 +00:00
|
|
|
Insert(); err != nil {
|
2020-10-24 18:49:02 +00:00
|
|
|
return errors.Wrap(err, "couldnt insert today's tribe stats")
|
2020-06-25 11:24:06 +00:00
|
|
|
}
|
2020-10-24 10:24:05 +00:00
|
|
|
}
|
2020-06-02 06:26:51 +00:00
|
|
|
}
|
|
|
|
if len(players) > 0 {
|
|
|
|
ids := []int{}
|
|
|
|
for _, player := range players {
|
|
|
|
ids = append(ids, player.ID)
|
|
|
|
}
|
2020-10-24 10:24:05 +00:00
|
|
|
if _, err := tx.Model(&players).
|
|
|
|
OnConflict("(id) DO UPDATE").
|
|
|
|
Set("name = EXCLUDED.name").
|
|
|
|
Set("total_villages = EXCLUDED.total_villages").
|
|
|
|
Set("points = EXCLUDED.points").
|
|
|
|
Set("rank = EXCLUDED.rank").
|
|
|
|
Set("exists = EXCLUDED.exists").
|
|
|
|
Set("tribe_id = EXCLUDED.tribe_id").
|
|
|
|
Set("daily_growth = EXCLUDED.daily_growth").
|
|
|
|
Apply(appendODSetClauses).
|
|
|
|
Insert(); err != nil {
|
2020-10-24 18:49:02 +00:00
|
|
|
return errors.Wrap(err, "couldnt insert players")
|
2020-10-24 10:24:05 +00:00
|
|
|
}
|
|
|
|
if _, err := tx.Model(&models.Player{}).
|
2020-10-31 11:01:07 +00:00
|
|
|
Where("NOT (player.id = ANY (?))", pg.Array(ids)).
|
2020-10-24 10:24:05 +00:00
|
|
|
Set("exists = false").
|
2020-12-23 16:46:05 +00:00
|
|
|
Set("tribe_id = 0").
|
2020-10-24 10:24:05 +00:00
|
|
|
Update(); err != nil && err != pg.ErrNoRows {
|
2020-10-24 18:49:02 +00:00
|
|
|
return errors.Wrap(err, "couldnt update nonexistent players")
|
2020-10-24 10:24:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
playerHistory := []*models.PlayerHistory{}
|
|
|
|
if err := h.db.Model(&playerHistory).
|
|
|
|
DistinctOn("player_id").
|
|
|
|
Column("*").
|
2020-10-31 11:01:07 +00:00
|
|
|
Where("player_id = ANY (?)", pg.Array(ids)).
|
2020-10-24 10:24:05 +00:00
|
|
|
Order("player_id DESC", "create_date DESC").Select(); err != nil && err != pg.ErrNoRows {
|
2020-10-24 18:49:02 +00:00
|
|
|
return errors.Wrap(err, "couldnt select player history records")
|
2020-10-24 10:24:05 +00:00
|
|
|
}
|
|
|
|
todaysPlayerStats := h.calculateDailyPlayerStats(players, playerHistory)
|
|
|
|
if len(todaysPlayerStats) > 0 {
|
|
|
|
if _, err := tx.
|
|
|
|
Model(&todaysPlayerStats).
|
|
|
|
OnConflict("ON CONSTRAINT daily_player_stats_player_id_create_date_key DO UPDATE").
|
|
|
|
Set("villages = EXCLUDED.villages").
|
2020-06-25 11:24:06 +00:00
|
|
|
Set("points = EXCLUDED.points").
|
|
|
|
Set("rank = EXCLUDED.rank").
|
2020-10-10 06:43:52 +00:00
|
|
|
Apply(appendODSetClauses).
|
2020-06-25 11:24:06 +00:00
|
|
|
Insert(); err != nil {
|
2020-10-24 18:49:02 +00:00
|
|
|
return errors.Wrap(err, "couldnt insert today's player stats")
|
2020-06-25 11:24:06 +00:00
|
|
|
}
|
2020-10-24 10:24:05 +00:00
|
|
|
}
|
2020-07-27 15:16:13 +00:00
|
|
|
|
2020-06-01 19:05:33 +00:00
|
|
|
}
|
2020-06-02 06:26:51 +00:00
|
|
|
if len(villages) > 0 {
|
2020-10-24 10:24:05 +00:00
|
|
|
if _, err := tx.Model(&models.Village{}).
|
|
|
|
Where("true").
|
|
|
|
Delete(); err != nil && err != pg.ErrNoRows {
|
2020-10-24 18:49:02 +00:00
|
|
|
return errors.Wrap(err, "couldnt delete villages")
|
2020-10-24 10:24:05 +00:00
|
|
|
}
|
|
|
|
if _, err := tx.Model(&villages).
|
|
|
|
OnConflict("(id) DO UPDATE").
|
|
|
|
Set("name = EXCLUDED.name").
|
|
|
|
Set("points = EXCLUDED.points").
|
|
|
|
Set("x = EXCLUDED.x").
|
|
|
|
Set("y = EXCLUDED.y").
|
|
|
|
Set("bonus = EXCLUDED.bonus").
|
|
|
|
Set("player_id = EXCLUDED.player_id").
|
|
|
|
Insert(); err != nil {
|
2020-10-24 18:49:02 +00:00
|
|
|
return errors.Wrap(err, "couldnt insert villages")
|
2020-10-24 10:24:05 +00:00
|
|
|
}
|
2020-06-01 19:05:33 +00:00
|
|
|
}
|
2020-06-20 18:16:27 +00:00
|
|
|
if len(ennoblements) > 0 {
|
2020-10-24 10:24:05 +00:00
|
|
|
if _, err := tx.Model(&ennoblements).Insert(); err != nil {
|
2020-10-24 18:49:02 +00:00
|
|
|
return errors.Wrap(err, "couldnt insert ennoblements")
|
2020-10-24 10:24:05 +00:00
|
|
|
}
|
2020-06-20 18:16:27 +00:00
|
|
|
}
|
2020-06-01 19:05:33 +00:00
|
|
|
|
2020-10-24 10:24:05 +00:00
|
|
|
if _, err := tx.Model(h.server).
|
2020-06-20 18:16:27 +00:00
|
|
|
Set("data_updated_at = ?", time.Now()).
|
|
|
|
Set("unit_config = ?", unitCfg).
|
|
|
|
Set("building_config = ?", buildingCfg).
|
|
|
|
Set("config = ?", cfg).
|
2020-06-21 09:27:56 +00:00
|
|
|
Set("number_of_players = ?", numberOfPlayers).
|
|
|
|
Set("number_of_tribes = ?", numberOfTribes).
|
|
|
|
Set("number_of_villages = ?", numberOfVillages).
|
2020-06-20 18:16:27 +00:00
|
|
|
Returning("*").
|
|
|
|
WherePK().
|
|
|
|
Update(); err != nil {
|
2020-10-24 18:49:02 +00:00
|
|
|
return errors.Wrap(err, "couldnt update server")
|
2020-06-19 15:42:38 +00:00
|
|
|
}
|
|
|
|
|
2020-10-24 19:17:59 +00:00
|
|
|
if err := tx.Commit(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
2020-06-01 19:05:33 +00:00
|
|
|
}
|
|
|
|
|
2020-10-10 06:43:52 +00:00
|
|
|
func appendODSetClauses(q *orm.Query) (*orm.Query, error) {
|
2020-06-01 19:05:33 +00:00
|
|
|
return q.Set("rank_att = EXCLUDED.rank_att").
|
|
|
|
Set("score_att = EXCLUDED.score_att").
|
|
|
|
Set("rank_def = EXCLUDED.rank_def").
|
|
|
|
Set("score_def = EXCLUDED.score_def").
|
|
|
|
Set("rank_sup = EXCLUDED.rank_sup").
|
|
|
|
Set("score_sup = EXCLUDED.score_sup").
|
|
|
|
Set("rank_total = EXCLUDED.rank_total").
|
|
|
|
Set("score_total = EXCLUDED.score_total"),
|
|
|
|
nil
|
|
|
|
}
|