blob: 016ca95ddc4ef518762cd912b334e8a1ef23ebfc [file] [log] [blame]
Sabina Leaverc5fd2772022-01-29 17:00:23 -08001package db
2
3import (
Emily Markovafaecfe12023-07-01 12:40:03 -07004 "crypto/sha256"
Philipp Schrader30005e42022-03-06 13:53:58 -08005 "errors"
Sabina Leaverc5fd2772022-01-29 17:00:23 -08006 "fmt"
Philipp Schradereecb8962022-06-01 21:02:42 -07007 "gorm.io/driver/postgres"
8 "gorm.io/gorm"
9 "gorm.io/gorm/clause"
10 "gorm.io/gorm/logger"
Sabina Leaverc5fd2772022-01-29 17:00:23 -080011)
12
13type Database struct {
Philipp Schradereecb8962022-06-01 21:02:42 -070014 *gorm.DB
Sabina Leaverc5fd2772022-01-29 17:00:23 -080015}
16
Emily Markovabf24c9e2023-02-08 20:31:11 -080017type TeamMatch struct {
18 MatchNumber int32 `gorm:"primaryKey"`
19 SetNumber int32 `gorm:"primaryKey"`
20 CompLevel string `gorm:"primaryKey"`
21 Alliance string `gorm:"primaryKey"` // "R" or "B"
22 AlliancePosition int32 `gorm:"primaryKey"` // 1, 2, or 3
Emily Markovab8551572023-03-22 19:49:39 -070023 TeamNumber string
Sabina Leaverc5fd2772022-01-29 17:00:23 -080024}
25
Milo Lina72e2002022-04-06 20:31:13 -070026type Shift struct {
Philipp Schradereecb8962022-06-01 21:02:42 -070027 MatchNumber int32 `gorm:"primaryKey"`
Milo Lina72e2002022-04-06 20:31:13 -070028 R1scouter, R2scouter, R3scouter, B1scouter, B2scouter, B3scouter string
29}
30
Emily Markovafaecfe12023-07-01 12:40:03 -070031type PitImage struct {
32 TeamNumber string `gorm:"primaryKey"`
33 CheckSum string `gorm:"primaryKey"`
34 ImagePath string
35 ImageData []byte
36}
37
38type RequestedPitImage struct {
39 TeamNumber string
40 CheckSum string `gorm:"primaryKey"`
41 ImagePath string
42}
43
Sabina Leaver759090b2023-01-14 20:42:56 -080044type Stats2023 struct {
Philipp Schrader8fdfadf2023-04-15 16:26:10 -070045 // This is set to `true` for "pre-scouted" matches. This means that the
46 // match information is unlikely to correspond with an entry in the
47 // `TeamMatch` table.
48 PreScouting bool `gorm:"primaryKey"`
49
Sabina Leaver759090b2023-01-14 20:42:56 -080050 TeamNumber string `gorm:"primaryKey"`
51 MatchNumber int32 `gorm:"primaryKey"`
52 SetNumber int32 `gorm:"primaryKey"`
53 CompLevel string `gorm:"primaryKey"`
54 StartingQuadrant int32
55 LowCubesAuto, MiddleCubesAuto, HighCubesAuto, CubesDroppedAuto int32
56 LowConesAuto, MiddleConesAuto, HighConesAuto, ConesDroppedAuto int32
57 LowCubes, MiddleCubes, HighCubes, CubesDropped int32
58 LowCones, MiddleCones, HighCones, ConesDropped int32
Filip Kujawa7a045e72023-04-13 08:41:09 -070059 SuperchargedPieces int32
Philipp Schrader8c878a22023-03-20 22:36:38 -070060 AvgCycle int64
Filip Kujawa0b4b1e52023-04-15 14:05:40 -070061 Mobility bool
Emily Markova63c63f62023-03-29 20:57:35 -070062 DockedAuto, EngagedAuto, BalanceAttemptAuto bool
63 Docked, Engaged, BalanceAttempt bool
64
Sabina Leaver759090b2023-01-14 20:42:56 -080065 // The username of the person who collected these statistics.
66 // "unknown" if submitted without logging in.
67 // Empty if the stats have not yet been collected.
68 CollectedBy string
69}
70
Emily Markova8cb91312024-02-02 12:30:37 -080071type Stats2024 struct {
72 // This is set to `true` for "pre-scouted" matches. This means that the
73 // match information is unlikely to correspond with an entry in the
74 // `TeamMatch` table.
75 PreScouting bool `gorm:"primaryKey"`
76
77 TeamNumber string `gorm:"primaryKey"`
78 MatchNumber int32 `gorm:"primaryKey"`
79 SetNumber int32 `gorm:"primaryKey"`
80 CompLevel string `gorm:"primaryKey"`
81 StartingQuadrant int32
82 SpeakerAuto, AmpAuto int32
83 NotesDroppedAuto int32
84 MobilityAuto bool
85 Speaker, Amp, SpeakerAmplified, AmpAmplified int32
86 NotesDropped int32
87 Penalties int32
88 AvgCycle int64
Emily Markova040123c2024-02-27 09:48:37 -080089 RobotDied bool
Emily Markova6079e2f2024-02-17 13:17:24 -080090 Park, OnStage, Harmony, TrapNote, Spotlight bool
Emily Markova8cb91312024-02-02 12:30:37 -080091
92 // The username of the person who collected these statistics.
93 // "unknown" if submitted without logging in.
94 // Empty if the stats have not yet been collected.
95 CollectedBy string
96}
97
Sabina Leaver759090b2023-01-14 20:42:56 -080098type Action struct {
Philipp Schrader8fdfadf2023-04-15 16:26:10 -070099 PreScouting bool `gorm:"primaryKey"`
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800100 TeamNumber string `gorm:"primaryKey"`
101 MatchNumber int32 `gorm:"primaryKey"`
102 SetNumber int32 `gorm:"primaryKey"`
103 CompLevel string `gorm:"primaryKey"`
Sabina Leaver759090b2023-01-14 20:42:56 -0800104 // This contains a serialized scouting.webserver.requests.ActionType flatbuffer.
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800105 CompletedAction []byte
Philipp Schrader670a1c82023-05-17 19:42:43 -0700106 Timestamp int64 `gorm:"primaryKey"`
107 CollectedBy string
Sabina Leaver759090b2023-01-14 20:42:56 -0800108}
109
Alex Perry871eab92022-03-12 17:43:52 -0800110type NotesData struct {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800111 ID uint `gorm:"primaryKey"`
Emily Markovae68b7632023-12-30 14:17:55 -0800112 TeamNumber string
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800113 Notes string
114 GoodDriving bool
115 BadDriving bool
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700116 SolidPlacing bool
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800117 SketchyPlacing bool
118 GoodDefense bool
119 BadDefense bool
120 EasilyDefended bool
Alex Perry871eab92022-03-12 17:43:52 -0800121}
122
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700123type Ranking struct {
Emily Markovae68b7632023-12-30 14:17:55 -0800124 TeamNumber string `gorm:"primaryKey"`
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700125 Losses, Wins, Ties int32
126 Rank, Dq int32
127}
128
Filip Kujawa210a03b2022-11-24 14:41:11 -0800129type DriverRankingData struct {
130 // Each entry in the table is a single scout's ranking.
131 // Multiple scouts can submit a driver ranking for the same
132 // teams in the same match.
133 // The teams being ranked are stored in Rank1, Rank2, Rank3,
134 // Rank1 being the best driving and Rank3 being the worst driving.
135
136 ID uint `gorm:"primaryKey"`
137 MatchNumber int32
Emily Markovae68b7632023-12-30 14:17:55 -0800138 Rank1 string
139 Rank2 string
140 Rank3 string
Filip Kujawa210a03b2022-11-24 14:41:11 -0800141}
142
Philipp Schradera8955fb2023-03-05 15:47:19 -0800143type ParsedDriverRankingData struct {
144 // This data stores the output of DriverRank.jl.
145
146 TeamNumber string `gorm:"primaryKey"`
147
148 // The score of the team. A difference of 100 in two team's scores
149 // indicates that one team will outperform the other in 90% of the
150 // matches.
151 Score float32
152}
153
Philipp Schrader7365d322022-03-06 16:40:08 -0800154// Opens a database at the specified port on localhost. We currently don't
155// support connecting to databases on other hosts.
156func NewDatabase(user string, password string, port int) (*Database, error) {
Philipp Schrader83fc2722022-03-10 21:59:20 -0800157 var err error
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800158 database := new(Database)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800159
Philipp Schradereecb8962022-06-01 21:02:42 -0700160 dsn := fmt.Sprintf("host=localhost user=%s password=%s dbname=postgres port=%d sslmode=disable", user, password, port)
161 database.DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{
162 Logger: logger.Default.LogMode(logger.Silent),
163 })
Philipp Schrader7365d322022-03-06 16:40:08 -0800164 if err != nil {
Philipp Schradereecb8962022-06-01 21:02:42 -0700165 database.Delete()
Philipp Schrader7365d322022-03-06 16:40:08 -0800166 return nil, errors.New(fmt.Sprint("Failed to connect to postgres: ", err))
167 }
Philipp Schrader36df73a2022-03-17 23:27:24 -0700168
Emily Markova8cb91312024-02-02 12:30:37 -0800169 err = database.AutoMigrate(&TeamMatch{}, &Shift{}, &Stats2023{}, &Stats2024{}, &Action{}, &PitImage{}, &NotesData{}, &Ranking{}, &DriverRankingData{}, &ParsedDriverRankingData{})
Philipp Schrader83fc2722022-03-10 21:59:20 -0800170 if err != nil {
Philipp Schradereecb8962022-06-01 21:02:42 -0700171 database.Delete()
172 return nil, errors.New(fmt.Sprint("Failed to create/migrate tables: ", err))
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700173 }
174
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800175 return database, nil
176}
177
178func (database *Database) Delete() error {
Philipp Schradereecb8962022-06-01 21:02:42 -0700179 sql, err := database.DB.DB()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800180 if err != nil {
Philipp Schradereecb8962022-06-01 21:02:42 -0700181 return err
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800182 }
Philipp Schradereecb8962022-06-01 21:02:42 -0700183 return sql.Close()
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800184}
185
Philipp Schradereecb8962022-06-01 21:02:42 -0700186func (database *Database) SetDebugLogLevel() {
187 database.DB.Logger = database.DB.Logger.LogMode(logger.Info)
188}
Philipp Schradercd12c952022-04-08 18:58:49 -0700189
Emily Markovabf24c9e2023-02-08 20:31:11 -0800190func (database *Database) AddToMatch(m TeamMatch) error {
Philipp Schradereecb8962022-06-01 21:02:42 -0700191 result := database.Clauses(clause.OnConflict{
192 UpdateAll: true,
193 }).Create(&m)
194 return result.Error
Philipp Schradercd12c952022-04-08 18:58:49 -0700195}
196
Milo Lina72e2002022-04-06 20:31:13 -0700197func (database *Database) AddToShift(sh Shift) error {
Philipp Schradereecb8962022-06-01 21:02:42 -0700198 result := database.Clauses(clause.OnConflict{
199 UpdateAll: true,
200 }).Create(&sh)
201 return result.Error
Milo Lina72e2002022-04-06 20:31:13 -0700202}
203
Sabina Leaver759090b2023-01-14 20:42:56 -0800204func (database *Database) AddAction(a Action) error {
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700205 // TODO(phil): Add check for a corresponding match in the `TeamMatch`
206 // table. Similar to `AddToStats2023()` below.
207 result := database.Create(&a)
Sabina Leaver759090b2023-01-14 20:42:56 -0800208 return result.Error
209}
210
Emily Markovafaecfe12023-07-01 12:40:03 -0700211func (database *Database) AddPitImage(p PitImage) error {
212 result := database.Create(&p)
213 return result.Error
214}
215
Sabina Leaver759090b2023-01-14 20:42:56 -0800216func (database *Database) AddToStats2023(s Stats2023) error {
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700217 if !s.PreScouting {
218 matches, err := database.QueryMatchesString(s.TeamNumber)
219 if err != nil {
220 return err
Sabina Leaver759090b2023-01-14 20:42:56 -0800221 }
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700222 foundMatch := false
223 for _, match := range matches {
224 if match.MatchNumber == s.MatchNumber {
225 foundMatch = true
226 break
227 }
228 }
229 if !foundMatch {
230 return errors.New(fmt.Sprint(
231 "Failed to find team ", s.TeamNumber,
232 " in match ", s.MatchNumber, " in the schedule."))
233 }
Sabina Leaver759090b2023-01-14 20:42:56 -0800234 }
235
236 result := database.Create(&s)
237 return result.Error
238}
239
Emily Markova8cb91312024-02-02 12:30:37 -0800240func (database *Database) AddToStats2024(s Stats2024) error {
241 if !s.PreScouting {
242 matches, err := database.QueryMatchesString(s.TeamNumber)
243 if err != nil {
244 return err
245 }
246 foundMatch := false
247 for _, match := range matches {
248 if match.MatchNumber == s.MatchNumber {
249 foundMatch = true
250 break
251 }
252 }
253 if !foundMatch {
254 return errors.New(fmt.Sprint(
255 "Failed to find team ", s.TeamNumber,
256 " in match ", s.MatchNumber, " in the schedule."))
257 }
258 }
259
260 result := database.Create(&s)
261 return result.Error
262}
263
Emily Markova6b551e02023-02-18 17:37:40 -0800264func (database *Database) DeleteFromStats(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
265 var stats2023 []Stats2023
266 result := database.
267 Where("comp_level = ? AND match_number = ? AND set_number = ? AND team_number = ?", compLevel_, matchNumber_, setNumber_, teamNumber_).
268 Delete(&stats2023)
269 return result.Error
270}
271
Emily Markova8cb91312024-02-02 12:30:37 -0800272func (database *Database) DeleteFromStats2024(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
273 var stats2024 []Stats2024
274 result := database.
275 Where("comp_level = ? AND match_number = ? AND set_number = ? AND team_number = ?", compLevel_, matchNumber_, setNumber_, teamNumber_).
276 Delete(&stats2024)
277 return result.Error
278}
279
Filip Kujawac1ded372023-05-27 14:33:43 -0700280func (database *Database) DeleteFromActions(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
281 var actions []Action
282 result := database.
283 Where("comp_level = ? AND match_number = ? AND set_number = ? AND team_number = ?", compLevel_, matchNumber_, setNumber_, teamNumber_).
284 Delete(&actions)
285 return result.Error
286}
287
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700288func (database *Database) AddOrUpdateRankings(r Ranking) error {
Philipp Schradereecb8962022-06-01 21:02:42 -0700289 result := database.Clauses(clause.OnConflict{
290 UpdateAll: true,
291 }).Create(&r)
292 return result.Error
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700293}
294
Emily Markovabf24c9e2023-02-08 20:31:11 -0800295func (database *Database) ReturnMatches() ([]TeamMatch, error) {
296 var matches []TeamMatch
Philipp Schradereecb8962022-06-01 21:02:42 -0700297 result := database.Find(&matches)
298 return matches, result.Error
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800299}
300
Filip Kujawaf882e022022-12-14 13:14:08 -0800301func (database *Database) ReturnAllNotes() ([]NotesData, error) {
302 var notes []NotesData
303 result := database.Find(&notes)
304 return notes, result.Error
305}
306
307func (database *Database) ReturnAllDriverRankings() ([]DriverRankingData, error) {
308 var rankings []DriverRankingData
309 result := database.Find(&rankings)
310 return rankings, result.Error
311}
312
Philipp Schradera8955fb2023-03-05 15:47:19 -0800313func (database *Database) ReturnAllParsedDriverRankings() ([]ParsedDriverRankingData, error) {
314 var rankings []ParsedDriverRankingData
315 result := database.Find(&rankings)
316 return rankings, result.Error
317}
318
Milo Lina72e2002022-04-06 20:31:13 -0700319func (database *Database) ReturnAllShifts() ([]Shift, error) {
Philipp Schradereecb8962022-06-01 21:02:42 -0700320 var shifts []Shift
321 result := database.Find(&shifts)
322 return shifts, result.Error
323}
Milo Lina72e2002022-04-06 20:31:13 -0700324
Sabina Leaver759090b2023-01-14 20:42:56 -0800325func (database *Database) ReturnActions() ([]Action, error) {
326 var actions []Action
327 result := database.Find(&actions)
328 return actions, result.Error
329}
330
Emily Markovafaecfe12023-07-01 12:40:03 -0700331func (database *Database) ReturnPitImages() ([]PitImage, error) {
332 var images []PitImage
333 result := database.Find(&images)
334 return images, result.Error
335}
336
Emily Markova6b551e02023-02-18 17:37:40 -0800337func (database *Database) ReturnStats2023() ([]Stats2023, error) {
338 var stats2023 []Stats2023
339 result := database.Find(&stats2023)
340 return stats2023, result.Error
341}
342
Emily Markova8cb91312024-02-02 12:30:37 -0800343func (database *Database) ReturnStats2024() ([]Stats2024, error) {
344 var stats2024 []Stats2024
345 result := database.Find(&stats2024)
346 return stats2024, result.Error
347}
348
Filip Kujawaf3f9def2023-04-20 13:46:46 -0700349func (database *Database) ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]Stats2023, error) {
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800350 var stats2023 []Stats2023
351 result := database.
Filip Kujawaf3f9def2023-04-20 13:46:46 -0700352 Where("team_number = ? AND match_number = ? AND set_number = ? AND comp_level = ? AND pre_scouting = ?",
353 teamNumber, matchNumber, setNumber, compLevel, preScouting).
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800354 Find(&stats2023)
355 return stats2023, result.Error
356}
357
Emily Markova8cb91312024-02-02 12:30:37 -0800358func (database *Database) ReturnStats2024ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]Stats2024, error) {
359 var stats2024 []Stats2024
360 result := database.
361 Where("team_number = ? AND match_number = ? AND set_number = ? AND comp_level = ? AND pre_scouting = ?",
362 teamNumber, matchNumber, setNumber, compLevel, preScouting).
363 Find(&stats2024)
364 return stats2024, result.Error
365}
366
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700367func (database *Database) ReturnRankings() ([]Ranking, error) {
Philipp Schradereecb8962022-06-01 21:02:42 -0700368 var rankins []Ranking
369 result := database.Find(&rankins)
370 return rankins, result.Error
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700371}
372
Emily Markovab8551572023-03-22 19:49:39 -0700373func (database *Database) queryMatches(teamNumber_ string) ([]TeamMatch, error) {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800374 var matches []TeamMatch
Philipp Schradereecb8962022-06-01 21:02:42 -0700375 result := database.
Emily Markovabf24c9e2023-02-08 20:31:11 -0800376 Where("team_number = $1", teamNumber_).
Philipp Schradereecb8962022-06-01 21:02:42 -0700377 Find(&matches)
378 return matches, result.Error
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800379}
380
Emily Markovafaecfe12023-07-01 12:40:03 -0700381func (database *Database) QueryPitImages(teamNumber_ string) ([]RequestedPitImage, error) {
382 var requestedPitImages []RequestedPitImage
383 result := database.Model(&PitImage{}).
384 Where("team_number = $1", teamNumber_).
385 Find(&requestedPitImages)
386
387 return requestedPitImages, result.Error
388}
389
390func (database *Database) QueryPitImageByChecksum(checksum_ string) (PitImage, error) {
391 var pitImage PitImage
392 result := database.
393 Where("check_sum = $1", checksum_).
394 Find(&pitImage)
395 return pitImage, result.Error
396}
397
398func ComputeSha256FromByteArray(arr []byte) string {
399 sum := sha256.Sum256(arr)
400 return fmt.Sprintf("%x", sum)
401}
402
Emily Markovabf24c9e2023-02-08 20:31:11 -0800403func (database *Database) QueryMatchesString(teamNumber_ string) ([]TeamMatch, error) {
404 var matches []TeamMatch
Sabina Leaver759090b2023-01-14 20:42:56 -0800405 result := database.
Emily Markovabf24c9e2023-02-08 20:31:11 -0800406 Where("team_number = $1", teamNumber_).
Sabina Leaver759090b2023-01-14 20:42:56 -0800407 Find(&matches)
408 return matches, result.Error
409}
410
Milo Lina72e2002022-04-06 20:31:13 -0700411func (database *Database) QueryAllShifts(matchNumber_ int) ([]Shift, error) {
Milo Lina72e2002022-04-06 20:31:13 -0700412 var shifts []Shift
Philipp Schradereecb8962022-06-01 21:02:42 -0700413 result := database.Where("match_number = ?", matchNumber_).Find(&shifts)
414 return shifts, result.Error
Milo Lina72e2002022-04-06 20:31:13 -0700415}
416
Emily Markovae68b7632023-12-30 14:17:55 -0800417func (database *Database) QueryActions(teamNumber_ string) ([]Action, error) {
Sabina Leaver759090b2023-01-14 20:42:56 -0800418 var actions []Action
419 result := database.
420 Where("team_number = ?", teamNumber_).Find(&actions)
421 return actions, result.Error
422}
423
Emily Markovae68b7632023-12-30 14:17:55 -0800424func (database *Database) QueryNotes(TeamNumber string) ([]string, error) {
Philipp Schradereecb8962022-06-01 21:02:42 -0700425 var rawNotes []NotesData
426 result := database.Where("team_number = ?", TeamNumber).Find(&rawNotes)
427 if result.Error != nil {
428 return nil, result.Error
Alex Perry871eab92022-03-12 17:43:52 -0800429 }
Alex Perry871eab92022-03-12 17:43:52 -0800430
Philipp Schradereecb8962022-06-01 21:02:42 -0700431 notes := make([]string, len(rawNotes))
432 for i := range rawNotes {
433 notes[i] = rawNotes[i].Notes
Alex Perry871eab92022-03-12 17:43:52 -0800434 }
Philipp Schradereecb8962022-06-01 21:02:42 -0700435 return notes, nil
Alex Perry871eab92022-03-12 17:43:52 -0800436}
437
Emily Markovae68b7632023-12-30 14:17:55 -0800438func (database *Database) QueryRankings(TeamNumber string) ([]Ranking, error) {
Philipp Schradereecb8962022-06-01 21:02:42 -0700439 var rankins []Ranking
440 result := database.Where("team_number = ?", TeamNumber).Find(&rankins)
441 return rankins, result.Error
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700442}
443
Filip Kujawaf947cb42022-11-21 10:00:30 -0800444func (database *Database) AddNotes(data NotesData) error {
Philipp Schradereecb8962022-06-01 21:02:42 -0700445 result := database.Create(&NotesData{
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800446 TeamNumber: data.TeamNumber,
447 Notes: data.Notes,
448 GoodDriving: data.GoodDriving,
449 BadDriving: data.BadDriving,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700450 SolidPlacing: data.SolidPlacing,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800451 SketchyPlacing: data.SketchyPlacing,
452 GoodDefense: data.GoodDefense,
453 BadDefense: data.BadDefense,
454 EasilyDefended: data.EasilyDefended,
Philipp Schradereecb8962022-06-01 21:02:42 -0700455 })
456 return result.Error
Alex Perry871eab92022-03-12 17:43:52 -0800457}
Filip Kujawa210a03b2022-11-24 14:41:11 -0800458
459func (database *Database) AddDriverRanking(data DriverRankingData) error {
460 result := database.Create(&DriverRankingData{
461 MatchNumber: data.MatchNumber,
462 Rank1: data.Rank1,
463 Rank2: data.Rank2,
464 Rank3: data.Rank3,
465 })
466 return result.Error
467}
468
Philipp Schradera8955fb2023-03-05 15:47:19 -0800469func (database *Database) AddParsedDriverRanking(data ParsedDriverRankingData) error {
470 result := database.Clauses(clause.OnConflict{
471 UpdateAll: true,
472 }).Create(&data)
473 return result.Error
474}
475
Filip Kujawa210a03b2022-11-24 14:41:11 -0800476func (database *Database) QueryDriverRanking(MatchNumber int) ([]DriverRankingData, error) {
477 var data []DriverRankingData
478 result := database.Where("match_number = ?", MatchNumber).Find(&data)
479 return data, result.Error
480}