hockey-blast-common-lib 0.1.62__py3-none-any.whl → 0.1.64__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. hockey_blast_common_lib/aggregate_all_stats.py +7 -4
  2. hockey_blast_common_lib/aggregate_goalie_stats.py +303 -113
  3. hockey_blast_common_lib/aggregate_h2h_stats.py +64 -33
  4. hockey_blast_common_lib/aggregate_human_stats.py +566 -281
  5. hockey_blast_common_lib/aggregate_referee_stats.py +287 -145
  6. hockey_blast_common_lib/aggregate_s2s_stats.py +85 -25
  7. hockey_blast_common_lib/aggregate_scorekeeper_stats.py +231 -119
  8. hockey_blast_common_lib/aggregate_skater_stats.py +595 -240
  9. hockey_blast_common_lib/assign_skater_skill.py +21 -11
  10. hockey_blast_common_lib/db_connection.py +59 -8
  11. hockey_blast_common_lib/embedding_utils.py +309 -0
  12. hockey_blast_common_lib/h2h_models.py +150 -56
  13. hockey_blast_common_lib/hockey_blast_sample_backup.sql.gz +0 -0
  14. hockey_blast_common_lib/models.py +305 -149
  15. hockey_blast_common_lib/options.py +30 -15
  16. hockey_blast_common_lib/progress_utils.py +21 -13
  17. hockey_blast_common_lib/skills_in_divisions.py +170 -33
  18. hockey_blast_common_lib/skills_propagation.py +164 -70
  19. hockey_blast_common_lib/stats_models.py +489 -245
  20. hockey_blast_common_lib/stats_utils.py +6 -3
  21. hockey_blast_common_lib/utils.py +89 -25
  22. hockey_blast_common_lib/wsgi.py +7 -5
  23. {hockey_blast_common_lib-0.1.62.dist-info → hockey_blast_common_lib-0.1.64.dist-info}/METADATA +1 -1
  24. hockey_blast_common_lib-0.1.64.dist-info/RECORD +29 -0
  25. hockey_blast_common_lib-0.1.62.dist-info/RECORD +0 -28
  26. {hockey_blast_common_lib-0.1.62.dist-info → hockey_blast_common_lib-0.1.64.dist-info}/WHEEL +0 -0
  27. {hockey_blast_common_lib-0.1.62.dist-info → hockey_blast_common_lib-0.1.64.dist-info}/top_level.txt +0 -0
@@ -2,48 +2,65 @@ from flask_sqlalchemy import SQLAlchemy
2
2
 
3
3
  db = SQLAlchemy()
4
4
 
5
+
5
6
  # DEPRECATED - comments
6
7
  class Comment(db.Model):
7
- __tablename__ = 'comments'
8
+ __tablename__ = "comments"
8
9
  id = db.Column(db.Integer, primary_key=True)
9
- game_id = db.Column(db.Integer, db.ForeignKey('games.id'))
10
+ game_id = db.Column(db.Integer, db.ForeignKey("games.id"))
10
11
  comment_text = db.Column(db.Text)
11
12
  __table_args__ = (
12
- db.UniqueConstraint('game_id', 'comment_text', name='unique_game_comment'),
13
+ db.UniqueConstraint("game_id", "comment_text", name="unique_game_comment"),
13
14
  )
14
15
 
16
+
15
17
  class Division(db.Model):
16
- __tablename__ = 'divisions'
18
+ __tablename__ = "divisions"
17
19
  id = db.Column(db.Integer, primary_key=True)
18
- league_number = db.Column(db.Integer) # TODO: Deprecate usage and remove (get this info through Season->League)
19
- season_number = db.Column(db.Integer) # TODO: Deprecate usage and remove (get this info from Season by season_id)
20
- season_id = db.Column(db.Integer, db.ForeignKey('seasons.id'))
21
- level = db.Column(db.String(100)) # Used to display original level name, however level_id may combine some levels with different name!
22
- level_id = db.Column(db.Integer, db.ForeignKey('levels.id')) # New field
23
- org_id = db.Column(db.Integer, db.ForeignKey('organizations.id'), nullable=False)
20
+ league_number = db.Column(
21
+ db.Integer
22
+ ) # TODO: Deprecate usage and remove (get this info through Season->League)
23
+ season_number = db.Column(
24
+ db.Integer
25
+ ) # TODO: Deprecate usage and remove (get this info from Season by season_id)
26
+ season_id = db.Column(db.Integer, db.ForeignKey("seasons.id"))
27
+ level = db.Column(
28
+ db.String(100)
29
+ ) # Used to display original level name, however level_id may combine some levels with different name!
30
+ level_id = db.Column(db.Integer, db.ForeignKey("levels.id")) # New field
31
+ org_id = db.Column(db.Integer, db.ForeignKey("organizations.id"), nullable=False)
24
32
  __table_args__ = (
25
- db.UniqueConstraint('org_id', 'league_number', 'season_number', 'level', name='_org_league_season_level_uc'),
33
+ db.UniqueConstraint(
34
+ "org_id",
35
+ "league_number",
36
+ "season_number",
37
+ "level",
38
+ name="_org_league_season_level_uc",
39
+ ),
26
40
  )
27
41
 
42
+
28
43
  class Game(db.Model):
