From 2dd1ab7a375b55632f6c8165dce97a2df3cc1907 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Fri, 4 Jul 2014 01:56:42 -0400 Subject: [PATCH] Finish the documentation for ScheduleChanges. Finalize the schema for ScheduleChanges. Add the Schedule_Changes_XML schema diagram. Remove pointless "team_" prefix from two Team fields. Update Odds/JFile for the Team changes. --- doc/dbschema/Schedule_Changes_XML.png | Bin 0 -> 76849 bytes src/TSN/Team.hs | 12 +- src/TSN/XML/JFile.hs | 8 +- src/TSN/XML/Odds.hs | 4 +- src/TSN/XML/ScheduleChanges.hs | 153 +++++++++++++------------- 5 files changed, 91 insertions(+), 86 deletions(-) create mode 100644 doc/dbschema/Schedule_Changes_XML.png diff --git a/doc/dbschema/Schedule_Changes_XML.png b/doc/dbschema/Schedule_Changes_XML.png new file mode 100644 index 0000000000000000000000000000000000000000..1cec34e5b766bced5c372438e4bea8702b9ca834 GIT binary patch literal 76849 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 M7+Ib!K|9C%2b%DQ`2YX_ literal 0 HcmV?d00001 diff --git a/src/TSN/Team.hs b/src/TSN/Team.hs index 910c671..36d58ca 100644 --- a/src/TSN/Team.hs +++ b/src/TSN/Team.hs @@ -28,15 +28,17 @@ import Database.Groundhog.TH ( -- | The database representation of a team. The 'team_id' is a -- 'String' field because some teams do in fact have ids like --- \"B52\". +-- \"B52\". The pointless \"team_\" prefix is left on the 'team_id' +-- field because otherwise the auto-generated column name would +-- conflict with the default \"id\" primary key. -- data Team = Team { team_id :: String, -- ^ Some of them contain characters - team_abbreviation :: Maybe String, -- ^ Some teams don't have abbreviations, - -- or at least, some sample jfilexml - -- don't have them for some teams. - team_name :: Maybe String -- ^ Some teams don't even have names! + abbreviation :: Maybe String, -- ^ Some teams don't have abbreviations, + -- or at least, some sample jfilexml + -- don't have them for some teams. + name :: Maybe String -- ^ Some teams don't even have names! } deriving (Eq, Show) diff --git a/src/TSN/XML/JFile.hs b/src/TSN/XML/JFile.hs index d2ac6f4..fa37e7c 100644 --- a/src/TSN/XML/JFile.hs +++ b/src/TSN/XML/JFile.hs @@ -174,8 +174,8 @@ instance FromXml JFileGameAwayTeamXml where from_xml JFileGameAwayTeamXml{..} = Team { team_id = away_team_id, - team_abbreviation = away_team_abbreviation, - team_name = away_team_name } + abbreviation = away_team_abbreviation, + name = away_team_name } -- | Allow us to import JFileGameAwayTeamXml directly. instance XmlImport JFileGameAwayTeamXml @@ -204,8 +204,8 @@ instance FromXml JFileGameHomeTeamXml where from_xml JFileGameHomeTeamXml{..} = Team { team_id = home_team_id, - team_abbreviation = home_team_abbreviation, - team_name = home_team_name } + abbreviation = home_team_abbreviation, + name = home_team_name } -- | Allow us to import JFileGameHomeTeamXml directly. instance XmlImport JFileGameHomeTeamXml diff --git a/src/TSN/XML/Odds.hs b/src/TSN/XML/Odds.hs index 2ad2d93..0e84ce6 100644 --- a/src/TSN/XML/Odds.hs +++ b/src/TSN/XML/Odds.hs @@ -187,8 +187,8 @@ instance FromXml OddsGameHomeTeamXml where from_xml OddsGameHomeTeamXml{..} = Team { team_id = xml_home_team_id, - team_abbreviation = Just xml_home_team_abbr, - team_name = Just xml_home_team_name } + abbreviation = Just xml_home_team_abbr, + name = Just xml_home_team_name } -- | This allows us to insert the XML representation -- 'OddsGameHomeTeamXml' directly. diff --git a/src/TSN/XML/ScheduleChanges.hs b/src/TSN/XML/ScheduleChanges.hs index b3d134e..5f0eff2 100644 --- a/src/TSN/XML/ScheduleChanges.hs +++ b/src/TSN/XML/ScheduleChanges.hs @@ -18,8 +18,7 @@ module TSN.XML.ScheduleChanges ( schedule_changes_tests, -- * WARNING: these are private but exported to silence warnings ScheduleChangesConstructor(..), - ScheduleChangesListingConstructor(..), - ScheduleChangesListing_TeamConstructor(..) ) + ScheduleChangesListingConstructor(..) ) where -- System imports. @@ -29,7 +28,6 @@ import Data.Tuple.Curry ( uncurryN ) import Database.Groundhog ( countAll, deleteAll, - insert, insert_, migrate, runMigration, @@ -59,7 +57,7 @@ import Text.XML.HXT.Core ( import TSN.Codegen ( tsn_codegen_config ) import TSN.DbImport ( DbImport(..), ImportResult(..), run_dbmigrate ) -import TSN.Picklers ( xp_date_padded, xp_time, xp_time_stamp ) +import TSN.Picklers ( xp_date_padded, xp_tba_time, xp_time_stamp ) import TSN.Team ( Team(..) ) import TSN.XmlImport ( XmlImport(..) ) import Xml ( @@ -71,7 +69,8 @@ import Xml ( --- | The DTD to which this module corresponds. Used to invoke dbimport. +-- | The DTD to which this module corresponds. Used to invoke +-- 'dbimport'. -- dtd :: String dtd = "Schedule_Changes_XML.dtd" @@ -161,7 +160,7 @@ instance XmlImport Message data ScheduleChangesListingStatus = ScheduleChangesListingStatus { db_status_numeral :: Int, - db_status :: Maybe String } + db_status :: Maybe String } -- Yes, they can be empty. deriving (Eq, Show) @@ -170,8 +169,7 @@ data ScheduleChangesListingStatus = -- to the database, we drop the intermediate \ -- leaving the listing keyed to the 'ScheduleChanges' itself. -- --- The home/away teams reuse the 'Team' representation and are --- connected via 'ScheduleChangesListing_Team'. +-- The home/away teams reuse the 'Team' representation. -- -- The sport name (sc_sport) is pulled out of the containing -- \ and embedded into the listings themselves. @@ -179,11 +177,13 @@ data ScheduleChangesListingStatus = data ScheduleChangesListing = ScheduleChangesListing { db_schedule_changes_id :: DefaultKey ScheduleChanges, + db_away_team_id :: DefaultKey Team, + db_home_team_id ::DefaultKey Team, db_type :: String, db_sc_sport :: String, db_schedule_id :: Int, db_game_time :: UTCTime, - db_location :: String, + db_location :: Maybe String, db_vscore :: Int, db_hscore :: Int, db_listing_status :: ScheduleChangesListingStatus, @@ -198,8 +198,8 @@ data ScheduleChangesListingXml = xml_type :: String, xml_schedule_id :: Int, xml_game_date :: UTCTime, - xml_game_time :: UTCTime, - xml_location :: String, + xml_game_time :: Maybe UTCTime, + xml_location :: Maybe String, xml_away_team :: ScheduleChangesListingAwayTeamXml, xml_home_team :: ScheduleChangesListingHomeTeamXml, xml_vscore :: Int, @@ -218,17 +218,25 @@ instance ToDb ScheduleChangesListingXml where -- | We don't make 'ScheduleChangesListingXml' an instance of --- 'FromXmlFk' or 'XmlImportFk' because it needs some additional --- information, namely the sport name from its containing --- \. +-- 'FromXmlFkTeams' because it needs some additional information, +-- namely the sport name from its containing \. +-- But essentially we'll need to do the same thing as +-- 'from_xml_fk_teams'. This function accomplishes the same thing, +-- with the addition of the sport that's passed in. +-- +-- The parameter order is for convenience later (see dbimport). -- from_xml_fk_sport :: (DefaultKey ScheduleChanges) - -> String + -> String -- ^ The sport from our containing schedule change + -> (DefaultKey Team) -- ^ Away team FK + -> (DefaultKey Team) -- ^ Home team FK -> ScheduleChangesListingXml -> ScheduleChangesListing -from_xml_fk_sport fk sport ScheduleChangesListingXml{..} = +from_xml_fk_sport fk sport fk_away fk_home ScheduleChangesListingXml{..} = ScheduleChangesListing { db_schedule_changes_id = fk, + db_away_team_id = fk_away, + db_home_team_id = fk_home, db_type = xml_type, db_sc_sport = sport, db_schedule_id = xml_schedule_id, @@ -238,25 +246,14 @@ from_xml_fk_sport fk sport ScheduleChangesListingXml{..} = db_hscore = xml_hscore, db_listing_status = xml_listing_status, db_notes = xml_notes } - where -- | Make the database \"game time\" from the XML -- date/time. Simply take the day part from one and the time -- from the other. -- - make_game_time d t = UTCTime (utctDay d) (utctDayTime t) - - - --- * ScheduleChangesListing_Team + make_game_time d Nothing = d + make_game_time d (Just t) = UTCTime (utctDay d) (utctDayTime t) --- | Database mapping between listings and their home/away teams. --- -data ScheduleChangesListing_Team = - ScheduleChangesListing_Team { - sclt_schedule_changes_listings_id :: DefaultKey ScheduleChangesListing, - sclt_away_team_id :: DefaultKey Team, - sclt_home_team_id :: DefaultKey Team } -- * ScheduleChangesListingAwayTeamXml / ScheduleChangesListingHomeTeamXml @@ -265,30 +262,33 @@ data ScheduleChangesListing_Team = -- team. Its corresponding database representation (along with that -- of the home team) is a "TSN.Team", but their XML representations -- are different. +-- data ScheduleChangesListingAwayTeamXml = ScheduleChangesListingAwayTeamXml { away_team_id :: String, - away_team_name :: String } + away_team_name :: Maybe String } deriving (Eq, Show) + instance ToDb ScheduleChangesListingAwayTeamXml where -- | The database analogue of an 'ScheduleChangesListingAwayTeamXml' is -- a 'Team'. -- type Db ScheduleChangesListingAwayTeamXml = Team + instance FromXml ScheduleChangesListingAwayTeamXml where -- | To convert a 'ScheduleChangesListingAwayTeamXml' to a 'Team', - -- we set the non-existent abbreviation to \"Nothing\" and wrap - -- the always-present name field in \"Just\". + -- we set the non-existent abbreviation to \"Nothing\". -- from_xml ScheduleChangesListingAwayTeamXml{..} = Team { team_id = away_team_id, - team_abbreviation = Nothing, - team_name = Just away_team_name } + abbreviation = Nothing, + name = away_team_name } -- | Allow us to import ScheduleChangesListingAwayTeamXml directly. +-- instance XmlImport ScheduleChangesListingAwayTeamXml @@ -300,27 +300,30 @@ instance XmlImport ScheduleChangesListingAwayTeamXml data ScheduleChangesListingHomeTeamXml = ScheduleChangesListingHomeTeamXml { home_team_id :: String, - home_team_name :: String } + home_team_name :: Maybe String } deriving (Eq, Show) + instance ToDb ScheduleChangesListingHomeTeamXml where -- | The database analogue of an 'ScheduleChangesListingHomeTeamXml' -- is a 'Team'. -- type Db ScheduleChangesListingHomeTeamXml = Team + instance FromXml ScheduleChangesListingHomeTeamXml where -- | To convert a 'ScheduleChangesListingHomeTeamXml' to a 'Team', - -- we set the non-existent abbreviation to \"Nothing\" and wrap - -- the always-present name field in \"Just\". + -- we set the non-existent abbreviation to \"Nothing\". -- from_xml ScheduleChangesListingHomeTeamXml{..} = Team { team_id = home_team_id, - team_abbreviation = Nothing, - team_name = Just home_team_name } + abbreviation = Nothing, + name = home_team_name } + -- | Allow us to import ScheduleChangesListingHomeTeamXml directly. +-- instance XmlImport ScheduleChangesListingHomeTeamXml @@ -334,7 +337,6 @@ instance DbImport Message where migrate (undefined :: Team) migrate (undefined :: ScheduleChanges) migrate (undefined :: ScheduleChangesListing) - migrate (undefined :: ScheduleChangesListing_Team) dbimport m = do -- Insert the top-level message @@ -343,25 +345,20 @@ instance DbImport Message where -- Now loop through the message's schedule changes forM_ (xml_schedule_changes m) $ \sc -> do -- Construct the function that will turn an XML listing into a DB one. + -- This is only partially applied without the away/home team IDs. let listing_xml_to_db = from_xml_fk_sport msg_id (xml_sc_sport sc) -- Now loop through the listings so that we can handle the teams -- one listing at a time. forM_ (xml_sc_listings sc) $ \listing -> do - let db_listing = listing_xml_to_db listing - listing_id <- insert db_listing - away_team_id <- insert_xml_or_select (xml_away_team listing) home_team_id <- insert_xml_or_select (xml_home_team listing) - -- Insert a record into schedule_changes_listings__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_ ScheduleChangesListing_Team { - sclt_schedule_changes_listings_id = listing_id, - sclt_away_team_id = away_team_id, - sclt_home_team_id = home_team_id } + -- Finish constructing the xml -> db function. + let listing_xml_to_db' = listing_xml_to_db away_team_id home_team_id + let db_listing = listing_xml_to_db' listing + + insert_ db_listing return ImportSucceeded @@ -377,7 +374,7 @@ mkPersist tsn_codegen_config [groundhog| # Prevent multiple imports of the same message. fields: [db_xml_file_id] - +# Note: we drop the "sc" prefix from the db_sc_sport field. - entity: ScheduleChangesListing dbName: schedule_changes_listings constructors: @@ -386,6 +383,18 @@ mkPersist tsn_codegen_config [groundhog| - name: db_schedule_changes_id reference: onDelete: cascade + - name: db_away_team_id + reference: + onDelete: cascade + - name: db_home_team_id + reference: + onDelete: cascade + - name: db_sc_sport + dbName: sport + - name: db_listing_status + embeddedType: + - {name: status_numeral, dbName: status_numeral} + - {name: status, dbName: status} - embedded: ScheduleChangesListingStatus fields: @@ -394,21 +403,6 @@ mkPersist tsn_codegen_config [groundhog| - name: db_status dbName: status - -- entity: ScheduleChangesListing_Team - dbName: schedule_changes_listings__teams - constructors: - - name: ScheduleChangesListing_Team - fields: - - name: sclt_schedule_changes_listings_id - reference: - onDelete: cascade - - name: sclt_away_team_id - reference: - onDelete: cascade - - name: sclt_home_team_id - reference: - onDelete: cascade |] @@ -417,29 +411,36 @@ mkPersist tsn_codegen_config [groundhog| -- * Pickling -- +-- | An (un)pickler for the \ elements. +-- pickle_away_team :: PU ScheduleChangesListingAwayTeamXml pickle_away_team = xpElem "Away_Team" $ xpWrap (from_tuple, to_tuple) $ xpPair (xpAttr "AT_ID" xpText) - xpText + (xpOption xpText) where from_tuple = uncurry ScheduleChangesListingAwayTeamXml to_tuple t = (away_team_id t, away_team_name t) + +-- | An (un)pickler for the \ elements. +-- pickle_home_team :: PU ScheduleChangesListingHomeTeamXml pickle_home_team = xpElem "Home_Team" $ xpWrap (from_tuple, to_tuple) $ xpPair (xpAttr "HT_ID" xpText) - xpText + (xpOption xpText) where from_tuple = uncurry ScheduleChangesListingHomeTeamXml to_tuple t = (home_team_id t, home_team_name t) +-- | An (un)pickler for the \ elements. +-- pickle_status :: PU ScheduleChangesListingStatus pickle_status = xpElem "status" $ @@ -452,6 +453,8 @@ pickle_status = db_status s) +-- | An (un)pickler for the \ elements. +-- pickle_listing :: PU ScheduleChangesListingXml pickle_listing = xpElem "SC_Listing" $ @@ -459,8 +462,8 @@ pickle_listing = xp11Tuple (xpAttr "type" xpText) (xpElem "Schedule_ID" xpInt) (xpElem "Game_Date" xp_date_padded) - (xpElem "Game_Time" xp_time) - (xpElem "Location" xpText) + (xpElem "Game_Time" xp_tba_time) + (xpElem "Location" (xpOption xpText)) pickle_away_team pickle_home_team (xpElem "vscore" xpInt) @@ -481,6 +484,9 @@ pickle_listing = xml_listing_status l, xml_notes l) + +-- | An (un)pickler for the \ elements. +-- pickle_schedule_change :: PU ScheduleChangeXml pickle_schedule_change = xpElem "Schedule_Change" $ @@ -566,21 +572,18 @@ test_on_delete_cascade = let a = undefined :: Team let b = undefined :: ScheduleChanges let c = undefined :: ScheduleChangesListing - let d = undefined :: ScheduleChangesListing_Team actual <- withSqliteConn ":memory:" $ runDbConn $ do runMigration silentMigrationLogger $ do migrate a migrate b migrate c - migrate d _ <- dbimport results deleteAll b count_a <- countAll a count_b <- countAll b count_c <- countAll c - count_d <- countAll d - return $ sum [count_a, count_b, count_c, count_d] + return $ sum [count_a, count_b, count_c] let expected = 12 -- There are 16 team elements, but 4 are dupes, -- so 12 unique teams should be left over. actual @?= expected -- 2.43.2