]> gitweb.michael.orlitzky.com - dead/htsn-import.git/blob - src/TSN/XML/MLBBoxScore.hs
8a15a883e07910b12f66125e034563e2d14e2689
[dead/htsn-import.git] / src / TSN / XML / MLBBoxScore.hs
1 {-# LANGUAGE DeriveGeneric #-}
2 {-# LANGUAGE DeriveDataTypeable #-}
3 {-# LANGUAGE FlexibleInstances #-}
4 {-# LANGUAGE GADTs #-}
5 {-# LANGUAGE QuasiQuotes #-}
6 {-# LANGUAGE RecordWildCards #-}
7 {-# LANGUAGE TemplateHaskell #-}
8 {-# LANGUAGE TypeFamilies #-}
9
10 -- | Parse TSN XML for the DTD \"MLB_Boxscore_XML.dtd\".
11 --
12 module TSN.XML.MLBBoxScore (
13 dtd,
14 pickle_message,
15 -- * Tests
16 -- auto_racing_results_tests,
17 -- * WARNING: these are private but exported to silence warnings
18 MLBBoxScore_MLBBoxScoreTeamBreakdownConstructor(..),
19 MLBBoxScoreConstructor(..),
20 MLBBoxScoreHomerunStatsListingConstructor(..),
21 MLBBoxScoreHomerunStatsListingPitcherConstructor(..),
22 MLBBoxScoreMiscellaneousGameInfo(..),
23 MLBBoxScoreMiscPitchingStats(..), -- can go eventually
24 MLBBoxScoreRunsByInningsConstructor(..),
25 MLBBoxScoreTeamBreakdownConstructor(..),
26 MLBBoxScoreTeamSummary(..) -- can go eventually
27 )
28 where
29
30 -- System imports.
31 import Control.Monad ( forM_ )
32 import Data.Data ( Data )
33 import Data.Maybe ( fromMaybe )
34 import Data.Time ( UTCTime(..) )
35 import Data.Tuple.Curry ( uncurryN )
36 import Data.Typeable ( Typeable )
37 import Database.Groundhog (
38 insert,
39 insert_,
40 migrate )
41 import Database.Groundhog.Core ( DefaultKey )
42 import Database.Groundhog.TH (
43 groundhog,
44 mkPersist )
45 import qualified GHC.Generics as GHC ( Generic )
46 import Text.XML.HXT.Core (
47 PU,
48 xp4Tuple,
49 xp23Tuple,
50 xpAttr,
51 xpElem,
52 xpInt,
53 xpList,
54 xpOption,
55 xpPair,
56 xpText,
57 xpTriple,
58 xpUnit,
59 xpWrap )
60
61 -- Local imports.
62 import Generics ( Generic(..), to_tuple )
63 import TSN.Codegen ( tsn_codegen_config )
64 import TSN.DbImport ( DbImport(..), ImportResult(..), run_dbmigrate )
65 import TSN.Picklers (
66 xp_date,
67 xp_time,
68 xp_time_stamp )
69 import TSN.Team ( Team(..), FromXmlFkTeams(..) )
70 import TSN.XmlImport ( XmlImport(..), XmlImportFk(..) )
71 import Xml (
72 Child(..),
73 FromXml(..),
74 FromXmlFk(..),
75 ToDb(..) )
76
77
78 -- | The DTD to which this module corresponds. Used to invoke dbimport.
79 --
80 dtd :: String
81 dtd = "MLB_Boxscore_XML.dtd"
82
83 --
84 -- * DB/XML data types
85 --
86
87 -- MLBBoxScore/Message
88
89 -- | Database representation of a 'Message'. The vteam/hteam have been
90 -- removed since they use the TSN.Team representation. The
91 -- 'xml_game_date' and 'xml_game_time' fields have also been
92 -- combined into 'db_game_time'. Finally, the summaries are missing
93 -- since they'll be keyed to us.
94 --
95 data MLBBoxScore =
96 MLBBoxScore {
97 db_xml_file_id :: Int,
98 db_heading :: String,
99 db_category :: String,
100 db_sport :: String,
101 db_game_id :: Int,
102 db_schedule_id :: Int,
103 db_vteam_id :: DefaultKey Team,
104 db_hteam_id :: DefaultKey Team,
105 db_season :: String,
106 db_season_type :: String,
107 db_game_time :: UTCTime,
108 db_game_number :: Int,
109 db_capacity :: Int,
110 db_title :: String,
111 db_time_stamp :: UTCTime }
112
113
114
115
116 -- | XML Representation of an 'MBLBoxScore'. It has the same fields,
117 -- but in addition contains the hteam/vteams and a game_date that
118 -- will eventually be combined with the time. It also has a list of
119 -- summaries.
120 --
121 data Message =
122 Message {
123 xml_xml_file_id :: Int,
124 xml_heading :: String,
125 xml_category :: String,
126 xml_sport :: String,
127 xml_game_id :: Int,
128 xml_schedule_id :: Int,
129 xml_vteam :: String,
130 xml_hteam :: String,
131 xml_vteam_id :: String,
132 xml_hteam_id :: String,
133 xml_season :: String,
134 xml_season_type :: String,
135 xml_title :: String,
136 xml_game_date :: UTCTime,
137 xml_game_time :: UTCTime,
138 xml_game_number :: Int,
139 xml_capacity :: Int,
140 xml_game_breakdown :: MLBBoxScoreGameBreakdownXml,
141 xml_team_summaries :: [MLBBoxScoreTeamSummaryXml],
142 xml_misc_pitching_stats :: MLBBoxScoreMiscPitchingStatsXml,
143 xml_homerun_stats_listings :: Maybe [MLBBoxScoreHomerunStatsListingXml],
144 xml_miscellaneous_game_info :: MLBBoxScoreMiscellaneousGameInfoXml,
145 xml_time_stamp :: UTCTime }
146 deriving (Eq, GHC.Generic, Show)
147
148
149 -- | For 'Generics.to_tuple'.
150 --
151 instance Generic Message
152
153 instance ToDb Message where
154 -- | The database analogue of a 'Message' is a 'MLBBoxScore'.
155 --
156 type Db Message = MLBBoxScore
157
158
159
160 -- | This ugly hack allows us to make 'Message' an instance of
161 -- 'FromXmlFkTeams'. That class usually requires that its instances
162 -- have a parent, but 'Message' does not. So we declare it the
163 -- parent of itself, and then ignore it.
164 instance Child Message where
165 type Parent Message = MLBBoxScore
166
167 -- | The 'FromXmlFk' instance for 'Message' is required for the
168 -- 'XmlImport' instance.
169 instance FromXmlFkTeams Message where
170 -- | To convert a 'Message' to an 'MLBBoxScore', we drop the
171 -- teams/summaries and combine the date/time. Also missing are the
172 -- embedded elements game_breakdown, homerun_stats, and
173 -- miscellaneous_game_info.
174 --
175 from_xml_fk_teams _ vteam_id hteam_id Message{..} =
176 MLBBoxScore {
177 db_xml_file_id = xml_xml_file_id,
178 db_heading = xml_heading,
179 db_category = xml_category,
180 db_sport = xml_sport,
181 db_game_id = xml_game_id,
182 db_schedule_id = xml_schedule_id,
183 db_vteam_id = vteam_id,
184 db_hteam_id = hteam_id,
185 db_season = xml_season,
186 db_season_type = xml_season_type,
187 db_game_time = make_game_time,
188 db_game_number = xml_game_number,
189 db_capacity = xml_capacity,
190 db_title = xml_title,
191 db_time_stamp = xml_time_stamp }
192 where
193 make_game_time =
194 UTCTime (utctDay xml_game_date) (utctDayTime xml_game_time)
195
196
197 data MLBBoxScoreTeamSummary = MLBBoxScoreTeamSummary
198 data MLBBoxScoreTeamSummaryXml = MLBBoxScoreTeamSummaryXml deriving (Eq, Show)
199
200 data MLBBoxScoreGameBreakdownXml =
201 MLBBoxScoreGameBreakdownXml {
202 xml_away_team :: MLBBoxScoreTeamBreakdownXml,
203 xml_home_team :: MLBBoxScoreTeamBreakdownXml }
204 deriving (Eq, GHC.Generic, Show)
205
206 -- | For 'Generics.to_tuple'
207 --
208 instance Generic MLBBoxScoreGameBreakdownXml
209
210
211 data MLBBoxScoreHomerunStatsListingBatter =
212 MLBBoxScoreHomerunStatsListingBatter {
213 db_batter_first_name :: String,
214 db_batter_last_name :: String,
215 db_batter_rbis :: Int,
216 db_batter_id :: Int }
217 deriving (Data, Eq, GHC.Generic, Show, Typeable)
218
219 -- | For 'Generics.to_tuple'
220 --
221 instance Generic MLBBoxScoreHomerunStatsListingBatter
222
223
224 data MLBBoxScoreHomerunStatsListing =
225 MLBBoxScoreHomerunStatsListing {
226 db_mlb_box_scores_id :: DefaultKey MLBBoxScore,
227 db_batter :: MLBBoxScoreHomerunStatsListingBatter, -- embedded
228 db_season_homeruns :: Int }
229
230 data MLBBoxScoreHomerunStatsListingXml =
231 MLBBoxScoreHomerunStatsListingXml {
232 xml_batter :: MLBBoxScoreHomerunStatsListingBatter,
233 xml_season_homeruns :: Int,
234 xml_pitchers :: [MLBBoxScoreHomerunStatsListingPitcherXml] }
235 deriving (Eq, GHC.Generic, Show)
236
237 -- | For 'Generics.to_tuple'
238 --
239 instance Generic MLBBoxScoreHomerunStatsListingXml
240
241 instance Child MLBBoxScoreHomerunStatsListingXml where
242 -- | Each 'MLBBoxScoreHomerunStatsListingXml' is contained in (i.e. has a
243 -- foreign key to) a 'MLBBoxScore'.
244 --
245 type Parent MLBBoxScoreHomerunStatsListingXml = MLBBoxScore
246
247
248 instance ToDb MLBBoxScoreHomerunStatsListingXml where
249 -- | The database representation of
250 -- 'MLBBoxScoreHomerunStatsListingXml' is
251 -- 'MLBBoxScoreHomerunStatsListing'.
252 --
253 type Db MLBBoxScoreHomerunStatsListingXml = MLBBoxScoreHomerunStatsListing
254
255 instance FromXmlFk MLBBoxScoreHomerunStatsListingXml where
256 -- | To convert an 'MLBBoxScoreHomerunStatsListingXml' to an
257 -- 'MLBBoxScoreHomerunStatsListing', we add the foreign key and
258 -- drop the pitchers.
259 --
260 from_xml_fk fk MLBBoxScoreHomerunStatsListingXml{..} =
261 MLBBoxScoreHomerunStatsListing {
262 db_mlb_box_scores_id = fk,
263 db_batter = xml_batter,
264 db_season_homeruns = xml_season_homeruns }
265
266
267 -- | This allows us to insert the XML representation
268 -- 'MLBBoxScoreHomerunStatsListingXml' directly.
269 --
270 instance XmlImportFk MLBBoxScoreHomerunStatsListingXml
271
272
273 data MLBBoxScoreHomerunStatsListingPitcher =
274 MLBBoxScoreHomerunStatsListingPitcher {
275 db_mlb_box_score_homerun_stats_listings_id ::
276 DefaultKey MLBBoxScoreHomerunStatsListing,
277 db_homeruns_off_pitcher :: Int,
278 db_pitcher_first_name :: String,
279 db_pitcher_last_name :: String,
280 db_pitchers_pitcher_id :: Int }
281
282 data MLBBoxScoreHomerunStatsListingPitcherXml =
283 MLBBoxScoreHomerunStatsListingPitcherXml {
284 xml_homeruns_off_pitcher :: Int,
285 xml_pitcher_first_name :: String,
286 xml_pitcher_last_name :: String,
287 xml_pitchers_pitcher_id :: Int }
288 deriving (Eq, GHC.Generic, Show)
289
290 -- | For 'Generics.to_tuple'
291 --
292 instance Generic MLBBoxScoreHomerunStatsListingPitcherXml
293
294 instance Child MLBBoxScoreHomerunStatsListingPitcherXml where
295 -- | Each 'MLBBoxScoreHomerunStatsListingPitcherXml' is contained in
296 -- (i.e. has a foreign key to) a 'MLBBoxScoreHomerunStatsListing'.
297 --
298 type Parent MLBBoxScoreHomerunStatsListingPitcherXml =
299 MLBBoxScoreHomerunStatsListing
300
301
302 instance ToDb MLBBoxScoreHomerunStatsListingPitcherXml where
303 -- | The database representation of
304 -- 'MLBBoxScoreHomerunStatsListingPitcherXml' is
305 -- 'MLBBoxScoreHomerunStatsListingPitcher'.
306 --
307 type Db MLBBoxScoreHomerunStatsListingPitcherXml = MLBBoxScoreHomerunStatsListingPitcher
308
309
310 instance FromXmlFk MLBBoxScoreHomerunStatsListingPitcherXml where
311 -- | To convert an 'MLBBoxScoreHomerunStatsListingPitcherXml' to an
312 -- 'MLBBoxScoreHomerunStatsListingPitcher', we add the foreign key.
313 --
314 from_xml_fk fk MLBBoxScoreHomerunStatsListingPitcherXml{..} =
315 MLBBoxScoreHomerunStatsListingPitcher {
316 db_mlb_box_score_homerun_stats_listings_id = fk,
317 db_homeruns_off_pitcher = xml_homeruns_off_pitcher,
318 db_pitcher_first_name = xml_pitcher_first_name,
319 db_pitcher_last_name = xml_pitcher_last_name,
320 db_pitchers_pitcher_id = xml_pitchers_pitcher_id }
321
322
323 -- | This allows us to insert the XML representation
324 -- 'MLBBoxScoreHomerunStatsListingPitcherXml' directly.
325 --
326 instance XmlImportFk MLBBoxScoreHomerunStatsListingPitcherXml
327
328
329
330
331 data MLBBoxScoreMiscellaneousGameInfo = MLBBoxScoreMiscellaneousGameInfo
332 data MLBBoxScoreMiscellaneousGameInfoXml = MLBBoxScoreMiscellaneousGameInfoXml
333 deriving (Eq, Show)
334
335
336 -- Team Breakdown
337 data MLBBoxScoreTeamBreakdown =
338 MLBBoxScoreTeamBreakdown {
339 db_runs :: Int,
340 db_hits :: Int,
341 db_errors :: Int }
342 data MLBBoxScoreTeamBreakdownXml =
343 MLBBoxScoreTeamBreakdownXml {
344 xml_runs_by_innings :: [MLBBoxScoreRunsByInningsXml],
345 xml_runs :: Int,
346 xml_hits :: Int,
347 xml_errors :: Int }
348 deriving (Eq, GHC.Generic, Show)
349
350
351 -- | For 'Generics.to_tuple'.
352 instance Generic MLBBoxScoreTeamBreakdownXml
353
354 instance ToDb MLBBoxScoreTeamBreakdownXml where
355 -- | The database analogue of a 'MLBBoxScoreTeamBreakdownXml' is
356 -- a 'MLBBoxScoreTeamBreakdown'.
357 --
358 type Db MLBBoxScoreTeamBreakdownXml = MLBBoxScoreTeamBreakdown
359
360
361 -- | The 'FromXml' instance for 'MLBBoxScoreTeamBreakdownXml' is
362 -- required for the 'XmlImport' instance.
363 --
364 instance FromXml MLBBoxScoreTeamBreakdownXml where
365 -- | To convert a 'MLBBoxScoreTeamBreakdownXml' to an
366 -- 'MLBBoxScoreTeamBreakdown', we just drop the
367 -- 'xml_runs_by_innings'.
368 --
369 from_xml MLBBoxScoreTeamBreakdownXml{..} =
370 MLBBoxScoreTeamBreakdown {
371 db_runs = xml_runs,
372 db_hits = xml_hits,
373 db_errors = xml_errors }
374
375 instance XmlImport MLBBoxScoreTeamBreakdownXml
376
377 -- Runs by innings
378 data MLBBoxScoreRunsByInnings =
379 MLBBoxScoreRunsByInnings {
380 db_mlb_box_scores_team_breakdowns_id :: DefaultKey
381 MLBBoxScoreTeamBreakdown,
382 db_runs_by_innings_inning_number :: Int,
383 db_runs_by_innings_runs :: Int }
384
385 data MLBBoxScoreRunsByInningsXml =
386 MLBBoxScoreRunsByInningsXml {
387 xml_runs_by_innings_inning_number :: Int,
388 xml_runs_by_innings_runs :: Int }
389 deriving (Eq, GHC.Generic, Show)
390
391
392 -- * MLBBoxScore_MLBBoxScoreTeamSummary
393
394 -- | Mapping between 'MLBBoxScore' records and
395 -- 'MLBBoxScoreTeamSummary' records in the database. We don't use
396 -- the names anywhere, so we let Groundhog choose them.
397 --
398 data MLBBoxScore_MLBBoxScoreTeamBreakdown =
399 MLBBoxScore_MLBBoxScoreTeamBreakdown
400 (DefaultKey MLBBoxScore)
401 (DefaultKey MLBBoxScoreTeamBreakdown) -- Away team
402 (DefaultKey MLBBoxScoreTeamBreakdown) -- Home team
403
404
405
406 -- | For 'Generics.to_tuple'.
407 --
408 instance Generic MLBBoxScoreRunsByInningsXml
409
410
411 instance ToDb MLBBoxScoreRunsByInningsXml where
412 -- | The database analogue of a 'MLBBoxScoreRunsByInningsXml' is
413 -- a 'MLBBoxScoreRunsByInnings'.
414 --
415 type Db MLBBoxScoreRunsByInningsXml = MLBBoxScoreRunsByInnings
416
417
418 instance Child MLBBoxScoreRunsByInningsXml where
419 -- | Each 'MLBBoxScoreRunsByInningsXml' is contained in (i.e. has a
420 -- foreign key to) a 'MLBBoxScoreTeamBreakdownXml'.
421 --
422 type Parent MLBBoxScoreRunsByInningsXml = MLBBoxScoreTeamBreakdown
423
424
425 instance FromXmlFk MLBBoxScoreRunsByInningsXml where
426 -- | To convert an 'MLBBoxScoreRunsByInningsXml' to an
427 -- 'MLBBoxScoreRunsByInnings', we add the foreign key and copy
428 -- everything else verbatim.
429 --
430 from_xml_fk fk MLBBoxScoreRunsByInningsXml{..} =
431 MLBBoxScoreRunsByInnings {
432 db_mlb_box_scores_team_breakdowns_id = fk,
433 db_runs_by_innings_inning_number = xml_runs_by_innings_inning_number,
434 db_runs_by_innings_runs = xml_runs_by_innings_runs }
435
436
437 -- | This allows us to insert the XML representation
438 -- 'MLBBoxScoreRunsByInningsXml' directly.
439 --
440 instance XmlImportFk MLBBoxScoreRunsByInningsXml
441
442
443
444
445 data MLBBoxScoreMiscPitchingStats = MLBBoxScoreMiscPitchingStats
446 data MLBBoxScoreMiscPitchingStatsXml =
447 MLBBoxScoreMiscPitchingStatsXml {
448 xml_wild_pitches :: Maybe Int,
449 xml_intentional_walks :: [MLBBoxScoreMiscPitchingStatsIntentionalWalkXml],
450 xml_hits_by_pitch :: [MLBBoxScoreMiscPitchingStatsHitByPitchXml] }
451 deriving (Eq, GHC.Generic, Show)
452
453
454 -- | For 'Generics.to_tuple'.
455 instance Generic MLBBoxScoreMiscPitchingStatsXml
456
457
458 data MLBBoxScoreMiscPitchingStatsIntentionalWalkXml =
459 MLBBoxScoreMiscPitchingStatsIntentionalWalkXml {
460 xml_iw_batter_id :: Int,
461 xml_iw_pitcher_id :: Int,
462 xml_iw_number_of_times_walked :: Int }
463 deriving (Eq, GHC.Generic, Show)
464
465
466 -- | For 'Generics.to_tuple'.
467 instance Generic MLBBoxScoreMiscPitchingStatsIntentionalWalkXml
468
469
470 data MLBBoxScoreMiscPitchingStatsHitByPitchXml =
471 MLBBoxScoreMiscPitchingStatsHitByPitchXml {
472 xml_hbp_batter_id :: Int,
473 xml_hbp_pitcher_id :: Int,
474 xml_hbp_number_of_times_hit :: Int }
475 deriving (Eq, GHC.Generic, Show)
476
477
478 -- | For 'Generics.to_tuple'.
479 --
480 instance Generic MLBBoxScoreMiscPitchingStatsHitByPitchXml
481
482
483 --
484 -- * Database
485 --
486
487 instance DbImport Message where
488 dbmigrate _ =
489 run_dbmigrate $ do
490 migrate (undefined :: MLBBoxScore)
491
492 -- | We insert the message.
493 dbimport m = do
494 -- First, get the vteam/hteam out of the XML message.
495 let vteam = Team (xml_vteam_id m) Nothing (Just $ xml_vteam m)
496 let hteam = Team (xml_hteam_id m) Nothing (Just $ xml_hteam m)
497
498 -- Insert them...
499 vteam_fk <- insert vteam
500 hteam_fk <- insert hteam
501
502 -- Now we can key the message to the teams/breakdowns we just
503 -- inserted.
504 let db_msg = from_xml_fk_teams undefined vteam_fk hteam_fk m
505 msg_id <- insert db_msg
506
507 -- Next, the vteam/hteam breakdowns, also needed to construct the
508 -- main message record
509 let vteam_bd = xml_away_team $ xml_game_breakdown m
510 let hteam_bd = xml_home_team $ xml_game_breakdown m
511
512 vteam_bd_fk <- insert_xml vteam_bd
513 hteam_bd_fk <- insert_xml hteam_bd
514
515 -- Insert the runs-by-innings associated with the vteam/hteam
516 -- breakdowns.
517 forM_ (xml_runs_by_innings vteam_bd) $ insert_xml_fk_ vteam_bd_fk
518 forM_ (xml_runs_by_innings hteam_bd) $ insert_xml_fk_ hteam_bd_fk
519
520 -- Now the join table record that ties the message to its two team
521 -- breakdowns.
522 let msg__breakdown = MLBBoxScore_MLBBoxScoreTeamBreakdown
523 msg_id
524 vteam_bd_fk
525 hteam_bd_fk
526
527 insert_ msg__breakdown
528
529 -- Now insert the homerun stats listings, keyed to the message.
530 -- They need not be present, but we're going to loop through them
531 -- all anyway, so if we have 'Nothing', we convert that to an
532 -- empty list instead. This simplifies the `forM_` code.
533 let listings = fromMaybe [] (xml_homerun_stats_listings m)
534 forM_ listings $ \listing -> do
535 -- Insert the listing itself.
536 listing_id <- insert_xml_fk msg_id listing
537 -- And all of its pitchers
538 forM_ (xml_pitchers listing) $ insert_xml_fk listing_id
539
540 return ImportSucceeded
541
542
543
544 mkPersist tsn_codegen_config [groundhog|
545 - entity: MLBBoxScore
546 dbName: mlb_box_scores
547 constructors:
548 - name: MLBBoxScore
549 uniques:
550 - name: unique_mlb_box_scores
551 type: constraint
552 # Prevent multiple imports of the same message.
553 fields: [db_xml_file_id]
554
555
556 - embedded: MLBBoxScoreHomerunStatsListingBatter
557 fields:
558 - name: db_batter_first_name
559 dbName: batter_first_name
560 - name: db_batter_last_name
561 dbName: batter_last_name
562 - name: db_batter_rbis
563 dbName: batter_rbis
564 - name: db_batter_id
565 dbName: batter_id
566
567 - entity: MLBBoxScoreHomerunStatsListing
568 dbName: mlb_box_score_homerun_stats_listings
569 constructors:
570 - name: MLBBoxScoreHomerunStatsListing
571 fields:
572 - name: db_batter
573 embeddedType:
574 - {name: batter_first_name, dbName: batter_first_name}
575 - {name: batter_last_name, dbName: batter_last_name}
576 - {name: batter_rbis, dbName: batter_rbis}
577 - {name: batter_id, dbName: batter_id}
578
579 - entity: MLBBoxScoreHomerunStatsListingPitcher
580 dbName: mlb_box_score_homerun_stats_listing_pitchers
581 constructors:
582 - name: MLBBoxScoreHomerunStatsListingPitcher
583 fields:
584 - name: db_mlb_box_score_homerun_stats_listings_id
585 reference:
586 onDelete: cascade
587
588 - entity: MLBBoxScoreTeamBreakdown
589 dbName: mlb_box_scores_team_breakdowns
590 constructors:
591 - name: MLBBoxScoreTeamBreakdown
592
593 - entity: MLBBoxScoreRunsByInnings
594 dbName: mlb_box_scores_team_breakdowns_runs_by_innings
595 constructors:
596 - name: MLBBoxScoreRunsByInnings
597 fields:
598 - name: db_mlb_box_scores_team_breakdowns_id
599 reference:
600 onDelete: cascade
601
602
603 - entity: MLBBoxScore_MLBBoxScoreTeamBreakdown
604 dbName: mlb_box_scores__mlb_box_scores_team_breakdowns
605 constructors:
606 - name: MLBBoxScore_MLBBoxScoreTeamBreakdown
607 fields:
608 - name: mLBBoxScore_MLBBoxScoreTeamBreakdown0
609 dbName: mlb_box_scores_id
610 reference:
611 onDelete: cascade
612 - name: mLBBoxScore_MLBBoxScoreTeamBreakdown1
613 dbName: mlb_box_scores_team_breakdowns_away_team_id
614 reference:
615 onDelete: cascade
616 - name: mLBBoxScore_MLBBoxScoreTeamBreakdown2
617 dbName: db_mlb_box_scores_team_breakdowns_home_team_id
618 reference:
619 onDelete: cascade
620 |]
621
622
623
624 --
625 -- * Pickling
626 --
627
628 pickle_message :: PU Message
629 pickle_message =
630 xpElem "message" $
631 xpWrap (from_tuple, to_tuple) $
632 xp23Tuple (xpElem "XML_File_ID" xpInt)
633 (xpElem "heading" xpText)
634 (xpElem "category" xpText)
635 (xpElem "sport" xpText)
636 (xpElem "game_id" xpInt)
637 (xpElem "schedule_id" xpInt)
638 (xpElem "vteam" xpText)
639 (xpElem "hteam" xpText)
640 (xpElem "vteam_id" xpText)
641 (xpElem "hteam_id" xpText)
642 (xpElem "Season" xpText)
643 (xpElem "SeasonType" xpText)
644 (xpElem "title" xpText)
645 (xpElem "Game_Date" xp_date)
646 (xpElem "Game_Time" xp_time)
647 (xpElem "GameNumber" xpInt)
648 (xpElem "Capacity" xpInt)
649 pickle_game_breakdown
650 (xpList pickle_team_summary)
651 pickle_misc_pitching_stats
652 (xpOption pickle_homerun_stats_listings)
653 pickle_miscellaneous_game_info
654 (xpElem "time_stamp" xp_time_stamp)
655 where
656 from_tuple = uncurryN Message
657
658
659 pickle_team_summary :: PU MLBBoxScoreTeamSummaryXml
660 pickle_team_summary =
661 xpElem "Team_Summary" $ xpWrap (from_tuple, to_tuple') $ xpUnit
662 where
663 from_tuple _ = MLBBoxScoreTeamSummaryXml
664 to_tuple' _ = ()
665
666 pickle_game_breakdown :: PU MLBBoxScoreGameBreakdownXml
667 pickle_game_breakdown =
668 xpElem "Game_Breakdown" $
669 xpWrap (from_tuple, to_tuple) $
670 xpPair pickle_away_team
671 pickle_home_team
672 where
673 from_tuple = uncurry MLBBoxScoreGameBreakdownXml
674
675
676 pickle_runs_by_innings :: PU MLBBoxScoreRunsByInningsXml
677 pickle_runs_by_innings =
678 xpElem "Runs_By_Innings" $
679 xpWrap (from_tuple, to_tuple) $
680 xpPair (xpAttr "Inning" xpInt)
681 xpInt
682 where
683 from_tuple = uncurry MLBBoxScoreRunsByInningsXml
684
685
686 pickle_team :: PU MLBBoxScoreTeamBreakdownXml
687 pickle_team =
688 xpWrap (from_tuple, to_tuple) $
689 xp4Tuple (xpList pickle_runs_by_innings)
690 (xpElem "Runs" xpInt)
691 (xpElem "Hits" xpInt)
692 (xpElem "Errors" xpInt)
693 where
694 from_tuple = uncurryN MLBBoxScoreTeamBreakdownXml
695
696
697 pickle_away_team :: PU MLBBoxScoreTeamBreakdownXml
698 pickle_away_team =
699 xpElem "AwayTeam" pickle_team
700
701 pickle_home_team :: PU MLBBoxScoreTeamBreakdownXml
702 pickle_home_team =
703 xpElem "HomeTeam" pickle_team
704
705
706 pickle_batter :: PU MLBBoxScoreHomerunStatsListingBatter
707 pickle_batter =
708 xpElem "HRS_Batter_ID" $
709 xpWrap (from_tuple, to_tuple) $
710 xp4Tuple (xpAttr "HRS_Batter_FirstName" $ xpText)
711 (xpAttr "HRS_Batter_LastName" $ xpText)
712 (xpAttr "RBIs" $ xpInt)
713 xpInt
714 where
715 from_tuple = uncurryN MLBBoxScoreHomerunStatsListingBatter
716
717
718 pickle_pitcher :: PU MLBBoxScoreHomerunStatsListingPitcherXml
719 pickle_pitcher =
720 xpElem "HRS_Pitcher_ID" $
721 xpWrap (from_tuple, to_tuple) $
722 xp4Tuple (xpAttr "HRS_Homeruns_Off_Pitcher" $ xpInt)
723 (xpAttr "HRS_Pitcher_FirstName" $ xpText)
724 (xpAttr "HRS_Pitcher_LastName" $ xpText)
725 xpInt
726 where
727 from_tuple = uncurryN MLBBoxScoreHomerunStatsListingPitcherXml
728
729
730 pickle_homerun_stats_listing :: PU MLBBoxScoreHomerunStatsListingXml
731 pickle_homerun_stats_listing =
732 xpElem "HRS_Listing" $
733 xpWrap (from_tuple, to_tuple) $
734 xpTriple pickle_batter
735 (xpElem "Season_Homeruns" xpInt)
736 (xpList pickle_pitcher)
737 where
738 from_tuple = uncurryN MLBBoxScoreHomerunStatsListingXml
739
740
741 pickle_homerun_stats_listings :: PU [MLBBoxScoreHomerunStatsListingXml]
742 pickle_homerun_stats_listings =
743 xpElem "Homerun_Stats" $ xpList pickle_homerun_stats_listing
744
745
746 pickle_misc_pitching_stats :: PU MLBBoxScoreMiscPitchingStatsXml
747 pickle_misc_pitching_stats =
748 xpElem "Misc_Pitching_Stats" $
749 xpWrap (from_tuple, to_tuple) $
750 xpTriple (xpOption $ xpElem "Wild_Pitches" xpInt)
751 pickle_intentional_walks
752 pickle_hits_by_pitch
753 where
754 from_tuple = uncurryN MLBBoxScoreMiscPitchingStatsXml
755
756
757
758 pickle_intentional_walks :: PU [MLBBoxScoreMiscPitchingStatsIntentionalWalkXml]
759 pickle_intentional_walks =
760 xpElem "Intentional_Walks" $ xpList $ xpElem "IW_Listing" $
761 xpWrap (from_tuple, to_tuple) $
762 xpTriple (xpElem "IW_Batter_ID" xpInt)
763 (xpElem "IW_Pitcher_ID" xpInt)
764 (xpElem "IW_Number_Of_Times_Walked" xpInt)
765 where
766 from_tuple = uncurryN MLBBoxScoreMiscPitchingStatsIntentionalWalkXml
767
768
769
770 pickle_hits_by_pitch :: PU [MLBBoxScoreMiscPitchingStatsHitByPitchXml]
771 pickle_hits_by_pitch =
772 xpElem "Hit_By_Pitch" $ xpList $ xpElem "HBP_Listing" $
773 xpWrap (from_tuple, to_tuple) $
774 xpTriple (xpElem "HBP_Batter_ID" xpInt)
775 (xpElem "HBP_Pitcher_ID" xpInt)
776 (xpElem "HBP_Number_Of_Times_Hit" xpInt)
777 where
778 from_tuple = uncurryN MLBBoxScoreMiscPitchingStatsHitByPitchXml
779
780
781
782 pickle_miscellaneous_game_info :: PU MLBBoxScoreMiscellaneousGameInfoXml
783 pickle_miscellaneous_game_info =
784 xpElem "Miscelaneous_Game_Info" $ xpWrap (from_tuple, to_tuple') $ xpUnit
785 where
786 from_tuple _ = MLBBoxScoreMiscellaneousGameInfoXml
787 to_tuple' _ = ()