29
- __tablename__ = 'games'
44
+ __tablename__ = "games"
30
45
  id = db.Column(db.Integer, primary_key=True)
31
- status = db.Column(db.String(255), nullable=False, default='')
32
- last_update_ts = db.Column(db.DateTime, nullable=False, default=db.func.current_timestamp())
33
- division_id = db.Column(db.Integer, db.ForeignKey('divisions.id'))
46
+ status = db.Column(db.String(255), nullable=False, default="")
47
+ last_update_ts = db.Column(
48
+ db.DateTime, nullable=False, default=db.func.current_timestamp()
49
+ )
50
+ division_id = db.Column(db.Integer, db.ForeignKey("divisions.id"))
34
51
  game_number = db.Column(db.Integer)
35
52
  date = db.Column(db.Date)
36
53
  time = db.Column(db.Time)
37
54
  day_of_week = db.Column(db.Integer) # 1 to 7 for Monday to Sunday
38
55
  period_length = db.Column(db.Integer) # In minutes
39
56
  location = db.Column(db.String(100))
40
- scorekeeper_id = db.Column(db.Integer, db.ForeignKey('humans.id'))
41
- referee_1_id = db.Column(db.Integer, db.ForeignKey('humans.id'))
42
- referee_2_id = db.Column(db.Integer, db.ForeignKey('humans.id'))
43
- home_goalie_id = db.Column(db.Integer, db.ForeignKey('humans.id'))
44
- visitor_goalie_id = db.Column(db.Integer, db.ForeignKey('humans.id'))
45
- visitor_team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
46
- home_team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
57
+ scorekeeper_id = db.Column(db.Integer, db.ForeignKey("humans.id"))
58
+ referee_1_id = db.Column(db.Integer, db.ForeignKey("humans.id"))
59
+ referee_2_id = db.Column(db.Integer, db.ForeignKey("humans.id"))
60
+ home_goalie_id = db.Column(db.Integer, db.ForeignKey("humans.id"))
61
+ visitor_goalie_id = db.Column(db.Integer, db.ForeignKey("humans.id"))
62
+ visitor_team_id = db.Column(db.Integer, db.ForeignKey("teams.id"))
63
+ home_team_id = db.Column(db.Integer, db.ForeignKey("teams.id"))
47
64
  visitor_final_score = db.Column(db.Integer)
48
65
  visitor_period_1_score = db.Column(db.Integer)
49
66
  visitor_period_2_score = db.Column(db.Integer)
@@ -66,62 +83,89 @@ class Game(db.Model):
66
83
  visitor_period_3_shots = db.Column(db.Integer)
67
84
  visitor_ot_shots = db.Column(db.Integer, default=0)
68
85
  visitor_so_shots = db.Column(db.Integer, default=0)
69
- org_id = db.Column(db.Integer, db.ForeignKey('organizations.id'), nullable=False)
86
+ org_id = db.Column(db.Integer, db.ForeignKey("organizations.id"), nullable=False)
70
87
  __table_args__ = (
71
- db.UniqueConstraint('org_id', 'game_number', name='_org_game_number_uc'),
88
+ db.UniqueConstraint("org_id", "game_number", name="_org_game_number_uc"),
72
89
  )
73
90
 
91
+
74
92
  class GameRoster(db.Model):
75
- __tablename__ = 'game_rosters'
93
+ __tablename__ = "game_rosters"
76
94
  id = db.Column(db.Integer, primary_key=True)
77
- game_id = db.Column(db.Integer, db.ForeignKey('games.id'))
78
- team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
79
- human_id = db.Column(db.Integer, db.ForeignKey('humans.id'))
80
- role = db.Column(db.String(10)) # e.g., G (goalie), C (captain), A (alternate), S (substitute)
95
+ game_id = db.Column(db.Integer, db.ForeignKey("games.id"))
96
+ team_id = db.Column(db.Integer, db.ForeignKey("teams.id"))
97
+ human_id = db.Column(db.Integer, db.ForeignKey("humans.id"))
98
+ role = db.Column(
99
+ db.String(10)
100
+ ) # e.g., G (goalie), C (captain), A (alternate), S (substitute)
81
101
  jersey_number = db.Column(db.String(10)) # Player's jersey number
82
102
  __table_args__ = (
83
- db.UniqueConstraint('game_id', 'team_id', 'human_id', name='_game_team_human_uc'),
103
+ db.UniqueConstraint(
104
+ "game_id", "team_id", "human_id", name="_game_team_human_uc"
105
+ ),
84
106
  )
85
107
 
108
+
86
109
  class Goal(db.Model):
87
- __tablename__ = 'goals'
110
+ __tablename__ = "goals"
88
111
  id = db.Column(db.Integer, primary_key=True)
89
- game_id = db.Column(db.Integer, db.ForeignKey('games.id'))
90
- scoring_team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
91
- opposing_team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
112
+ game_id = db.Column(db.Integer, db.ForeignKey("games.id"))
113
+ scoring_team_id = db.Column(db.Integer, db.ForeignKey("teams.id"))
114
+ opposing_team_id = db.Column(db.Integer, db.ForeignKey("teams.id"))
92
115
  period = db.Column(db.String(10)) # Can be "1", "2", "3", "OT", "SO"
