From d34321c345df942d2abfadd82f5a6749433fb878 Mon Sep 17 00:00:00 2001 From: Ravi Prasad Date: Wed, 29 Oct 2025 22:49:09 -0500 Subject: [PATCH] line score OT fix --- .DS_Store | Bin 30724 -> 30724 bytes import.go | 30 ++++++++++++++++--------- main.go | 4 ++-- services/box_score_scrape_service.go | 21 ++++++++++++----- services/line_score_scrape_service.go | 31 +++++++++++++++++++------- 5 files changed, 60 insertions(+), 26 deletions(-) diff --git a/.DS_Store b/.DS_Store index 146dc2ba2b5a69be25b9817d5376e4ad50ac1016..0960bde4d9f16d29c3944c364bb692e1a38ab772 100644 GIT binary patch delta 56 zcmZqqz}WJEaYMQu2$f4!N@K!Sg= Mvi^(BTn@j?0WP2uD*ylh delta 63 zcmZqqz}WJEaYMS^WM*rj$(4Eu;u6)>hQ`J^3Z@pOwK@vbmPQ6T3MOVIlY6X 1 { + staggerAmount := time.Duration(int64(baseDelay) / int64(numWorkers)) + initialDelay := time.Duration(id-1) * staggerAmount + log.Printf("Worker %d: Staggering start with an initial delay of %v", id, initialDelay) + time.Sleep(initialDelay) + } + for game := range jobs { log.Printf("Worker %d: Processing game %s", id, game.GameID) fullURL := boxScoreURLBase + game.BoxScoreURL @@ -228,9 +239,9 @@ func parseLineScore(doc *goquery.Document, gameID string) []models.LineScore { Q2: mustAtoi(row.Find(`td[data-stat="2"]`).Text()), Q3: mustAtoi(row.Find(`td[data-stat="3"]`).Text()), Q4: mustAtoi(row.Find(`td[data-stat="4"]`).Text()), - OT1: mustAtoi(row.Find(`td[data-stat="OT1"]`).Text()), - OT2: mustAtoi(row.Find(`td[data-stat="OT2"]`).Text()), - OT3: mustAtoi(row.Find(`td[data-stat="OT3"]`).Text()), + OT1: mustAtoi(row.Find(`td[data-stat="1OT"]`).Text()), + OT2: mustAtoi(row.Find(`td[data-stat="2OT"]`).Text()), + OT3: mustAtoi(row.Find(`td[data-stat="3OT"]`).Text()), Total: mustAtoi(row.Find(`td[data-stat="T"]`).Text()), }) }) diff --git a/services/line_score_scrape_service.go b/services/line_score_scrape_service.go index 7f6f4a4..0d5b35c 100644 --- a/services/line_score_scrape_service.go +++ b/services/line_score_scrape_service.go @@ -25,14 +25,22 @@ func FetchAndStoreLineScore(db *gorm.DB, doc *goquery.Document, gameID string) e GameID: gameID, Team: teamName, } + + // Regular Quarters - no changes here ls.Q1 = mustAtoi(row.Find(`td[data-stat="1"]`).Text()) ls.Q2 = mustAtoi(row.Find(`td[data-stat="2"]`).Text()) ls.Q3 = mustAtoi(row.Find(`td[data-stat="3"]`).Text()) ls.Q4 = mustAtoi(row.Find(`td[data-stat="4"]`).Text()) - ls.OT1 = mustAtoi(row.Find(`td[data-stat="OT1"]`).Text()) - ls.OT2 = mustAtoi(row.Find(`td[data-stat="OT2"]`).Text()) - ls.OT3 = mustAtoi(row.Find(`td[data-stat="OT3"]`).Text()) + + // --- FIX: Corrected selectors for Overtime periods --- + // The HTML uses "1OT", "2OT", etc., not "OT1", "OT2". + ls.OT1 = mustAtoi(row.Find(`td[data-stat="1OT"]`).Text()) + ls.OT2 = mustAtoi(row.Find(`td[data-stat="2OT"]`).Text()) + ls.OT3 = mustAtoi(row.Find(`td[data-stat="3OT"]`).Text()) + + // Total score ls.Total = mustAtoi(row.Find(`td[data-stat="T"]`).Text()) + lineScores = append(lineScores, ls) }) @@ -42,13 +50,20 @@ func FetchAndStoreLineScore(db *gorm.DB, doc *goquery.Document, gameID string) e } // Upsert the data into the database. - if err := db.Clauses(clause.OnConflict{ - Columns: []clause.Column{{Name: "game_id"}, {Name: "team"}}, - DoUpdates: clause.AssignmentColumns([]string{"q1", "q2", "q3", "q4", "ot1", "ot2", "ot3", "total"}), - }).Create(&lineScores).Error; err != nil { + // Using a transaction is a good practice for atomicity. + err := db.Transaction(func(tx *gorm.DB) error { + return tx.Clauses(clause.OnConflict{ + Columns: []clause.Column{{Name: "game_id"}, {Name: "team"}}, + DoUpdates: clause.AssignmentColumns([]string{"q1", "q2", "q3", "q4", "ot1", "ot2", "ot3", "total"}), + }).Create(&lineScores).Error + }) + + if err != nil { + log.Printf("Error upserting line scores for game %s: %v", gameID, err) return err } log.Printf("Successfully processed line scores for game %s.", gameID) return nil -} \ No newline at end of file +} +