From: Michael Orlitzky Date: Fri, 4 Jul 2014 07:07:37 +0000 (-0400) Subject: Create a direct relationship between the Odds games and teams. X-Git-Tag: 0.0.6~39 X-Git-Url: https://gitweb.michael.orlitzky.com/?a=commitdiff_plain;h=775620685401dce01bbd2d715450ab101a8ec56a;p=dead%2Fhtsn-import.git Create a direct relationship between the Odds games and teams. Update the Odds_XML dbschema diagram. --- diff --git a/doc/dbschema/Odds_XML.png b/doc/dbschema/Odds_XML.png index d0fb979..63f822c 100644 Binary files a/doc/dbschema/Odds_XML.png and b/doc/dbschema/Odds_XML.png differ diff --git a/src/TSN/XML/Odds.hs b/src/TSN/XML/Odds.hs index c4f0026..4ca6475 100644 --- a/src/TSN/XML/Odds.hs +++ b/src/TSN/XML/Odds.hs @@ -18,7 +18,6 @@ module TSN.XML.Odds ( -- * WARNING: these are private but exported to silence warnings OddsCasinoConstructor(..), OddsConstructor(..), - OddsGame_TeamConstructor(..), OddsGameConstructor(..), OddsGameLineConstructor(..) ) where @@ -66,11 +65,11 @@ import TSN.Codegen ( import TSN.DbImport ( DbImport(..), ImportResult(..), run_dbmigrate ) import TSN.Picklers ( xp_date_padded, xp_time, xp_time_stamp ) import TSN.Team ( Team(..) ) -import TSN.XmlImport ( XmlImport(..), XmlImportFk(..) ) +import TSN.XmlImport ( XmlImport(..), XmlImportFkTeams(..) ) import Xml ( Child(..), FromXml(..), - FromXmlFk(..), + FromXmlFkTeams(..), ToDb(..), pickle_unpickle, unpickleable, @@ -239,16 +238,6 @@ instance FromXml OddsGameAwayTeamXml where instance XmlImport OddsGameAwayTeamXml where --- * OddsGame_OddsGameTeam - --- | Database mapping between games and their home/away teams. --- -data OddsGame_Team = - OddsGame_Team { - ogt_odds_games_id :: DefaultKey OddsGame, - ogt_away_team_id :: DefaultKey Team, - ogt_home_team_id :: DefaultKey Team } - -- * OddsGameOverUnderXml @@ -291,6 +280,8 @@ data OddsGameLine = data OddsGame = OddsGame { db_odds_id :: DefaultKey Odds, + db_away_team_id :: DefaultKey Team, + db_home_team_id :: DefaultKey Team, db_game_id :: Int, db_game_time :: UTCTime, -- ^ Contains both the date and time. db_away_team_rotation_number :: Int, @@ -334,14 +325,17 @@ instance Child OddsGameXml where type Parent OddsGameXml = Odds -instance FromXmlFk OddsGameXml where +instance FromXmlFkTeams OddsGameXml where -- | To convert from the XML representation to the database one, we - -- drop the home/away teams and the casino lines, but retain the - -- home/away rotation numbers and the starters. + -- drop the casino lines, but retain the home/away rotation + -- numbers and the starters. The foreign keys to 'Odds' and the + -- home/away teams are passed in. -- - from_xml_fk fk OddsGameXml{..} = + from_xml_fk_teams fk fk_away fk_home OddsGameXml{..} = OddsGame { - db_odds_id = fk, + db_odds_id = fk, + db_away_team_id = fk_away, + db_home_team_id = fk_home, db_game_id = xml_game_id, db_game_time = UTCTime @@ -369,7 +363,7 @@ instance FromXmlFk OddsGameXml where -- | This lets us insert the XML representation 'OddsGameXml' directly. -- -instance XmlImportFk OddsGameXml +instance XmlImportFkTeams OddsGameXml -- * OddsGameWithNotes @@ -495,6 +489,12 @@ mkPersist tsn_codegen_config [groundhog| - name: db_odds_id reference: onDelete: cascade + - name: db_away_team_id + reference: + onDelete: cascade + - name: db_home_team_id + reference: + onDelete: cascade - entity: OddsGameLine dbName: odds_games_lines @@ -508,20 +508,6 @@ mkPersist tsn_codegen_config [groundhog| reference: onDelete: cascade -- entity: OddsGame_Team - dbName: odds_games__teams - constructors: - - name: OddsGame_Team - fields: - - name: ogt_odds_games_id - reference: - onDelete: cascade - - name: ogt_away_team_id - reference: - onDelete: cascade - - name: ogt_home_team_id - reference: - onDelete: cascade |] instance DbImport Message where @@ -531,34 +517,25 @@ instance DbImport Message where migrate (undefined :: Odds) migrate (undefined :: OddsCasino) migrate (undefined :: OddsGame) - migrate (undefined :: OddsGame_Team) migrate (undefined :: OddsGameLine) dbimport m = do -- Insert the root "odds" element and acquire its primary key (id). odds_id <- insert_xml m - forM_ (xml_games m) $ \g -> do - -- First insert the game, keyed to the "odds", - game_id <- insert_xml_fk odds_id g - - -- Next, we insert the home and away teams. - away_team_id <- insert_xml_or_select (xml_away_team g) - home_team_id <- insert_xml_or_select (xml_home_team g) + forM_ (xml_games m) $ \game -> do + -- First we insert the home and away teams. + away_team_id <- insert_xml_or_select (xml_away_team game) + home_team_id <- insert_xml_or_select (xml_home_team game) - -- Insert a record into odds_games__teams mapping the - -- home/away teams to this game. Use the full record syntax - -- because the types would let us mix up the home/away teams. - insert_ OddsGame_Team { - ogt_odds_games_id = game_id, - ogt_away_team_id = away_team_id, - ogt_home_team_id = home_team_id } + -- Now insert the game, keyed to the "odds" and its teams. + game_id <- insert_xml_fk_teams odds_id away_team_id home_team_id game - -- Finaly, we insert the lines. The over/under entries for this + -- Finally, we insert the lines. The over/under entries for this -- game and the lines for the casinos all wind up in the same -- table, odds_games_lines. We can insert the over/under entries -- freely with empty away/home lines: - forM_ (xml_over_under_casinos g) $ \c -> do + forM_ (xml_over_under_casinos game) $ \c -> do -- Start by inderting the casino. ou_casino_id <- insert_xml_or_select c @@ -575,7 +552,7 @@ instance DbImport Message where -- ...but then when we insert the home/away team lines, we -- prefer to update the existing entry rather than overwrite it -- or add a new record. - forM_ (xml_away_team_casinos $ xml_away_team g) $ \c -> do + forM_ (xml_away_team_casinos $ xml_away_team game) $ \c -> do -- insert, or more likely retrieve the existing, casino a_casino_id <- insert_xml_or_select c @@ -587,7 +564,7 @@ instance DbImport Message where Ogl_Odds_Casinos_Id ==. a_casino_id -- Repeat all that for the home team. - forM_ (xml_home_team_casinos $ xml_home_team g) $ \c ->do + forM_ (xml_home_team_casinos $ xml_home_team game) $ \c ->do h_casino_id <- insert_xml_or_select c let home_line = home_away_line c update [Ogl_Home_Line =. home_line] $ -- WHERE @@ -851,8 +828,7 @@ test_on_delete_cascade = testGroup "cascading delete tests" let b = undefined :: Odds let c = undefined :: OddsCasino let d = undefined :: OddsGame - let e = undefined :: OddsGame_Team - let f = undefined :: OddsGameLine + let e = undefined :: OddsGameLine actual <- withSqliteConn ":memory:" $ runDbConn $ do runMigration silentMigrationLogger $ do migrate a @@ -860,7 +836,6 @@ test_on_delete_cascade = testGroup "cascading delete tests" migrate c migrate d migrate e - migrate f _ <- dbimport odds deleteAll b count_a <- countAll a @@ -868,7 +843,6 @@ test_on_delete_cascade = testGroup "cascading delete tests" count_c <- countAll c count_d <- countAll d count_e <- countAll e - count_f <- countAll f return $ sum [count_a, count_b, count_c, - count_d, count_e, count_f ] + count_d, count_e ] actual @?= expected