blob: 9df6097a85f5b4d5fc27a576c810b065c1f37705 [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 {
Emily Markovacd156942024-04-07 19:32:28 -070072 TeamNumber string `gorm:"primaryKey"`
73 MatchNumber int32 `gorm:"primaryKey"`
74 SetNumber int32 `gorm:"primaryKey"`
75 CompLevel string `gorm:"primaryKey"`
Emily Markova9c18e9c2024-04-03 20:06:27 -070076 CompType string `gorm:"primaryKey"`
Emily Markovacd156942024-04-07 19:32:28 -070077 StartingQuadrant int32
78 SpeakerAuto, AmpAuto int32
79 NotesDroppedAuto int32
80 MobilityAuto bool
81 Speaker, Amp, SpeakerAmplified int32
82 NotesDropped int32
83 Shuttled, OutOfField int32
84 Penalties int32
85 AvgCycle int64
86 RobotDied bool
87 Park, OnStage, Harmony, TrapNote, Spotlight bool
Emily Markovaf17f2812024-04-03 20:55:12 -070088 NoShow bool
Emily Markova8cb91312024-02-02 12:30:37 -080089
90 // The username of the person who collected these statistics.
91 // "unknown" if submitted without logging in.
92 // Empty if the stats have not yet been collected.
93 CollectedBy string
94}
95
Sabina Leaver759090b2023-01-14 20:42:56 -080096type Action struct {
Sabina Leaver9b4eb312023-02-20 19:58:17 -080097 TeamNumber string `gorm:"primaryKey"`
98 MatchNumber int32 `gorm:"primaryKey"`
99 SetNumber int32 `gorm:"primaryKey"`
100 CompLevel string `gorm:"primaryKey"`
Emily Markova9c18e9c2024-04-03 20:06:27 -0700101 CompType string `gorm:"primaryKey"`
Sabina Leaver759090b2023-01-14 20:42:56 -0800102 // This contains a serialized scouting.webserver.requests.ActionType flatbuffer.
Sabina Leaver9b4eb312023-02-20 19:58:17 -0800103 CompletedAction []byte
Philipp Schrader670a1c82023-05-17 19:42:43 -0700104 Timestamp int64 `gorm:"primaryKey"`
105 CollectedBy string
Sabina Leaver759090b2023-01-14 20:42:56 -0800106}
107
Alex Perry871eab92022-03-12 17:43:52 -0800108type NotesData struct {
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800109 ID uint `gorm:"primaryKey"`
Emily Markovae68b7632023-12-30 14:17:55 -0800110 TeamNumber string
Emily Markovacf893f42024-03-13 19:03:10 -0700111 MatchNumber int32
112 SetNumber int32
113 CompLevel string
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800114 Notes string
115 GoodDriving bool
116 BadDriving bool
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700117 SolidPlacing bool
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800118 SketchyPlacing bool
119 GoodDefense bool
120 BadDefense bool
121 EasilyDefended bool
Emily Markovacf893f42024-03-13 19:03:10 -0700122 NoShow bool
Alex Perry871eab92022-03-12 17:43:52 -0800123}
124
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700125type Ranking struct {
Emily Markovae68b7632023-12-30 14:17:55 -0800126 TeamNumber string `gorm:"primaryKey"`
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700127 Losses, Wins, Ties int32
128 Rank, Dq int32
129}
130
Filip Kujawa210a03b2022-11-24 14:41:11 -0800131type DriverRankingData struct {
132 // Each entry in the table is a single scout's ranking.
133 // Multiple scouts can submit a driver ranking for the same
134 // teams in the same match.
135 // The teams being ranked are stored in Rank1, Rank2, Rank3,
136 // Rank1 being the best driving and Rank3 being the worst driving.
137
138 ID uint `gorm:"primaryKey"`
139 MatchNumber int32
Emily Markovae68b7632023-12-30 14:17:55 -0800140 Rank1 string
141 Rank2 string
142 Rank3 string
Filip Kujawa210a03b2022-11-24 14:41:11 -0800143}
144
Philipp Schradera8955fb2023-03-05 15:47:19 -0800145type ParsedDriverRankingData struct {
146 // This data stores the output of DriverRank.jl.
147
148 TeamNumber string `gorm:"primaryKey"`
149
150 // The score of the team. A difference of 100 in two team's scores
151 // indicates that one team will outperform the other in 90% of the
152 // matches.
153 Score float32
154}
155
Philipp Schrader7365d322022-03-06 16:40:08 -0800156// Opens a database at the specified port on localhost. We currently don't
157// support connecting to databases on other hosts.
158func NewDatabase(user string, password string, port int) (*Database, error) {
Philipp Schrader83fc2722022-03-10 21:59:20 -0800159 var err error
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800160 database := new(Database)
Philipp Schrader83fc2722022-03-10 21:59:20 -0800161
Philipp Schradereecb8962022-06-01 21:02:42 -0700162 dsn := fmt.Sprintf("host=localhost user=%s password=%s dbname=postgres port=%d sslmode=disable", user, password, port)
163 database.DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{
164 Logger: logger.Default.LogMode(logger.Silent),
165 })
Philipp Schrader7365d322022-03-06 16:40:08 -0800166 if err != nil {
Philipp Schradereecb8962022-06-01 21:02:42 -0700167 database.Delete()
Philipp Schrader7365d322022-03-06 16:40:08 -0800168 return nil, errors.New(fmt.Sprint("Failed to connect to postgres: ", err))
169 }
Philipp Schrader36df73a2022-03-17 23:27:24 -0700170
Emily Markova8cb91312024-02-02 12:30:37 -0800171 err = database.AutoMigrate(&TeamMatch{}, &Shift{}, &Stats2023{}, &Stats2024{}, &Action{}, &PitImage{}, &NotesData{}, &Ranking{}, &DriverRankingData{}, &ParsedDriverRankingData{})
Philipp Schrader83fc2722022-03-10 21:59:20 -0800172 if err != nil {
Philipp Schradereecb8962022-06-01 21:02:42 -0700173 database.Delete()
174 return nil, errors.New(fmt.Sprint("Failed to create/migrate tables: ", err))
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700175 }
176
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800177 return database, nil
178}
179
180func (database *Database) Delete() error {
Philipp Schradereecb8962022-06-01 21:02:42 -0700181 sql, err := database.DB.DB()
Philipp Schrader83fc2722022-03-10 21:59:20 -0800182 if err != nil {
Philipp Schradereecb8962022-06-01 21:02:42 -0700183 return err
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800184 }
Philipp Schradereecb8962022-06-01 21:02:42 -0700185 return sql.Close()
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800186}
187
Philipp Schradereecb8962022-06-01 21:02:42 -0700188func (database *Database) SetDebugLogLevel() {
189 database.DB.Logger = database.DB.Logger.LogMode(logger.Info)
190}
Philipp Schradercd12c952022-04-08 18:58:49 -0700191
Emily Markovabf24c9e2023-02-08 20:31:11 -0800192func (database *Database) AddToMatch(m TeamMatch) error {
Philipp Schradereecb8962022-06-01 21:02:42 -0700193 result := database.Clauses(clause.OnConflict{
194 UpdateAll: true,
195 }).Create(&m)
196 return result.Error
Philipp Schradercd12c952022-04-08 18:58:49 -0700197}
198
Milo Lina72e2002022-04-06 20:31:13 -0700199func (database *Database) AddToShift(sh Shift) error {
Philipp Schradereecb8962022-06-01 21:02:42 -0700200 result := database.Clauses(clause.OnConflict{
201 UpdateAll: true,
202 }).Create(&sh)
203 return result.Error
Milo Lina72e2002022-04-06 20:31:13 -0700204}
205
Sabina Leaver759090b2023-01-14 20:42:56 -0800206func (database *Database) AddAction(a Action) error {
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700207 // TODO(phil): Add check for a corresponding match in the `TeamMatch`
208 // table. Similar to `AddToStats2023()` below.
209 result := database.Create(&a)
Sabina Leaver759090b2023-01-14 20:42:56 -0800210 return result.Error
211}
212
Emily Markovafaecfe12023-07-01 12:40:03 -0700213func (database *Database) AddPitImage(p PitImage) error {
214 result := database.Create(&p)
215 return result.Error
216}
217
Sabina Leaver759090b2023-01-14 20:42:56 -0800218func (database *Database) AddToStats2023(s Stats2023) error {
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700219 if !s.PreScouting {
220 matches, err := database.QueryMatchesString(s.TeamNumber)
221 if err != nil {
222 return err
Sabina Leaver759090b2023-01-14 20:42:56 -0800223 }
Philipp Schrader8fdfadf2023-04-15 16:26:10 -0700224 foundMatch := false
225 for _, match := range matches {
226 if match.MatchNumber == s.MatchNumber {
227 foundMatch = true
228 break
229 }
230 }
231 if !foundMatch {
232 return errors.New(fmt.Sprint(
233 "Failed to find team ", s.TeamNumber,
234 " in match ", s.MatchNumber, " in the schedule."))
235 }
Sabina Leaver759090b2023-01-14 20:42:56 -0800236 }
237
238 result := database.Create(&s)
239 return result.Error
240}
241
Emily Markova8cb91312024-02-02 12:30:37 -0800242func (database *Database) AddToStats2024(s Stats2024) error {
Emily Markova9c18e9c2024-04-03 20:06:27 -0700243 if s.CompType == "Regular" {
Emily Markova8cb91312024-02-02 12:30:37 -0800244 matches, err := database.QueryMatchesString(s.TeamNumber)
245 if err != nil {
246 return err
247 }
248 foundMatch := false
249 for _, match := range matches {
250 if match.MatchNumber == s.MatchNumber {
251 foundMatch = true
252 break
253 }
254 }
255 if !foundMatch {
256 return errors.New(fmt.Sprint(
257 "Failed to find team ", s.TeamNumber,
258 " in match ", s.MatchNumber, " in the schedule."))
259 }
260 }
261
262 result := database.Create(&s)
263 return result.Error
264}
265
Emily Markova6b551e02023-02-18 17:37:40 -0800266func (database *Database) DeleteFromStats(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
267 var stats2023 []Stats2023
268 result := database.
269 Where("comp_level = ? AND match_number = ? AND set_number = ? AND team_number = ?", compLevel_, matchNumber_, setNumber_, teamNumber_).
270 Delete(&stats2023)
271 return result.Error
272}
273
Emily Markova8cb91312024-02-02 12:30:37 -0800274func (database *Database) DeleteFromStats2024(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
275 var stats2024 []Stats2024
276 result := database.
277 Where("comp_level = ? AND match_number = ? AND set_number = ? AND team_number = ?", compLevel_, matchNumber_, setNumber_, teamNumber_).
278 Delete(&stats2024)
279 return result.Error
280}
281
Filip Kujawac1ded372023-05-27 14:33:43 -0700282func (database *Database) DeleteFromActions(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
283 var actions []Action
284 result := database.
285 Where("comp_level = ? AND match_number = ? AND set_number = ? AND team_number = ?", compLevel_, matchNumber_, setNumber_, teamNumber_).
286 Delete(&actions)
287 return result.Error
288}
289
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700290func (database *Database) AddOrUpdateRankings(r Ranking) error {
Philipp Schradereecb8962022-06-01 21:02:42 -0700291 result := database.Clauses(clause.OnConflict{
292 UpdateAll: true,
293 }).Create(&r)
294 return result.Error
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700295}
296
Emily Markovabf24c9e2023-02-08 20:31:11 -0800297func (database *Database) ReturnMatches() ([]TeamMatch, error) {
298 var matches []TeamMatch
Philipp Schradereecb8962022-06-01 21:02:42 -0700299 result := database.Find(&matches)
300 return matches, result.Error
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800301}
302
Filip Kujawaf882e022022-12-14 13:14:08 -0800303func (database *Database) ReturnAllNotes() ([]NotesData, error) {
304 var notes []NotesData
305 result := database.Find(&notes)
306 return notes, result.Error
307}
308
309func (database *Database) ReturnAllDriverRankings() ([]DriverRankingData, error) {
310 var rankings []DriverRankingData
311 result := database.Find(&rankings)
312 return rankings, result.Error
313}
314
Philipp Schradera8955fb2023-03-05 15:47:19 -0800315func (database *Database) ReturnAllParsedDriverRankings() ([]ParsedDriverRankingData, error) {
316 var rankings []ParsedDriverRankingData
317 result := database.Find(&rankings)
318 return rankings, result.Error
319}
320
Milo Lina72e2002022-04-06 20:31:13 -0700321func (database *Database) ReturnAllShifts() ([]Shift, error) {
Philipp Schradereecb8962022-06-01 21:02:42 -0700322 var shifts []Shift
323 result := database.Find(&shifts)
324 return shifts, result.Error
325}
Milo Lina72e2002022-04-06 20:31:13 -0700326
Sabina Leaver759090b2023-01-14 20:42:56 -0800327func (database *Database) ReturnActions() ([]Action, error) {
328 var actions []Action
329 result := database.Find(&actions)
330 return actions, result.Error
331}
332
Emily Markovafaecfe12023-07-01 12:40:03 -0700333func (database *Database) ReturnPitImages() ([]PitImage, error) {
334 var images []PitImage
335 result := database.Find(&images)
336 return images, result.Error
337}
338
Emily Markova6b551e02023-02-18 17:37:40 -0800339func (database *Database) ReturnStats2023() ([]Stats2023, error) {
340 var stats2023 []Stats2023
341 result := database.Find(&stats2023)
342 return stats2023, result.Error
343}
344
Emily Markova8cb91312024-02-02 12:30:37 -0800345func (database *Database) ReturnStats2024() ([]Stats2024, error) {
346 var stats2024 []Stats2024
347 result := database.Find(&stats2024)
348 return stats2024, result.Error
349}
350
Filip Kujawaf3f9def2023-04-20 13:46:46 -0700351func (database *Database) ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]Stats2023, error) {
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800352 var stats2023 []Stats2023
353 result := database.
Filip Kujawaf3f9def2023-04-20 13:46:46 -0700354 Where("team_number = ? AND match_number = ? AND set_number = ? AND comp_level = ? AND pre_scouting = ?",
355 teamNumber, matchNumber, setNumber, compLevel, preScouting).
Philipp Schrader78dc96b2023-03-11 15:23:44 -0800356 Find(&stats2023)
357 return stats2023, result.Error
358}
359
Emily Markova9c18e9c2024-04-03 20:06:27 -0700360func (database *Database) ReturnStats2024ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, compType string) ([]Stats2024, error) {
Emily Markova8cb91312024-02-02 12:30:37 -0800361 var stats2024 []Stats2024
362 result := database.
Emily Markova9c18e9c2024-04-03 20:06:27 -0700363 Where("team_number = ? AND match_number = ? AND set_number = ? AND comp_level = ? AND comp_type = ?",
364 teamNumber, matchNumber, setNumber, compLevel, compType).
Emily Markova8cb91312024-02-02 12:30:37 -0800365 Find(&stats2024)
366 return stats2024, result.Error
367}
368
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700369func (database *Database) ReturnRankings() ([]Ranking, error) {
Philipp Schradereecb8962022-06-01 21:02:42 -0700370 var rankins []Ranking
371 result := database.Find(&rankins)
372 return rankins, result.Error
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700373}
374
Emily Markovab8551572023-03-22 19:49:39 -0700375func (database *Database) queryMatches(teamNumber_ string) ([]TeamMatch, error) {
Emily Markovabf24c9e2023-02-08 20:31:11 -0800376 var matches []TeamMatch
Philipp Schradereecb8962022-06-01 21:02:42 -0700377 result := database.
Emily Markovabf24c9e2023-02-08 20:31:11 -0800378 Where("team_number = $1", teamNumber_).
Philipp Schradereecb8962022-06-01 21:02:42 -0700379 Find(&matches)
380 return matches, result.Error
Sabina Leaverc5fd2772022-01-29 17:00:23 -0800381}
382
Emily Markovafaecfe12023-07-01 12:40:03 -0700383func (database *Database) QueryPitImages(teamNumber_ string) ([]RequestedPitImage, error) {
384 var requestedPitImages []RequestedPitImage
385 result := database.Model(&PitImage{}).
386 Where("team_number = $1", teamNumber_).
387 Find(&requestedPitImages)
388
389 return requestedPitImages, result.Error
390}
391
392func (database *Database) QueryPitImageByChecksum(checksum_ string) (PitImage, error) {
393 var pitImage PitImage
394 result := database.
395 Where("check_sum = $1", checksum_).
396 Find(&pitImage)
397 return pitImage, result.Error
398}
399
400func ComputeSha256FromByteArray(arr []byte) string {
401 sum := sha256.Sum256(arr)
402 return fmt.Sprintf("%x", sum)
403}
404
Emily Markovabf24c9e2023-02-08 20:31:11 -0800405func (database *Database) QueryMatchesString(teamNumber_ string) ([]TeamMatch, error) {
406 var matches []TeamMatch
Sabina Leaver759090b2023-01-14 20:42:56 -0800407 result := database.
Emily Markovabf24c9e2023-02-08 20:31:11 -0800408 Where("team_number = $1", teamNumber_).
Sabina Leaver759090b2023-01-14 20:42:56 -0800409 Find(&matches)
410 return matches, result.Error
411}
412
Milo Lina72e2002022-04-06 20:31:13 -0700413func (database *Database) QueryAllShifts(matchNumber_ int) ([]Shift, error) {
Milo Lina72e2002022-04-06 20:31:13 -0700414 var shifts []Shift
Philipp Schradereecb8962022-06-01 21:02:42 -0700415 result := database.Where("match_number = ?", matchNumber_).Find(&shifts)
416 return shifts, result.Error
Milo Lina72e2002022-04-06 20:31:13 -0700417}
418
Emily Markovae68b7632023-12-30 14:17:55 -0800419func (database *Database) QueryActions(teamNumber_ string) ([]Action, error) {
Sabina Leaver759090b2023-01-14 20:42:56 -0800420 var actions []Action
421 result := database.
422 Where("team_number = ?", teamNumber_).Find(&actions)
423 return actions, result.Error
424}
425
Emily Markovae68b7632023-12-30 14:17:55 -0800426func (database *Database) QueryNotes(TeamNumber string) ([]string, error) {
Philipp Schradereecb8962022-06-01 21:02:42 -0700427 var rawNotes []NotesData
428 result := database.Where("team_number = ?", TeamNumber).Find(&rawNotes)
429 if result.Error != nil {
430 return nil, result.Error
Alex Perry871eab92022-03-12 17:43:52 -0800431 }
Alex Perry871eab92022-03-12 17:43:52 -0800432
Philipp Schradereecb8962022-06-01 21:02:42 -0700433 notes := make([]string, len(rawNotes))
434 for i := range rawNotes {
435 notes[i] = rawNotes[i].Notes
Alex Perry871eab92022-03-12 17:43:52 -0800436 }
Philipp Schradereecb8962022-06-01 21:02:42 -0700437 return notes, nil
Alex Perry871eab92022-03-12 17:43:52 -0800438}
439
Emily Markovae68b7632023-12-30 14:17:55 -0800440func (database *Database) QueryRankings(TeamNumber string) ([]Ranking, error) {
Philipp Schradereecb8962022-06-01 21:02:42 -0700441 var rankins []Ranking
442 result := database.Where("team_number = ?", TeamNumber).Find(&rankins)
443 return rankins, result.Error
Yash Chainanibcd1bb32022-04-02 17:10:24 -0700444}
445
Filip Kujawaf947cb42022-11-21 10:00:30 -0800446func (database *Database) AddNotes(data NotesData) error {
Philipp Schradereecb8962022-06-01 21:02:42 -0700447 result := database.Create(&NotesData{
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800448 TeamNumber: data.TeamNumber,
Emily Markovacf893f42024-03-13 19:03:10 -0700449 MatchNumber: data.MatchNumber,
450 SetNumber: data.SetNumber,
451 CompLevel: data.CompLevel,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800452 Notes: data.Notes,
453 GoodDriving: data.GoodDriving,
454 BadDriving: data.BadDriving,
Filip Kujawa11dc4c92023-04-13 08:55:43 -0700455 SolidPlacing: data.SolidPlacing,
Filip Kujawa7ddd5652023-03-07 19:56:15 -0800456 SketchyPlacing: data.SketchyPlacing,
457 GoodDefense: data.GoodDefense,
458 BadDefense: data.BadDefense,
459 EasilyDefended: data.EasilyDefended,
Emily Markovacf893f42024-03-13 19:03:10 -0700460 NoShow: data.NoShow,
Philipp Schradereecb8962022-06-01 21:02:42 -0700461 })
462 return result.Error
Alex Perry871eab92022-03-12 17:43:52 -0800463}
Filip Kujawa210a03b2022-11-24 14:41:11 -0800464
465func (database *Database) AddDriverRanking(data DriverRankingData) error {
466 result := database.Create(&DriverRankingData{
467 MatchNumber: data.MatchNumber,
468 Rank1: data.Rank1,
469 Rank2: data.Rank2,
470 Rank3: data.Rank3,
471 })
472 return result.Error
473}
474
Philipp Schradera8955fb2023-03-05 15:47:19 -0800475func (database *Database) AddParsedDriverRanking(data ParsedDriverRankingData) error {
476 result := database.Clauses(clause.OnConflict{
477 UpdateAll: true,
478 }).Create(&data)
479 return result.Error
480}
481
Filip Kujawa210a03b2022-11-24 14:41:11 -0800482func (database *Database) QueryDriverRanking(MatchNumber int) ([]DriverRankingData, error) {
483 var data []DriverRankingData
484 result := database.Where("match_number = ?", MatchNumber).Find(&data)
485 return data, result.Error
486}