93
- time = db.Column(db.String(10)) # For elapsed time format
94
- goal_scorer_id = db.Column(db.Integer, db.ForeignKey('humans.id'))
95
- assist_1_id = db.Column(db.Integer, db.ForeignKey('humans.id'))
96
- assist_2_id = db.Column(db.Integer, db.ForeignKey('humans.id'))
97
- goalie_id = db.Column(db.Integer, db.ForeignKey('humans.id'), nullable=True) # Goalie who allowed the goal (can be "Empty Net" special human)
98
- special_condition = db.Column(db.String(50)) # e.g., PP (power play), SH (short-handed)
116
+ time = db.Column(db.String(10)) # For elapsed time format
117
+ goal_scorer_id = db.Column(db.Integer, db.ForeignKey("humans.id"))
118
+ assist_1_id = db.Column(db.Integer, db.ForeignKey("humans.id"))
119
+ assist_2_id = db.Column(db.Integer, db.ForeignKey("humans.id"))
120
+ goalie_id = db.Column(
121
+ db.Integer, db.ForeignKey("humans.id"), nullable=True
122
+ ) # Goalie who allowed the goal (can be "Empty Net" special human)
123
+ special_condition = db.Column(
124
+ db.String(50)
125
+ ) # e.g., PP (power play), SH (short-handed)
99
126
  sequence_number = db.Column(db.Integer)
100
127
  __table_args__ = (
101
- db.UniqueConstraint('game_id', 'scoring_team_id', 'sequence_number', name='_goal_team_sequence_uc'),
128
+ db.UniqueConstraint(
129
+ "game_id",
130
+ "scoring_team_id",
131
+ "sequence_number",
132
+ name="_goal_team_sequence_uc",
133
+ ),
134
+ db.UniqueConstraint(
135
+ "game_id",
136
+ "period",
137
+ "time",
138
+ "goal_scorer_id",
139
+ "scoring_team_id",
140
+ name="uq_goals_no_duplicates",
141
+ ),
102
142
  )
103
143
 
144
+
104
145
  class Human(db.Model):
105
- __tablename__ = 'humans'
146
+ __tablename__ = "humans"
106
147
  id = db.Column(db.Integer, primary_key=True)
107
148
  # All name components now declared non-nullable at the ORM level. Ensure data cleanup
108
149
  # (convert existing NULLs to '') BEFORE applying a DB migration that enforces NOT NULL.
109
150
  # middle_name and suffix may be logically "empty" but must not be NULL; use '' for absence.
110
- first_name = db.Column(db.String(100), nullable=False, default='')
111
- middle_name = db.Column(db.String(100), nullable=False, default='')
112
- last_name = db.Column(db.String(100), nullable=False, default='')
113
- suffix = db.Column(db.String(100), nullable=False, default='')
151
+ first_name = db.Column(db.String(100), nullable=False, default="")
152
+ middle_name = db.Column(db.String(100), nullable=False, default="")
153
+ last_name = db.Column(db.String(100), nullable=False, default="")
154
+ suffix = db.Column(db.String(100), nullable=False, default="")
114
155
  first_date = db.Column(db.Date)
115
156
  last_date = db.Column(db.Date)
116
157
  skater_skill_value = db.Column(db.Float, nullable=True)
117
158
  __table_args__ = (
118
- db.UniqueConstraint('first_name', 'middle_name', 'last_name', 'suffix', name='_human_name_uc'),
159
+ db.UniqueConstraint(
160
+ "first_name", "middle_name", "last_name", "suffix", name="_human_name_uc"
161
+ ),
119
162
  )
120
163
 
164
+
121
165
  class HumanAlias(db.Model):
122
- __tablename__ = 'human_aliases'
166
+ __tablename__ = "human_aliases"
123
167
  id = db.Column(db.Integer, primary_key=True)
124
- human_id = db.Column(db.Integer, db.ForeignKey('humans.id'))
168
+ human_id = db.Column(db.Integer, db.ForeignKey("humans.id"))
125
169
  first_name = db.Column(db.String(100))
126
170
  middle_name = db.Column(db.String(100))
127
171
  last_name = db.Column(db.String(100))
@@ -129,67 +173,88 @@ class HumanAlias(db.Model):
129
173
  first_date = db.Column(db.Date)
130
174
  last_date = db.Column(db.Date)
131
175
  __table_args__ = (
132
- db.UniqueConstraint('human_id', 'first_name', 'middle_name', 'last_name', 'suffix', name='_human_alias_uc'),
176
+ db.UniqueConstraint(
177
+ "human_id",
178
+ "first_name",
179
+ "middle_name",
180
+ "last_name",
181
+ "suffix",
182
+ name="_human_alias_uc",
183
+ ),
133
184
  )
134
185
 
186
+
135
187
  class HumanInTTS(db.Model):
136
- __tablename__ = 'humans_in_tts'
188
+ __tablename__ = "humans_in_tts"
137
189
  id = db.Column(db.Integer, primary_key=True)
138
- human_id = db.Column(db.Integer, db.ForeignKey('humans.id'))
190
+ human_id = db.Column(db.Integer, db.ForeignKey("humans.id"))
139
191
  tts_id = db.Column(db.Integer)
