Delete Stats object and replace with Stats2023
Deleting the stats object in the database and any functions/files that are using it and replacing it with Stats2023 in the view tab.
Signed-off-by: Emily Markova <emily.markova@gmail.com>
Change-Id: I76f5ad9e3f5d4a6ede60266fdc179e21013d6093
diff --git a/scouting/db/db.go b/scouting/db/db.go
index 3791596..98d8d71 100644
--- a/scouting/db/db.go
+++ b/scouting/db/db.go
@@ -7,7 +7,6 @@
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/logger"
- "strconv"
)
type Database struct {
@@ -28,44 +27,6 @@
R1scouter, R2scouter, R3scouter, B1scouter, B2scouter, B3scouter string
}
-type Stats struct {
- TeamNumber int32 `gorm:"primaryKey"`
- MatchNumber int32 `gorm:"primaryKey"`
- SetNumber int32 `gorm:"primaryKey"`
- CompLevel string `gorm:"primaryKey"`
- StartingQuadrant int32
- // This field is for the balls picked up during auto. Use this field
- // when using this library. Ignore the AutoBallPickedUpX fields below.
- AutoBallPickedUp [5]bool `gorm:"-:all"`
- // These fields are internal implementation details. Do not use these.
- // TODO(phil): Figure out how to use the JSON gorm serializer instead
- // of manually serializing/deserializing these.
- AutoBallPickedUp1 bool
- AutoBallPickedUp2 bool
- AutoBallPickedUp3 bool
- AutoBallPickedUp4 bool
- AutoBallPickedUp5 bool
- // TODO(phil): Re-order auto and teleop fields so auto comes first.
- ShotsMissed, UpperGoalShots, LowerGoalShots int32
- ShotsMissedAuto, UpperGoalAuto, LowerGoalAuto int32
- PlayedDefense, DefenseReceivedScore int32
- // Climbing level:
- // 0 -> "NoAttempt"
- // 1 -> "Failed"
- // 2 -> "FailedWithPlentyOfTime"
- // 3 -> "Low"
- // 4 -> "Medium"
- // 5 -> "High"
- // 6 -> "Traversal"
- Climbing int32
- // Some non-numerical data that the scout felt worth noting.
- Comment string
- // The username of the person who collected these statistics.
- // "unknown" if submitted without logging in.
- // Empty if the stats have not yet been collected.
- CollectedBy string
-}
-
type Stats2023 struct {
TeamNumber string `gorm:"primaryKey"`
MatchNumber int32 `gorm:"primaryKey"`
@@ -155,7 +116,7 @@
return nil, errors.New(fmt.Sprint("Failed to connect to postgres: ", err))
}
- err = database.AutoMigrate(&TeamMatch{}, &Shift{}, &Stats{}, &Stats2023{}, &Action{}, &NotesData{}, &Ranking{}, &DriverRankingData{}, &ParsedDriverRankingData{})
+ err = database.AutoMigrate(&TeamMatch{}, &Shift{}, &Stats2023{}, &Action{}, &NotesData{}, &Ranking{}, &DriverRankingData{}, &ParsedDriverRankingData{})
if err != nil {
database.Delete()
return nil, errors.New(fmt.Sprint("Failed to create/migrate tables: ", err))
@@ -197,34 +158,6 @@
return result.Error
}
-func (database *Database) AddToStats(s Stats) error {
- matches, err := database.queryMatches(strconv.Itoa(int(s.TeamNumber)))
- if err != nil {
- return err
- }
- foundMatch := false
- for _, match := range matches {
- if match.MatchNumber == s.MatchNumber {
- foundMatch = true
- break
- }
- }
- if !foundMatch {
- return errors.New(fmt.Sprint(
- "Failed to find team ", s.TeamNumber,
- " in match ", s.MatchNumber, " in the schedule."))
- }
-
- // Unpack the auto balls array.
- s.AutoBallPickedUp1 = s.AutoBallPickedUp[0]
- s.AutoBallPickedUp2 = s.AutoBallPickedUp[1]
- s.AutoBallPickedUp3 = s.AutoBallPickedUp[2]
- s.AutoBallPickedUp4 = s.AutoBallPickedUp[3]
- s.AutoBallPickedUp5 = s.AutoBallPickedUp[4]
- result := database.Create(&s)
- return result.Error
-}
-
func (database *Database) AddToStats2023(s Stats2023) error {
matches, err := database.QueryMatchesString(s.TeamNumber)
if err != nil {
@@ -298,34 +231,6 @@
return actions, result.Error
}
-// Packs the stats. This really just consists of taking the individual auto
-// ball booleans and turning them into an array. The individual booleans are
-// cleared so that they don't affect struct comparisons.
-func packStats(stats *Stats) {
- stats.AutoBallPickedUp = [5]bool{
- stats.AutoBallPickedUp1,
- stats.AutoBallPickedUp2,
- stats.AutoBallPickedUp3,
- stats.AutoBallPickedUp4,
- stats.AutoBallPickedUp5,
- }
- stats.AutoBallPickedUp1 = false
- stats.AutoBallPickedUp2 = false
- stats.AutoBallPickedUp3 = false
- stats.AutoBallPickedUp4 = false
- stats.AutoBallPickedUp5 = false
-}
-
-func (database *Database) ReturnStats() ([]Stats, error) {
- var stats []Stats
- result := database.Find(&stats)
- // Pack the auto balls array.
- for i := range stats {
- packStats(&stats[i])
- }
- return stats, result.Error
-}
-
func (database *Database) ReturnStats2023() ([]Stats2023, error) {
var stats2023 []Stats2023
result := database.Find(&stats2023)
@@ -369,16 +274,6 @@
return shifts, result.Error
}
-func (database *Database) QueryStats(teamNumber_ int) ([]Stats, error) {
- var stats []Stats
- result := database.Where("team_number = ?", teamNumber_).Find(&stats)
- // Pack the auto balls array.
- for i := range stats {
- packStats(&stats[i])
- }
- return stats, result.Error
-}
-
func (database *Database) QueryActions(teamNumber_ int) ([]Action, error) {
var actions []Action
result := database.
diff --git a/scouting/db/db_test.go b/scouting/db/db_test.go
index 72c5f86..bd2bb68 100644
--- a/scouting/db/db_test.go
+++ b/scouting/db/db_test.go
@@ -6,7 +6,6 @@
"os"
"os/exec"
"reflect"
- "strings"
"testing"
"time"
@@ -139,99 +138,6 @@
}
}
-func TestAddToStatsDB(t *testing.T) {
- fixture := createDatabase(t)
- defer fixture.TearDown()
-
- correct := []Stats{
- Stats{
- TeamNumber: 1236, MatchNumber: 7,
- StartingQuadrant: 2,
- AutoBallPickedUp: [5]bool{false, false, false, true, false},
- ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
- ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
- PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
- Comment: "this is a comment", CollectedBy: "josh",
- },
- Stats{
- TeamNumber: 1001, MatchNumber: 7,
- StartingQuadrant: 3,
- AutoBallPickedUp: [5]bool{true, false, true, true, false},
- ShotsMissed: 6, UpperGoalShots: 9, LowerGoalShots: 9,
- ShotsMissedAuto: 0, UpperGoalAuto: 0, LowerGoalAuto: 0,
- PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
- Comment: "another comment", CollectedBy: "rupert",
- },
- Stats{
- TeamNumber: 777, MatchNumber: 7,
- StartingQuadrant: 4,
- AutoBallPickedUp: [5]bool{false, true, true, true, false},
- ShotsMissed: 5, UpperGoalShots: 7, LowerGoalShots: 12,
- ShotsMissedAuto: 0, UpperGoalAuto: 4, LowerGoalAuto: 0,
- PlayedDefense: 0, DefenseReceivedScore: 3, Climbing: 0,
- Comment: "and another", CollectedBy: "felix",
- },
- Stats{
- TeamNumber: 1000, MatchNumber: 7,
- StartingQuadrant: 1,
- AutoBallPickedUp: [5]bool{false, false, false, false, false},
- ShotsMissed: 12, UpperGoalShots: 6, LowerGoalShots: 10,
- ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
- PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
- Comment: "and another one", CollectedBy: "thea",
- },
- Stats{
- TeamNumber: 4321, MatchNumber: 7,
- StartingQuadrant: 2,
- AutoBallPickedUp: [5]bool{true, false, false, false, false},
- ShotsMissed: 14, UpperGoalShots: 12, LowerGoalShots: 3,
- ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
- PlayedDefense: 0, DefenseReceivedScore: 0, Climbing: 0,
- Comment: "more comment", CollectedBy: "amy",
- },
- Stats{
- TeamNumber: 1234, MatchNumber: 7,
- StartingQuadrant: 3,
- AutoBallPickedUp: [5]bool{false, false, false, false, true},
- ShotsMissed: 3, UpperGoalShots: 4, LowerGoalShots: 0,
- ShotsMissedAuto: 0, UpperGoalAuto: 9, LowerGoalAuto: 0,
- PlayedDefense: 0, DefenseReceivedScore: 5, Climbing: 0,
- Comment: "final comment", CollectedBy: "beth",
- },
- }
- matches := []TeamMatch{
- TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
- Alliance: "R", AlliancePosition: 1, TeamNumber: "1236"},
- TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
- Alliance: "R", AlliancePosition: 2, TeamNumber: "1001"},
- TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
- Alliance: "R", AlliancePosition: 3, TeamNumber: "777"},
- TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
- Alliance: "B", AlliancePosition: 1, TeamNumber: "1000"},
- TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
- Alliance: "B", AlliancePosition: 2, TeamNumber: "4321"},
- TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
- Alliance: "B", AlliancePosition: 3, TeamNumber: "1234"},
- }
-
- for _, match := range matches {
- err := fixture.db.AddToMatch(match)
- check(t, err, "Failed to add match")
- }
-
- for i := 0; i < len(correct); i++ {
- err := fixture.db.AddToStats(correct[i])
- check(t, err, "Failed to add stats to DB")
- }
-
- got, err := fixture.db.ReturnStats()
- check(t, err, "Failed ReturnStats()")
-
- if !reflect.DeepEqual(correct, got) {
- t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
- }
-}
-
func TestAddToStats2023DB(t *testing.T) {
fixture := createDatabase(t)
defer fixture.TearDown()
@@ -403,55 +309,6 @@
}
}
-func TestAddDuplicateStats(t *testing.T) {
- fixture := createDatabase(t)
- defer fixture.TearDown()
-
- stats := Stats{
- TeamNumber: 1236, MatchNumber: 7,
- SetNumber: 1, CompLevel: "qual",
- StartingQuadrant: 2,
- AutoBallPickedUp: [5]bool{false, false, false, true, false},
- ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
- ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
- PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
- Comment: "this is a comment", CollectedBy: "josh",
- }
-
- matches := []TeamMatch{
- TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
- Alliance: "R", AlliancePosition: 1, TeamNumber: "1236"},
- TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
- Alliance: "R", AlliancePosition: 2, TeamNumber: "1001"},
- TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
- Alliance: "R", AlliancePosition: 3, TeamNumber: "777"},
- TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
- Alliance: "B", AlliancePosition: 1, TeamNumber: "1000"},
- TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
- Alliance: "B", AlliancePosition: 2, TeamNumber: "4321"},
- TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
- Alliance: "B", AlliancePosition: 3, TeamNumber: "1234"},
- }
-
- for _, match := range matches {
- err := fixture.db.AddToMatch(match)
- check(t, err, "Failed to add match")
- }
-
- // Add stats. This should succeed.
- err := fixture.db.AddToStats(stats)
- check(t, err, "Failed to add stats to DB")
-
- // Try again. It should fail this time.
- err = fixture.db.AddToStats(stats)
- if err == nil {
- t.Fatal("Failed to get error when adding duplicate stats.")
- }
- if !strings.Contains(err.Error(), "ERROR: duplicate key value violates unique constraint") {
- t.Fatal("Expected error message to be complain about duplicate key value, but got ", err)
- }
-}
-
func TestDeleteFromStats(t *testing.T) {
fixture := createDatabase(t)
defer fixture.TearDown()
@@ -621,104 +478,6 @@
}
}
-func TestQueryStatsDB(t *testing.T) {
- fixture := createDatabase(t)
- defer fixture.TearDown()
-
- testDatabase := []Stats{
- Stats{
- TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
- StartingQuadrant: 1,
- AutoBallPickedUp: [5]bool{false, false, false, false, false},
- ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
- ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
- PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2},
- Stats{
- TeamNumber: 1234, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
- StartingQuadrant: 2,
- AutoBallPickedUp: [5]bool{false, false, false, false, true},
- ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
- ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
- PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
- },
- Stats{
- TeamNumber: 1233, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
- StartingQuadrant: 3,
- AutoBallPickedUp: [5]bool{false, false, false, false, false},
- ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
- ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
- PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
- },
- Stats{
- TeamNumber: 1232, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
- StartingQuadrant: 2,
- AutoBallPickedUp: [5]bool{true, false, false, false, true},
- ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
- ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
- PlayedDefense: 7, DefenseReceivedScore: 2, Climbing: 1,
- },
- Stats{
- TeamNumber: 1231, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
- StartingQuadrant: 3,
- AutoBallPickedUp: [5]bool{false, false, true, false, false},
- ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
- ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
- PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 1,
- },
- Stats{
- TeamNumber: 1239, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
- StartingQuadrant: 4,
- AutoBallPickedUp: [5]bool{false, true, true, false, false},
- ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
- ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
- PlayedDefense: 7, DefenseReceivedScore: 5, Climbing: 1,
- },
- }
-
- matches := []TeamMatch{
- TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
- Alliance: "R", AlliancePosition: 1, TeamNumber: "1235"},
- TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
- Alliance: "R", AlliancePosition: 2, TeamNumber: "1234"},
- TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
- Alliance: "R", AlliancePosition: 3, TeamNumber: "1233"},
- TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
- Alliance: "B", AlliancePosition: 1, TeamNumber: "1232"},
- TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
- Alliance: "B", AlliancePosition: 2, TeamNumber: "1231"},
- TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
- Alliance: "B", AlliancePosition: 3, TeamNumber: "1239"},
- }
-
- for _, match := range matches {
- err := fixture.db.AddToMatch(match)
- check(t, err, "Failed to add match")
- }
-
- for i := 0; i < len(testDatabase); i++ {
- err := fixture.db.AddToStats(testDatabase[i])
- check(t, err, fmt.Sprint("Failed to add stats ", i))
- }
-
- correct := []Stats{
- Stats{
- TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
- StartingQuadrant: 1,
- AutoBallPickedUp: [5]bool{false, false, false, false, false},
- ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
- ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
- PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2,
- },
- }
-
- got, err := fixture.db.QueryStats(1235)
- check(t, err, "Failed QueryStats()")
-
- if !reflect.DeepEqual(correct, got) {
- t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
- }
-}
-
func TestQueryRankingsDB(t *testing.T) {
fixture := createDatabase(t)
defer fixture.TearDown()
@@ -898,93 +657,6 @@
}
}
-func TestReturnStatsDB(t *testing.T) {
- fixture := createDatabase(t)
- defer fixture.TearDown()
-
- correct := []Stats{
- Stats{
- TeamNumber: 1235, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
- StartingQuadrant: 1,
- AutoBallPickedUp: [5]bool{false, false, false, false, false},
- ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
- ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
- PlayedDefense: 2, DefenseReceivedScore: 3, Climbing: 2},
- Stats{
- TeamNumber: 1236, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
- StartingQuadrant: 2,
- AutoBallPickedUp: [5]bool{false, false, false, false, true},
- ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
- ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
- PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
- },
- Stats{
- TeamNumber: 1237, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
- StartingQuadrant: 3,
- AutoBallPickedUp: [5]bool{false, false, false, false, false},
- ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
- ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
- PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
- },
- Stats{
- TeamNumber: 1238, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
- StartingQuadrant: 2,
- AutoBallPickedUp: [5]bool{true, false, false, false, true},
- ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
- ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
- PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
- },
- Stats{
- TeamNumber: 1239, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
- StartingQuadrant: 3,
- AutoBallPickedUp: [5]bool{false, false, true, false, false},
- ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
- ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
- PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
- },
- Stats{
- TeamNumber: 1233, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
- StartingQuadrant: 4,
- AutoBallPickedUp: [5]bool{false, true, true, false, false},
- ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
- ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
- PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 1,
- },
- }
-
- matches := []TeamMatch{
- TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
- Alliance: "R", AlliancePosition: 1, TeamNumber: "1235"},
- TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
- Alliance: "R", AlliancePosition: 2, TeamNumber: "1236"},
- TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
- Alliance: "R", AlliancePosition: 3, TeamNumber: "1237"},
- TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
- Alliance: "B", AlliancePosition: 1, TeamNumber: "1238"},
- TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
- Alliance: "B", AlliancePosition: 2, TeamNumber: "1239"},
- TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
- Alliance: "B", AlliancePosition: 3, TeamNumber: "1233"},
- }
-
- for _, match := range matches {
- err := fixture.db.AddToMatch(match)
- check(t, err, "Failed to add match")
- }
-
- for i := 0; i < len(correct); i++ {
- err := fixture.db.AddToStats(correct[i])
- check(t, err, fmt.Sprint("Failed to add stats ", i))
- }
-
- got, err := fixture.db.ReturnStats()
- check(t, err, "Failed ReturnStats()")
-
- if !reflect.DeepEqual(correct, got) {
- t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
- }
-}
-
func TestReturnStats2023DB(t *testing.T) {
fixture := createDatabase(t)
defer fixture.TearDown()