admin: score grid is a JSON to display scoring detail for a team

This commit is contained in:
nemunaire 2018-12-08 03:30:56 +01:00
parent 5dbf60eaa2
commit a1c94d582d
2 changed files with 45 additions and 7 deletions

View file

@ -45,6 +45,10 @@ func init() {
func(team fic.Team, _ []byte) (interface{}, error) { func(team fic.Team, _ []byte) (interface{}, error) {
return team.Delete() return team.Delete()
}))) })))
router.GET("/api/teams/:tid/score-grid.json", apiHandler(teamHandler(
func(team fic.Team, _ []byte) (interface{}, error) {
return team.ScoreGrid()
})))
router.GET("/api/teams/:tid/my.json", apiHandler(teamPublicHandler( router.GET("/api/teams/:tid/my.json", apiHandler(teamPublicHandler(
func(team *fic.Team, _ []byte) (interface{}, error) { func(team *fic.Team, _ []byte) (interface{}, error) {
return fic.MyJSONTeam(team, true) return fic.MyJSONTeam(team, true)

View file

@ -21,21 +21,55 @@ func exoptsQuery(whereExo string) string {
tries_table = "exercice_distinct_tries" tries_table = "exercice_distinct_tries"
} }
return `SELECT S.id_team, S.time, E.gain AS points, coeff FROM ( return `SELECT S.id_team, S.time, E.gain AS points, coeff, S.reason, S.id_exercice FROM (
SELECT id_team, id_exercice, MIN(time) AS time, ` + fmt.Sprintf("%f", FirstBlood) + ` AS coeff FROM exercice_solved GROUP BY id_exercice UNION SELECT id_team, id_exercice, MIN(time) AS time, ` + fmt.Sprintf("%f", FirstBlood) + ` AS coeff, "First blood" AS reason FROM exercice_solved GROUP BY id_exercice UNION
SELECT id_team, id_exercice, time, coefficient AS coeff FROM exercice_solved SELECT id_team, id_exercice, time, coefficient AS coeff, "Validation" AS reason FROM exercice_solved
) S INNER JOIN exercices E ON S.id_exercice = E.id_exercice ` + whereExo + ` UNION ALL ) S INNER JOIN exercices E ON S.id_exercice = E.id_exercice ` + whereExo + ` UNION ALL
SELECT id_team, MAX(time) AS time, (FLOOR(COUNT(*)/10 - 1) * (FLOOR(COUNT(*)/10)))/0.2 + (FLOOR(COUNT(*)/10) * (COUNT(*)%10)) AS points, ` + fmt.Sprintf("%f", SubmissionCostBase * -1) + ` AS coeff FROM ` + tries_table + ` S ` + whereExo + ` GROUP BY id_exercice, id_team` SELECT id_team, MAX(time) AS time, (FLOOR(COUNT(*)/10 - 1) * (FLOOR(COUNT(*)/10)))/0.2 + (FLOOR(COUNT(*)/10) * (COUNT(*)%10)) AS points, ` + fmt.Sprintf("%f", SubmissionCostBase * -1) + ` AS coeff, "Tries" AS reason, id_exercice FROM ` + tries_table + ` S ` + whereExo + ` GROUP BY id_exercice, id_team`
}
func teamptsQuery() string {
return exoptsQuery("") + ` UNION ALL
SELECT D.id_team, D.time, H.cost AS points, -1.0 AS coeff, "Hint" AS reason, H.id_exercice FROM team_hints D INNER JOIN exercice_hints H ON H.id_hint = D.id_hint HAVING points != 0 UNION ALL
SELECT W.id_team, W.time, F.choices_cost AS points, -1.0 AS coeff, "Display choices" AS reason, F.id_exercice FROM team_wchoices W INNER JOIN exercice_flags F ON F.id_flag = W.id_flag HAVING points != 0`
} }
func rankQuery(whereTeam string) string { func rankQuery(whereTeam string) string {
return `SELECT A.id_team, SUM(A.points * A.coeff) AS score, MAX(A.time) AS time FROM ( return `SELECT A.id_team, SUM(A.points * A.coeff) AS score, MAX(A.time) AS time FROM (
` + exoptsQuery("") + ` UNION ALL ` + teamptsQuery() + `
SELECT D.id_team, D.time, H.cost AS points, -1.0 AS coeff FROM team_hints D INNER JOIN exercice_hints H ON H.id_hint = D.id_hint HAVING points != 0 UNION ALL
SELECT W.id_team, W.time, F.choices_cost AS points, -1.0 AS coeff FROM team_wchoices W INNER JOIN exercice_flags F ON F.id_flag = W.id_flag HAVING points != 0
) A ` + whereTeam + ` GROUP BY A.id_team ORDER BY score DESC, time ASC` ) A ` + whereTeam + ` GROUP BY A.id_team ORDER BY score DESC, time ASC`
} }
func (t Team) ScoreGrid() (grid []map[string]interface{}, err error) {
q := "SELECT G.reason, G.id_exercice, G.time, G.points, G.coeff FROM (" + teamptsQuery() + ") AS G WHERE G.id_team = ? AND G.points != 0"
if rows, err := DBQuery(q, t.Id); err != nil {
return nil, err
} else {
defer rows.Close()
for rows.Next() {
var reason string
var exercice int64
var time time.Time
var points float64
var coeff float64
if err := rows.Scan(&reason, &exercice, &time, &points, &coeff); err != nil {
return nil, err
}
grid = append(grid, map[string]interface{}{
"reason": reason,
"id_exercice": exercice,
"time": time,
"points": points,
"coeff": coeff,
})
}
}
return
}
// Points // Points
// EstimateGain calculates the amount of point the Team has (or could have, if not already solved) won. // EstimateGain calculates the amount of point the Team has (or could have, if not already solved) won.