140
- org_id = db.Column(db.Integer, db.ForeignKey('organizations.id'), nullable=False)
141
- __table_args__ = (
142
- db.UniqueConstraint('org_id', 'tts_id', name='_org_tts_uc'),
143
- )
192
+ org_id = db.Column(db.Integer, db.ForeignKey("organizations.id"), nullable=False)
193
+ __table_args__ = (db.UniqueConstraint("org_id", "tts_id", name="_org_tts_uc"),)
194
+
144
195
 
145
196
  class HumansInLevels(db.Model):
146
- __tablename__ = 'humans_in_levels'
197
+ __tablename__ = "humans_in_levels"
147
198
  id = db.Column(db.Integer, primary_key=True)
148
- levels_monthly_id = db.Column(db.Integer, db.ForeignKey('levels_monthly.id'))
149
- human_id = db.Column(db.Integer, db.ForeignKey('humans.id'))
199
+ levels_monthly_id = db.Column(db.Integer, db.ForeignKey("levels_monthly.id"))
200
+ human_id = db.Column(db.Integer, db.ForeignKey("humans.id"))
150
201
  games_played = db.Column(db.Integer)
151
202
  __table_args__ = (
152
- db.UniqueConstraint('levels_monthly_id', 'human_id', name='_levels_monthly_human_uc'),
203
+ db.UniqueConstraint(
204
+ "levels_monthly_id", "human_id", name="_levels_monthly_human_uc"
205
+ ),
153
206
  )
154
207
 
208
+
155
209
  class HumanPrivacyOptOut(db.Model):
156
- __tablename__ = 'human_privacy_opt_outs'
210
+ __tablename__ = "human_privacy_opt_outs"
157
211
  id = db.Column(db.Integer, primary_key=True)
158
212
  first_name = db.Column(db.String(100), nullable=False)
159
- middle_name = db.Column(db.String(100), nullable=False, default='')
213
+ middle_name = db.Column(db.String(100), nullable=False, default="")
160
214
  last_name = db.Column(db.String(100), nullable=False)
161
- suffix = db.Column(db.String(100), nullable=False, default='')
162
- opt_out_date = db.Column(db.DateTime, nullable=False, default=db.func.current_timestamp())
215
+ suffix = db.Column(db.String(100), nullable=False, default="")
216
+ opt_out_date = db.Column(
217
+ db.DateTime, nullable=False, default=db.func.current_timestamp()
218
+ )
163
219
  notes = db.Column(db.Text, nullable=True)
164
220
  __table_args__ = (
165
- db.UniqueConstraint('first_name', 'middle_name', 'last_name', 'suffix', name='_privacy_optout_name_uc'),
221
+ db.UniqueConstraint(
222
+ "first_name",
223
+ "middle_name",
224
+ "last_name",
225
+ "suffix",
226
+ name="_privacy_optout_name_uc",
227
+ ),
166
228
  )
167
229
 
230
+
168
231
  class League(db.Model):
169
- __tablename__ = 'leagues'
232
+ __tablename__ = "leagues"
170
233
  id = db.Column(db.Integer, primary_key=True)
171
- org_id = db.Column(db.Integer, db.ForeignKey('organizations.id'), nullable=False)
234
+ org_id = db.Column(db.Integer, db.ForeignKey("organizations.id"), nullable=False)
172
235
  league_number = db.Column(db.Integer)
173
236
  league_name = db.Column(db.String(100))
174
237
  __table_args__ = (
175
- db.UniqueConstraint('org_id', 'league_number', name='_org_league_number_uc'),
238
+ db.UniqueConstraint("org_id", "league_number", name="_org_league_number_uc"),
176
239
  )
177
240
 
241
+
178
242
  class Level(db.Model):
179
- __tablename__ = 'levels'
243
+ __tablename__ = "levels"
180
244
  id = db.Column(db.Integer, primary_key=True)
181
- org_id = db.Column(db.Integer, db.ForeignKey('organizations.id'), nullable=False)
245
+ org_id = db.Column(db.Integer, db.ForeignKey("organizations.id"), nullable=False)
182
246
  skill_value = db.Column(db.Float) # A number from 0 (NHL) to 100 (pedestrian)
183
247
  level_name = db.Column(db.String(100))
184
248
  level_alternative_name = db.Column(db.String(100))
185
249
  is_seed = db.Column(db.Boolean, nullable=True, default=False) # New field
186
250
  skill_propagation_sequence = db.Column(db.Integer, nullable=True, default=-1)
187
251
  __table_args__ = (
188
- db.UniqueConstraint('org_id', 'level_name', name='_org_level_name_uc'),
252
+ db.UniqueConstraint("org_id", "level_name", name="_org_level_name_uc"),
189
253
  )
190
254
 
255
+
191
256
  class LevelsMonthly(db.Model):
192
- __tablename__ = 'levels_monthly'
257
+ __tablename__ = "levels_monthly"
193
258
  id = db.Column(db.Integer, primary_key=True)
194
259
  year = db.Column(db.Integer)
195
260
  month = db.Column(db.Integer)
@@ -197,93 +262,130 @@ class LevelsMonthly(db.Model):
197
262
  season_number = db.Column(db.Integer)
198
263
  season_name = db.Column(db.String(100))
199
264
  level = db.Column(db.String(100))
