From 8d12458d90ef1fd57421f5b3abd4fc6d06b9834c Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Mon, 16 Jan 2023 21:22:55 +0300 Subject: ranking placements in each map with correct tie handling (#5, #27) --- backend/controllers/mapController.go | 22 ++++++++++++++++++++-- backend/models/models.go | 2 ++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/backend/controllers/mapController.go b/backend/controllers/mapController.go index c26d1ad..53fb18c 100644 --- a/backend/controllers/mapController.go +++ b/backend/controllers/mapController.go @@ -34,12 +34,14 @@ func FetchMap(c *gin.Context) { if mapData.IsCoop { var records []models.RecordMP sql = `SELECT id, host_id, partner_id, score_count, score_time, host_demo_id, partner_demo_id, record_date - FROM records_mp WHERE map_id = $1;` + FROM records_mp WHERE map_id = $1 ORDER BY score_count, score_time;` rows, err := database.DB.Query(sql, id) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } + placement := 1 + ties := 0 for rows.Next() { var record models.RecordMP err := rows.Scan(&record.RecordID, &record.HostID, &record.PartnerID, &record.ScoreCount, &record.ScoreTime, &record.HostDemoID, &record.PartnerDemoID, &record.RecordDate) @@ -47,18 +49,27 @@ func FetchMap(c *gin.Context) { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } + if len(records) != 0 && records[len(records)-1].ScoreTime == record.ScoreTime { + ties++ + record.Placement = placement - ties + } else { + record.Placement = placement + } records = append(records, record) + placement++ } mapData.Records = records } else { var records []models.RecordSP sql = `SELECT id, user_id, score_count, score_time, demo_id, record_date - FROM records_sp WHERE map_id = $1;` + FROM records_sp WHERE map_id = $1 ORDER BY score_count, score_time;` rows, err := database.DB.Query(sql, id) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } + placement := 1 + ties := 0 for rows.Next() { var record models.RecordSP err := rows.Scan(&record.RecordID, &record.UserID, &record.ScoreCount, &record.ScoreTime, &record.DemoID, &record.RecordDate) @@ -66,7 +77,14 @@ func FetchMap(c *gin.Context) { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } + if len(records) != 0 && records[len(records)-1].ScoreTime == record.ScoreTime { + ties++ + record.Placement = placement - ties + } else { + record.Placement = placement + } records = append(records, record) + placement++ } mapData.Records = records } diff --git a/backend/models/models.go b/backend/models/models.go index 8e710b7..0c380ff 100644 --- a/backend/models/models.go +++ b/backend/models/models.go @@ -34,6 +34,7 @@ type Map struct { type RecordSP struct { RecordID int `json:"record_id"` + Placement int `json:"placement"` UserID string `json:"user_id"` ScoreCount int `json:"score_count"` ScoreTime int `json:"score_time"` @@ -43,6 +44,7 @@ type RecordSP struct { type RecordMP struct { RecordID int `json:"record_id"` + Placement int `json:"placement"` HostID string `json:"host_id"` PartnerID string `json:"partner_id"` ScoreCount int `json:"score_count"` -- cgit v1.2.3