{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
--- | Parse TSN XML for the DTD "Odds_XML.dtd". Each document contains
--- a root element \<message\> that contains a bunch of other
--- unorganized crap.
+-- | Parse TSN XML for the DTD \"Odds_XML.dtd\". Each document
+-- contains a root element \<message\> that contains a bunch of
+-- other... disorganized... information.
--
module TSN.XML.Odds (
pickle_message,
-- | The casinos should have their own table, but the lines don't
--- belong in that table (there should be another table joining the
--- casinos and the thing the lines are for together.)
+-- belong in that table (there is a separate table for
+-- 'OddsGameLine' which associates the two).
--
--- We drop the 'Game' prefix because the Casinos really aren't
+-- We drop the \"Game\" prefix because the casinos really aren't
-- children of the games; the XML just makes it seem that way.
--
data OddsCasino =
instance FromXml OddsGameCasinoXml where
-- | We convert from XML to the database by dropping the line field.
+ --
from_xml OddsGameCasinoXml{..} =
OddsCasino {
casino_client_id = xml_casino_client_id,
casino_name = xml_casino_name }
--- | This allows us to call 'insert_xml' on an 'OddsGameCasinoXml'
--- without first converting it to the database representation.
+-- | This allows us to insert the XML representation 'OddsGameCasinoXml'
+-- directly.
+--
instance XmlImport OddsGameCasinoXml
db_abbr = xml_home_abbr,
db_team_name = xml_home_team_name }
--- | XmlImport allows us to call 'insert_xml' directly on an
--- 'OddsGameHomeTeamXml' without explicitly converting it to the
--- associated database type.
+-- | This allows us to insert the XML representation
+-- 'OddsGameHomeTeamXml' directly.
--
instance XmlImport OddsGameHomeTeamXml where
xml_away_abbr
xml_away_team_name
--- | XmlImport allows us to call 'insert_xml' directly on an
--- 'OddsGameAwayTeamXml' without explicitly converting it to the
--- associated database type.
+-- | This allows us to insert the XML representation
+-- 'OddsGameAwayTeamXml' directly.
--
instance XmlImport OddsGameAwayTeamXml where
-- * OddsGame_OddsGameTeam
-- | Database mapping between games and their home/away teams.
+--
data OddsGame_OddsGameTeam =
OddsGame_OddsGameTeam {
ogogt_odds_games_id :: DefaultKey OddsGame,
-- | This database representation of the casino lines can't be
-- constructed from the one in the XML. The casinos within
--- Game>HomeTeam, Game>AwayTeam, and Game>Over_Under are all more or
+-- Game-\>HomeTeam, Game-\>AwayTeam, and Game-\>Over_Under are all more or
-- less the same. We don't need a bajillion different tables to
-- store that, just one tying the casino/game pair to the three
-- lines.
db_game_home_team_rotation_number :: Int }
--- | XML representation of a game.
+-- | XML representation of an 'OddsGame'.
--
data OddsGameXml =
OddsGameXml {
type Db OddsGameXml = OddsGame
instance FromXmlFk OddsGameXml where
+ -- | Each 'OddsGameXml' is contained in an 'Odds'. In other words
+ -- the foreign key for 'OddsGame' points to an 'Odds'.
+ --
type Parent OddsGameXml = Odds
-- | To convert from the XML representation to the database one, we
db_game_home_team_rotation_number =
(xml_home_rotation_number xml_game_home_team) }
--- | This lets us call 'insert_xml_fk' directly on an 'OddsGameXml'
--- without converting it to the database representation explicitly.
+-- | This lets us insert the XML representation 'OddsGameXml' directly.
--
instance XmlImportFk OddsGameXml
-- | This is our best guess at what occurs in the Odds_XML
-- documents. It looks like each consecutive set of games can
--- optionally have some notes appear before it. Each "note" comes as
--- its own <Notes>...</Notes> element.
+-- optionally have some notes appear before it. Each \"note\" comes
+-- as its own \<Notes\>...\</Notes\> element.
--
-- The notes are ignored completely in the database; we only bother
-- with them to ensure that we're (un)pickling correctly.
--
--- We can't group the notes with a "set" of 'OddsGame's, because that
--- leads to ambiguity in parsing. Since we're going to ignore the
--- notes anyway, we just stick them with an arbitrary game. C'est la
--- vie.
+-- We can't group the notes with a \"set\" of 'OddsGame's, because
+-- that leads to ambiguity in parsing. Since we're going to ignore
+-- the notes anyway, we just stick them with an arbitrary
+-- game. C'est la vie.
--
data OddsGameWithNotes =
OddsGameWithNotes {
-- * Odds/Message
--- | Database and representation of the top-level Odds object (a
--- 'Message').
+-- | Database representation of a 'Message'.
+--
data Odds =
Odds {
db_xml_file_id :: Int,
-- | The XML representation of 'Odds'.
+--
data Message =
Message {
xml_xml_file_id :: Int,
db_line_time = xml_line_time,
db_time_stamp = xml_time_stamp }
--- | This lets us call 'insert_xml' on a Message directly, without
--- having to convert it to its database representation explicitly.
+-- | This lets us insert the XML representation 'Message' directly.
--
instance XmlImport Message
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
--- | Parse TSN XML for the DTD "weatherxml.dtd". Each document
+-- | Parse TSN XML for the DTD \"weatherxml.dtd\". Each document
-- contains a bunch of forecasts, which each contain one league, and
-- that league contains a bunch of listings.
--
-- DB/XML Data types
--
+-- * WeatherForecastListing/WeatherForecastListingXml
+
-- | XML representation of a weather forecast listing.
--
data WeatherForecastListingXml =
instance ToDb WeatherForecastListingXml where
type Db WeatherForecastListingXml = WeatherForecastListing
--- | This is needed to define the XmlImport instance for
--- 'WeatherForecastListing'.
+-- | This is needed to define the 'XmlImportFk' instance for
+-- 'WeatherForecastListing'.
--
instance FromXmlFk WeatherForecastListingXml where
+ -- | Each 'WeatherForecastListingXml' is contained in a
+ -- 'WeatherForecast'.
+ --
type Parent WeatherForecastListingXml = WeatherForecast
from_xml_fk fk WeatherForecastListingXml{..} =
db_teams = xml_teams,
db_weather = xml_weather }
--- | Allows us to call 'insert_xml' on the XML representation of
--- WeatherForecastListing.
+-- | This allows us to insert the XML representation
+-- 'WeatherForecastListingXml' directly.
--
instance XmlImportFk WeatherForecastListingXml
+-- * WeatherLeague
+
-- | XML representation of a league, as they appear in the weather
-- documents. There is no associated database representation because
-- the league element really adds no information besides its own
listings :: [WeatherForecastListingXml] }
deriving (Eq, Show)
+
+-- * WeatherForecast/WeatherForecastXml
+
-- | Database representation of a weather forecast.
--
data WeatherForecast =
instance XmlImportFk WeatherForecastXml
+-- * Weather/Message
+
-- | The database representation of a weather message.
--
data Weather =
db_title = xml_title,
db_time_stamp = xml_time_stamp }
--- | This allows us to call 'insert_xml' on a 'Message' without first
--- converting it to the database representation.
+-- | This allows us to insert the XML representation 'Message'
+-- directly.
--
instance XmlImport Message
+--
+-- Database stuff
+--
+
mkPersist tsn_codegen_config [groundhog|
- entity: Weather
constructors:
return ImportSucceeded
+---
+--- Pickling
+---
-- | Pickler to convert a 'WeatherForecastListingXml' to/from XML.
--