200
- org_id = db.Column(db.Integer, db.ForeignKey('organizations.id'), nullable=False)
265
+ org_id = db.Column(db.Integer, db.ForeignKey("organizations.id"), nullable=False)
201
266
  __table_args__ = (
202
- db.UniqueConstraint('org_id', 'year', 'month', 'league_number', 'season_number', 'level', name='_org_year_month_league_season_level_uc'),
267
+ db.UniqueConstraint(
268
+ "org_id",
269
+ "year",
270
+ "month",
271
+ "league_number",
272
+ "season_number",
273
+ "level",
274
+ name="_org_year_month_league_season_level_uc",
275
+ ),
203
276
  )
204
277
 
278
+
205
279
  class OrgLeagueSeasonDates(db.Model):
206
- __tablename__ = 'org_league_season_dates'
280
+ __tablename__ = "org_league_season_dates"
207
281
  id = db.Column(db.Integer, primary_key=True)
208
- org_id = db.Column(db.Integer, db.ForeignKey('organizations.id'), nullable=False)
282
+ org_id = db.Column(db.Integer, db.ForeignKey("organizations.id"), nullable=False)
209
283
  league_number = db.Column(db.Integer)
210
284
  season_number = db.Column(db.Integer)
211
285
  start_date = db.Column(db.Date)
212
286
  end_date = db.Column(db.Date)
213
287
  __table_args__ = (
214
- db.UniqueConstraint('org_id', 'league_number', 'season_number', name='_org_league_season_uc_too'),
215
- )
288
+ db.UniqueConstraint(
289
+ "org_id", "league_number", "season_number", name="_org_league_season_uc_too"
290
+ ),
291
+ )
292
+
216
293
 
217
294
  class NamesInOrgLeagueSeason(db.Model):
218
- __tablename__ = 'names_in_org_league_season'
295
+ __tablename__ = "names_in_org_league_season"
219
296
  id = db.Column(db.Integer, primary_key=True)
220
- org_league_season_id = db.Column(db.Integer, db.ForeignKey('org_league_season_dates.id'))
297
+ org_league_season_id = db.Column(
298
+ db.Integer, db.ForeignKey("org_league_season_dates.id")
299
+ )
221
300
  first_name = db.Column(db.String(100))
222
301
  middle_name = db.Column(db.String(100))
223
302
  last_name = db.Column(db.String(100))
224
303
  first_date = db.Column(db.Date)
225
304
  last_date = db.Column(db.Date)
226
305
  __table_args__ = (
227
- db.UniqueConstraint('org_league_season_id', 'first_name', 'middle_name', 'last_name', name='_org_league_season_name_uc'),
306
+ db.UniqueConstraint(
307
+ "org_league_season_id",
308
+ "first_name",
309
+ "middle_name",
310
+ "last_name",
311
+ name="_org_league_season_name_uc",
312
+ ),
228
313
  )
229
314
 
315
+
230
316
  class NamesInTeams(db.Model):
231
- __tablename__ = 'names_in_teams'
317
+ __tablename__ = "names_in_teams"
232
318
  id = db.Column(db.Integer, primary_key=True)
233
319
  first_name = db.Column(db.String(100))
234
320
  middle_name = db.Column(db.String(100))
235
321
  last_name = db.Column(db.String(100))
236
- team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
322
+ team_id = db.Column(db.Integer, db.ForeignKey("teams.id"))
237
323
  first_date = db.Column(db.Date)
238
324
  last_date = db.Column(db.Date)
239
325
  __table_args__ = (
240
- db.UniqueConstraint('team_id', 'first_name', 'middle_name', 'last_name', name='_team_name_uc'),
326
+ db.UniqueConstraint(
327
+ "team_id", "first_name", "middle_name", "last_name", name="_team_name_uc"
328
+ ),
241
329
  )
242
330
 
331
+
243
332
  class Organization(db.Model):
244
- __tablename__ = 'organizations'
333
+ __tablename__ = "organizations"
245
334
  id = db.Column(db.Integer, primary_key=True)
246
335
  alias = db.Column(db.String(100), unique=True)
247
336
  organization_name = db.Column(db.String(100), unique=True)
248
337
  website = db.Column(db.String(100), nullable=True)
249
338
 
339
+
250
340
  class Penalty(db.Model):
251
- __tablename__ = 'penalties'
341
+ __tablename__ = "penalties"
252
342
  id = db.Column(db.Integer, primary_key=True)
253
- game_id = db.Column(db.Integer, db.ForeignKey('games.id'))
254
- team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
343
+ game_id = db.Column(db.Integer, db.ForeignKey("games.id"))
344
+ team_id = db.Column(db.Integer, db.ForeignKey("teams.id"))
255
345
  period = db.Column(db.String(10)) # Can be "1", "2", "3", "OT", etc.
256
- time = db.Column(db.String(10)) # For elapsed time format
257
- penalized_player_id = db.Column(db.Integer, db.ForeignKey('humans.id'))
346
+ time = db.Column(db.String(10)) # For elapsed time format
347
+ penalized_player_id = db.Column(db.Integer, db.ForeignKey("humans.id"))
258
348
  infraction = db.Column(db.String(100))
259
- penalty_minutes = db.Column(db.String(3)) # Use this for numeric penalties like 2 minutes and GM, GS, M, PS, C, GR1
349
+ penalty_minutes = db.Column(
350
+ db.String(3)
351
+ ) # Use this for numeric penalties like 2 minutes and GM, GS, M, PS, C, GR1
260
352
  penalty_start = db.Column(db.String(10)) # Elapsed time for start
