Loading fix_score_duplicates.go 0 → 100644 +89 −0 Changes for fix_score_duplicates.go: 89 added lines, 0 removed lines. Original line number Diff line number Diff line package main import ( "fmt" "github.com/fatih/color" ) type score struct { id int beatmapMD5 string username string score int maxCombo int mods int playMode int accuracy float64 } func (s score) sameAs(t score) bool { return s.beatmapMD5 == t.beatmapMD5 && s.username == t.username && s.score == t.score && s.maxCombo == t.maxCombo && s.mods == t.mods && s.playMode == t.playMode && s.accuracy == t.accuracy } func opFixScoreDuplicates() { const initQuery = "SELECT id, beatmap_md5, username, score, max_combo, mods, play_mode, accuracy FROM scores WHERE completed = '3'" scores := []score{} rows, err := db.Query(initQuery) if err != nil { queryError(err, initQuery) return } for rows.Next() { currentScore := score{} rows.Scan( ¤tScore.id, ¤tScore.beatmapMD5, ¤tScore.username, ¤tScore.score, ¤tScore.maxCombo, ¤tScore.mods, ¤tScore.playMode, ¤tScore.accuracy, ) scores = append(scores, currentScore) } fmt.Println("> FixScoreDuplicates: Fetched, now finding duplicates...") // duplicate removing remove := []int{} var ops int64 for i := 0; i < len(scores); i++ { if ops%10000 == 0 { fmt.Println("> FixScoreDuplicates:", ops) } if contains(remove, scores[i].id) { continue } for j := i + 1; j < len(scores); j++ { if scores[i].sameAs(scores[j]) && !contains(remove, scores[j].id) { fmt.Println("> FixScoreDuplicates: found one!") remove = append(remove, scores[j].id) } ops++ } } for _, v := range remove { op("DELETE FROM scores WHERE id = ?", v) } color.Green("> FixScoreDuplicates: done!") wg.Done() } func contains(arr []int, i int) bool { for _, v := range arr { if v == i { return true } } return false } Loading
fix_score_duplicates.go 0 → 100644 +89 −0 Changes for fix_score_duplicates.go: 89 added lines, 0 removed lines. Original line number Diff line number Diff line package main import ( "fmt" "github.com/fatih/color" ) type score struct { id int beatmapMD5 string username string score int maxCombo int mods int playMode int accuracy float64 } func (s score) sameAs(t score) bool { return s.beatmapMD5 == t.beatmapMD5 && s.username == t.username && s.score == t.score && s.maxCombo == t.maxCombo && s.mods == t.mods && s.playMode == t.playMode && s.accuracy == t.accuracy } func opFixScoreDuplicates() { const initQuery = "SELECT id, beatmap_md5, username, score, max_combo, mods, play_mode, accuracy FROM scores WHERE completed = '3'" scores := []score{} rows, err := db.Query(initQuery) if err != nil { queryError(err, initQuery) return } for rows.Next() { currentScore := score{} rows.Scan( ¤tScore.id, ¤tScore.beatmapMD5, ¤tScore.username, ¤tScore.score, ¤tScore.maxCombo, ¤tScore.mods, ¤tScore.playMode, ¤tScore.accuracy, ) scores = append(scores, currentScore) } fmt.Println("> FixScoreDuplicates: Fetched, now finding duplicates...") // duplicate removing remove := []int{} var ops int64 for i := 0; i < len(scores); i++ { if ops%10000 == 0 { fmt.Println("> FixScoreDuplicates:", ops) } if contains(remove, scores[i].id) { continue } for j := i + 1; j < len(scores); j++ { if scores[i].sameAs(scores[j]) && !contains(remove, scores[j].id) { fmt.Println("> FixScoreDuplicates: found one!") remove = append(remove, scores[j].id) } ops++ } } for _, v := range remove { op("DELETE FROM scores WHERE id = ?", v) } color.Green("> FixScoreDuplicates: done!") wg.Done() } func contains(arr []int, i int) bool { for _, v := range arr { if v == i { return true } } return false }