Add field to Ranking model to track previous rank.

This commit is contained in:
Patrick Fairbank
2020-03-26 21:38:58 -07:00
parent 9d3100e65a
commit 2f7d186554
12 changed files with 120 additions and 48 deletions

View File

@@ -13,10 +13,10 @@ import (
)
// Determines the rankings from the stored match results, and saves them to the database.
func CalculateRankings(database *model.Database) error {
func CalculateRankings(database *model.Database, preservePreviousRank bool) (game.Rankings, error) {
matches, err := database.GetMatchesByType("qualification")
if err != nil {
return err
return nil, err
}
rankings := make(map[int]*game.Ranking)
for _, match := range matches {
@@ -25,7 +25,7 @@ func CalculateRankings(database *model.Database) error {
}
matchResult, err := database.GetMatchResultForMatch(match.Id)
if err != nil {
return err
return nil, err
}
if !match.Red1IsSurrogate {
addMatchResultToRankings(rankings, match.Red1, matchResult, true)
@@ -47,16 +47,33 @@ func CalculateRankings(database *model.Database) error {
}
}
// Retrieve old rankings so that we can display changes in rank as a result of this calculation.
oldRankings, err := database.GetAllRankings()
if err != nil {
return nil, err
}
oldRankingsMap := make(map[int]game.Ranking, len(oldRankings))
for _, ranking := range oldRankings {
oldRankingsMap[ranking.TeamId] = ranking
}
sortedRankings := sortRankings(rankings)
for rank, ranking := range sortedRankings {
ranking.Rank = rank + 1
sortedRankings[rank].Rank = rank + 1
if oldRank, ok := oldRankingsMap[ranking.TeamId]; ok {
if preservePreviousRank {
sortedRankings[rank].PreviousRank = oldRank.PreviousRank
} else {
sortedRankings[rank].PreviousRank = oldRank.Rank
}
}
}
err = database.ReplaceAllRankings(sortedRankings)
if err != nil {
return nil
return nil, err
}
return nil
return sortedRankings, nil
}
// Checks all the match results for yellow and red cards, and updates the team model accordingly.
@@ -140,7 +157,7 @@ func addMatchResultToRankings(rankings map[int]*game.Ranking, teamId int, matchR
func sortRankings(rankings map[int]*game.Ranking) game.Rankings {
var sortedRankings game.Rankings
for _, ranking := range rankings {
sortedRankings = append(sortedRankings, ranking)
sortedRankings = append(sortedRankings, *ranking)
}
sort.Sort(sortedRankings)
return sortedRankings

View File

@@ -13,17 +13,24 @@ func TestCalculateRankings(t *testing.T) {
database := setupTestDb(t)
setupMatchResultsForRankings(database)
err := CalculateRankings(database)
updatedRankings, err := CalculateRankings(database, false)
assert.Nil(t, err)
rankings, err := database.GetAllRankings()
assert.Nil(t, err)
assert.Equal(t, updatedRankings, rankings)
if assert.Equal(t, 6, len(rankings)) {
assert.Equal(t, 4, rankings[0].TeamId)
assert.Equal(t, 0, rankings[0].PreviousRank)
assert.Equal(t, 5, rankings[1].TeamId)
assert.Equal(t, 0, rankings[1].PreviousRank)
assert.Equal(t, 6, rankings[2].TeamId)
assert.Equal(t, 0, rankings[2].PreviousRank)
assert.Equal(t, 1, rankings[3].TeamId)
assert.Equal(t, 0, rankings[3].PreviousRank)
assert.Equal(t, 3, rankings[4].TeamId)
assert.Equal(t, 0, rankings[4].PreviousRank)
assert.Equal(t, 2, rankings[5].TeamId)
assert.Equal(t, 0, rankings[5].PreviousRank)
}
// Test after changing a match result.
@@ -31,17 +38,47 @@ func TestCalculateRankings(t *testing.T) {
matchResult3.RedScore, matchResult3.BlueScore = matchResult3.BlueScore, matchResult3.RedScore
err = database.CreateMatchResult(matchResult3)
assert.Nil(t, err)
err = CalculateRankings(database)
updatedRankings, err = CalculateRankings(database, false)
assert.Nil(t, err)
rankings, err = database.GetAllRankings()
assert.Nil(t, err)
assert.Equal(t, updatedRankings, rankings)
if assert.Equal(t, 6, len(rankings)) {
assert.Equal(t, 6, rankings[0].TeamId)
assert.Equal(t, 3, rankings[0].PreviousRank)
assert.Equal(t, 5, rankings[1].TeamId)
assert.Equal(t, 2, rankings[1].PreviousRank)
assert.Equal(t, 4, rankings[2].TeamId)
assert.Equal(t, 1, rankings[2].PreviousRank)
assert.Equal(t, 1, rankings[3].TeamId)
assert.Equal(t, 4, rankings[3].PreviousRank)
assert.Equal(t, 3, rankings[4].TeamId)
assert.Equal(t, 5, rankings[4].PreviousRank)
assert.Equal(t, 2, rankings[5].TeamId)
assert.Equal(t, 6, rankings[5].PreviousRank)
}
matchResult3 = model.BuildTestMatchResult(3, 4)
err = database.CreateMatchResult(matchResult3)
assert.Nil(t, err)
updatedRankings, err = CalculateRankings(database, true)
assert.Nil(t, err)
rankings, err = database.GetAllRankings()
assert.Nil(t, err)
assert.Equal(t, updatedRankings, rankings)
if assert.Equal(t, 6, len(rankings)) {
assert.Equal(t, 4, rankings[0].TeamId)
assert.Equal(t, 1, rankings[0].PreviousRank)
assert.Equal(t, 5, rankings[1].TeamId)
assert.Equal(t, 2, rankings[1].PreviousRank)
assert.Equal(t, 1, rankings[2].TeamId)
assert.Equal(t, 4, rankings[2].PreviousRank)
assert.Equal(t, 3, rankings[3].TeamId)
assert.Equal(t, 5, rankings[3].PreviousRank)
assert.Equal(t, 6, rankings[4].TeamId)
assert.Equal(t, 3, rankings[4].PreviousRank)
assert.Equal(t, 2, rankings[5].TeamId)
assert.Equal(t, 6, rankings[5].PreviousRank)
}
}