261
- penalty_end = db.Column(db.String(10)) # Elapsed time for end, can be NULL if unknown
353
+ penalty_end = db.Column(
354
+ db.String(10)
355
+ ) # Elapsed time for end, can be NULL if unknown
262
356
  penalty_sequence_number = db.Column(db.Integer)
263
357
  __table_args__ = (
264
- db.UniqueConstraint('game_id', 'team_id', 'penalty_sequence_number', name='_game_team_penalty_sequence_uc'),
358
+ db.UniqueConstraint(
359
+ "game_id",
360
+ "team_id",
361
+ "penalty_sequence_number",
362
+ name="_game_team_penalty_sequence_uc",
363
+ ),
265
364
  )
266
365
 
366
+
267
367
  class PlayerRole(db.Model):
268
- __tablename__ = 'player_roles'
269
- team_id = db.Column(db.Integer, db.ForeignKey('teams.id'), primary_key=True)
270
- human_id = db.Column(db.Integer, db.ForeignKey('humans.id'), primary_key=True)
271
- role_type = db.Column(db.String(10), primary_key=True) # e.g., G (goalie), C (captain), A (alternate), S (substitute)
368
+ __tablename__ = "player_roles"
369
+ team_id = db.Column(db.Integer, db.ForeignKey("teams.id"), primary_key=True)
370
+ human_id = db.Column(db.Integer, db.ForeignKey("humans.id"), primary_key=True)
371
+ role_type = db.Column(
372
+ db.String(10), primary_key=True
373
+ ) # e.g., G (goalie), C (captain), A (alternate), S (substitute)
272
374
  first_date = db.Column(db.Date)
273
375
  last_date = db.Column(db.Date)
274
- __table_args__ = (
275
- db.PrimaryKeyConstraint('team_id', 'human_id', 'role_type'),
276
- )
376
+ __table_args__ = (db.PrimaryKeyConstraint("team_id", "human_id", "role_type"),)
377
+
277
378
 
278
379
  class RefDivision(db.Model):
279
- __tablename__ = 'ref_divisions'
280
- division_id = db.Column(db.Integer, db.ForeignKey('divisions.id'), primary_key=True)
281
- human_id = db.Column(db.Integer, db.ForeignKey('humans.id'), primary_key=True)
380
+ __tablename__ = "ref_divisions"
381
+ division_id = db.Column(db.Integer, db.ForeignKey("divisions.id"), primary_key=True)
382
+ human_id = db.Column(db.Integer, db.ForeignKey("humans.id"), primary_key=True)
282
383
  first_date = db.Column(db.Date)
283
384
  last_date = db.Column(db.Date)
284
385
 
386
+
285
387
  class RefereeName(db.Model):
286
- __tablename__ = 'referee_names'
388
+ __tablename__ = "referee_names"
287
389
  id = db.Column(db.Integer, primary_key=True)
288
390
  first_name = db.Column(db.String(100))
289
391
  middle_name = db.Column(db.String(100))
@@ -291,18 +393,22 @@ class RefereeName(db.Model):
291
393
  first_date = db.Column(db.Date)
292
394
  last_date = db.Column(db.Date)
293
395
  __table_args__ = (
294
- db.UniqueConstraint('first_name', 'middle_name', 'last_name', name='_referee_name_uc'),
396
+ db.UniqueConstraint(
397
+ "first_name", "middle_name", "last_name", name="_referee_name_uc"
398
+ ),
295
399
  )
296
400
 
401
+
297
402
  class ScorekeeperDivision(db.Model):
298
- __tablename__ = 'scorekeeper_divisions'
299
- division_id = db.Column(db.Integer, db.ForeignKey('divisions.id'), primary_key=True)
300
- human_id = db.Column(db.Integer, db.ForeignKey('humans.id'), primary_key=True)
403
+ __tablename__ = "scorekeeper_divisions"
404
+ division_id = db.Column(db.Integer, db.ForeignKey("divisions.id"), primary_key=True)
405
+ human_id = db.Column(db.Integer, db.ForeignKey("humans.id"), primary_key=True)
301
406
  first_date = db.Column(db.Date)
302
407
  last_date = db.Column(db.Date)
303
408
 
409
+
304
410
  class ScorekeeperName(db.Model):
305
- __tablename__ = 'scorekeeper_names'
411
+ __tablename__ = "scorekeeper_names"
306
412
  id = db.Column(db.Integer, primary_key=True)
307
413
  first_name = db.Column(db.String(100))
308
414
  middle_name = db.Column(db.String(100))
@@ -310,99 +416,149 @@ class ScorekeeperName(db.Model):
310
416
  first_date = db.Column(db.Date)
311
417
  last_date = db.Column(db.Date)
312
418
  __table_args__ = (
313
- db.UniqueConstraint('first_name', 'middle_name', 'last_name', name='_scorekeeper_name_uc'),
419
+ db.UniqueConstraint(
420
+ "first_name", "middle_name", "last_name", name="_scorekeeper_name_uc"
421
+ ),
314
422
  )
315
423
 
424
+
316
425
  class Season(db.Model):
317
- __tablename__ = 'seasons'
426
+ __tablename__ = "seasons"
318
427
  id = db.Column(db.Integer, primary_key=True)
319
428
  season_number = db.Column(db.Integer)
320
429
  season_name = db.Column(db.String(100))
321
430
  start_date = db.Column(db.Date)
322
431
  end_date = db.Column(db.Date)
323
- league_number = db.Column(db.Integer) # TODO: Deprecate usage and remove (get this info from League by league_id)
324
- league_id = db.Column(db.Integer, db.ForeignKey('leagues.id'))
325
- org_id = db.Column(db.Integer, db.ForeignKey('organizations.id'), nullable=False)
432
+ league_number = db.Column(
433
+ db.Integer
434
+ ) # TODO: Deprecate usage and remove (get this info from League by league_id)
435
+ league_id = db.Column(db.Integer, db.ForeignKey("leagues.id"))
436
+ org_id = db.Column(db.Integer, db.ForeignKey("organizations.id"), nullable=False)
326
437
  __table_args__ = (
327
- db.UniqueConstraint('org_id', 'league_number', 'season_number', name='_org_league_season_uc'),
438
+ db.UniqueConstraint(
439
+ "org_id", "league_number", "season_number", name="_org_league_season_uc"
440
+ ),
328
441
  )
329
442
 
443
+
330
444
  class Shootout(db.Model):
331
- __tablename__ = 'shootout'
445
+ __tablename__ = "shootout"
332
446
  id = db.Column(db.Integer, primary_key=True)
333
- game_id = db.Column(db.Integer, db.ForeignKey('games.id'))
334
- shooting_team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
335
- shooter_id = db.Column(db.Integer, db.ForeignKey('humans.id'))
336
- goalie_id = db.Column(db.Integer, db.ForeignKey('humans.id'))
337
- has_scored = db.Column(db.Boolean) # Reflect if goal was scored or not during shootout
447
+ game_id = db.Column(db.Integer, db.ForeignKey("games.id"))
448
+ shooting_team_id = db.Column(db.Integer, db.ForeignKey("teams.id"))
449
+ shooter_id = db.Column(db.Integer, db.ForeignKey("humans.id"))
450
+ goalie_id = db.Column(db.Integer, db.ForeignKey("humans.id"))
451
+ has_scored = db.Column(
452
+ db.Boolean
453
+ ) # Reflect if goal was scored or not during shootout
338
454
  sequence_number = db.Column(db.Integer)
339
455
  __table_args__ = (
340
- db.UniqueConstraint('game_id', 'shooting_team_id' , 'sequence_number', name='_shootout_team_sequence_uc'),
456
+ db.UniqueConstraint(
457
+ "game_id",
458
+ "shooting_team_id",
459
+ "sequence_number",
460
+ name="_shootout_team_sequence_uc",
461
+ ),
341
462
  )
342
463
 
464
+
343
465
  class Team(db.Model):
344
- __tablename__ = 'teams'
466
+ __tablename__ = "teams"
345
467
  id = db.Column(db.Integer, primary_key=True)
346
468
  name = db.Column(db.String(100), nullable=False)
347
- org_id = db.Column(db.Integer, db.ForeignKey('organizations.id'), nullable=False)
348
- __table_args__ = (
349
- db.UniqueConstraint('org_id', 'name', name='_org_team_name_uc'),
350
- )
469
+ org_id = db.Column(db.Integer, db.ForeignKey("organizations.id"), nullable=False)
470
+ __table_args__ = (db.UniqueConstraint("org_id", "name", name="_org_team_name_uc"),)
471
+
351
472
 
352
473
  class TeamDivision(db.Model):
353
- __tablename__ = 'teams_divisions'
474
+ __tablename__ = "teams_divisions"
354
475
  id = db.Column(db.Integer, primary_key=True)
355
- team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
356
- division_id = db.Column(db.Integer, db.ForeignKey('divisions.id'))
476
+ team_id = db.Column(db.Integer, db.ForeignKey("teams.id"))
477
+ division_id = db.Column(db.Integer, db.ForeignKey("divisions.id"))
357
478
  __table_args__ = (
358
- db.UniqueConstraint('team_id', 'division_id', name='_team_division_uc'),
479
+ db.UniqueConstraint("team_id", "division_id", name="_team_division_uc"),
359
480
  )
360
481
 
482
+
361
483
  class TeamInTTS(db.Model):
362
- __tablename__ = 'teams_in_tts'
484
+ __tablename__ = "teams_in_tts"
363
485
  id = db.Column(db.Integer, primary_key=True)
364
- team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
486
+ team_id = db.Column(db.Integer, db.ForeignKey("teams.id"))
365
487
  tts_team_id = db.Column(db.Integer)
366
- org_id = db.Column(db.Integer, db.ForeignKey('organizations.id'), nullable=False)
488
+ org_id = db.Column(db.Integer, db.ForeignKey("organizations.id"), nullable=False)
367
489
  __table_args__ = (
368
- db.UniqueConstraint('org_id', 'team_id', 'tts_team_id', name='_org_team_tts_uc'),
490
+ db.UniqueConstraint(
491
+ "org_id", "team_id", "tts_team_id", name="_org_team_tts_uc"
492
+ ),
369
493
  )
370
494
 
495
+
371
496
  class RequestLog(db.Model):
372
- __tablename__ = 'request_logs'
497
+ __tablename__ = "request_logs"
373
498
  id = db.Column(db.Integer, primary_key=True)
374
499
  user_agent = db.Column(db.String, nullable=False)
375
500
  client_ip = db.Column(db.String, nullable=False)
376
501
  path = db.Column(db.String, nullable=False)
377
502
  timestamp = db.Column(db.DateTime, nullable=False)
378
503
  cgi_params = db.Column(db.String, nullable=True)
379
- response_time_ms = db.Column(db.Float, nullable=True) # Response time in milliseconds
504
+ response_time_ms = db.Column(
505
+ db.Float, nullable=True
506
+ ) # Response time in milliseconds
507
+
380
508
 
381
509
  class GoalieSaves(db.Model):
382
- __tablename__ = 'goalie_saves'
510
+ __tablename__ = "goalie_saves"
383
511
  id = db.Column(db.Integer, primary_key=True)
384
- game_id = db.Column(db.Integer, db.ForeignKey('games.id'), nullable=False)
385
- goalie_id = db.Column(db.Integer, db.ForeignKey('humans.id'), nullable=False)
512
+ game_id = db.Column(db.Integer, db.ForeignKey("games.id"), nullable=False)
513
+ goalie_id = db.Column(db.Integer, db.ForeignKey("humans.id"), nullable=False)
386
514
  saves_count = db.Column(db.Integer, nullable=False, default=0)
387
515
  shots_against = db.Column(db.Integer, nullable=False, default=0)
388
516
  goals_allowed = db.Column(db.Integer, nullable=False, default=0)
389
517
  __table_args__ = (
390
- db.UniqueConstraint('game_id', 'goalie_id', name='_game_goalie_saves_uc'),
518
+ db.UniqueConstraint("game_id", "goalie_id", name="_game_goalie_saves_uc"),
391
519
  )
392
520
 
521
+
393
522
  class ScorekeeperSaveQuality(db.Model):
394
- __tablename__ = 'scorekeeper_save_quality'
523
+ __tablename__ = "scorekeeper_save_quality"
395
524
  id = db.Column(db.Integer, primary_key=True)
396
- game_id = db.Column(db.Integer, db.ForeignKey('games.id'), nullable=False)
397
- scorekeeper_id = db.Column(db.Integer, db.ForeignKey('humans.id'), nullable=False)
525
+ game_id = db.Column(db.Integer, db.ForeignKey("games.id"), nullable=False)
526
+ scorekeeper_id = db.Column(db.Integer, db.ForeignKey("humans.id"), nullable=False)
398
527
  total_saves_recorded = db.Column(db.Integer, nullable=False, default=0)
399
- max_saves_per_5sec = db.Column(db.Integer, nullable=False, default=0) # Highest saves in any 5-second window
400
- max_saves_per_20sec = db.Column(db.Integer, nullable=False, default=0) # Highest saves in any 20-second window
401
- saves_timestamps = db.Column(db.JSON, nullable=True) # JSONB with home_saves/away_saves arrays of decisecond timestamps
528
+ max_saves_per_5sec = db.Column(
529
+ db.Integer, nullable=False, default=0
530
+ ) # Highest saves in any 5-second window
531
+ max_saves_per_20sec = db.Column(
532
+ db.Integer, nullable=False, default=0
533
+ ) # Highest saves in any 20-second window
534
+ saves_timestamps = db.Column(
535
+ db.JSON, nullable=True
536
+ ) # JSONB with home_saves/away_saves arrays of decisecond timestamps
402
537
  __table_args__ = (
403
- db.UniqueConstraint('game_id', 'scorekeeper_id', name='_game_scorekeeper_quality_uc'),
538
+ db.UniqueConstraint(
539
+ "game_id", "scorekeeper_id", name="_game_scorekeeper_quality_uc"
540
+ ),
404
541
  )
405
542
 
543
+
544
+ class HumanEmbedding(db.Model):
545
+ """Vector embeddings for semantic search of humans (players/referees/scorekeepers)."""
546
+ __tablename__ = "human_embeddings"
547
+ human_id = db.Column(db.Integer, db.ForeignKey("humans.id"), primary_key=True)
548
+ full_name = db.Column(db.String(255), nullable=False)
549
+ embedding = db.Column(db.Text, nullable=False) # pgvector type, stored as text
550
+ updated_at = db.Column(db.DateTime, nullable=False)
551
+
552
+
553
+ class TeamEmbedding(db.Model):
554
+ """Vector embeddings for semantic search of teams."""
555
+ __tablename__ = "team_embeddings"
556
+ team_id = db.Column(db.Integer, db.ForeignKey("teams.id"), primary_key=True)
557
+ team_name = db.Column(db.String(255), nullable=False)
558
+ embedding = db.Column(db.Text, nullable=False) # pgvector type, stored as text
559
+ updated_at = db.Column(db.DateTime, nullable=False)
560
+
561
+
406
562
  # # MANUAL AMENDS HAPPEN HERE :)
407
563
  # from db_connection import create_session
408
564
  # session = create_session("sharksice")
@@ -414,4 +570,4 @@ class ScorekeeperSaveQuality(db.Model):
414
570
  # session.commit()
415
571
 
416
572
 
417
- # print("Updated!")
573
+ # print("Updated!")