X-Git-Url: https://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FTSN%2FXML%2FAutoRacingResults.hs;h=e540e06a8d4ceae7842f0e3886c26d99d8437a90;hb=c04989ba059270be9fa40ed3ecf156c92398b550;hp=e7ab014e50579c77fe9488639bd42549ce75f3b6;hpb=6d0766209118bd725438d24620d3ac2ffa374fd8;p=dead%2Fhtsn-import.git diff --git a/src/TSN/XML/AutoRacingResults.hs b/src/TSN/XML/AutoRacingResults.hs index e7ab014..e540e06 100644 --- a/src/TSN/XML/AutoRacingResults.hs +++ b/src/TSN/XML/AutoRacingResults.hs @@ -1,4 +1,5 @@ {-# LANGUAGE DeriveDataTypeable #-} +{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE QuasiQuotes #-} @@ -24,9 +25,11 @@ where -- System imports. import Control.Monad ( forM_ ) import Data.Data ( Data ) +import Data.Maybe ( fromMaybe ) import Data.Time ( UTCTime(..) ) import Data.Tuple.Curry ( uncurryN ) import Data.Typeable ( Typeable ) +import qualified Data.Vector.HFixed as H ( HVector, cons, convert ) import Database.Groundhog ( countAll, deleteAll, @@ -39,6 +42,7 @@ import Database.Groundhog.Sqlite ( withSqliteConn ) import Database.Groundhog.TH ( groundhog, mkPersist ) +import qualified GHC.Generics as GHC ( Generic ) import Test.Tasty ( TestTree, testGroup ) import Test.Tasty.HUnit ( (@?=), testCase ) import Text.XML.HXT.Core ( @@ -127,7 +131,11 @@ data Message = xml_listings :: [AutoRacingResultsListingXml], xml_race_information :: AutoRacingResultsRaceInformationXml, xml_time_stamp :: UTCTime } - deriving (Eq, Show) + deriving (Eq, GHC.Generic, Show) + +-- | For 'H.convert'. +-- +instance H.HVector Message instance ToDb Message where @@ -167,46 +175,55 @@ instance XmlImport Message -- * AutoRacingResultsListing/AutoRacingResultsListingXml -- | Database representation of a \ contained within a --- \. +-- \. The leading underscores prevent unused field +-- warnings. -- data AutoRacingResultsListing = AutoRacingResultsListing { - db_auto_racing_results_id :: DefaultKey AutoRacingResults, - db_finish_position :: Int, - db_starting_position :: Int, - db_car_number :: Int, - db_driver_id :: Int, - db_driver :: String, - db_car_make :: String, - db_points :: Int, - db_laps_completed :: Int, - db_laps_leading :: Int, - db_status :: Maybe String, - db_dnf :: Maybe Bool, - db_nc :: Maybe Bool, - db_earnings :: Maybe Int } - + _db_auto_racing_results_id :: DefaultKey AutoRacingResults, + _db_finish_position :: Int, + _db_starting_position :: Int, + _db_car_number :: Int, + _db_driver_id :: Int, + _db_driver :: String, + _db_car_make :: String, + _db_points :: Int, + _db_laps_completed :: Int, + _db_laps_leading :: Int, + _db_status :: Maybe String, + _db_dnf :: Maybe Bool, + _db_nc :: Maybe Bool, + _db_earnings :: Maybe Int } + deriving ( GHC.Generic ) + +-- | For 'H.convert' and 'H.cons'. +-- +instance H.HVector AutoRacingResultsListing -- | XML representation of a \ contained within a --- \. +-- \. The leading underscores prevent unused field +-- warnings. -- data AutoRacingResultsListingXml = AutoRacingResultsListingXml { - xml_finish_position :: Int, - xml_starting_position :: Int, - xml_car_number :: Int, - xml_driver_id :: Int, - xml_driver :: String, - xml_car_make :: String, - xml_points :: Int, - xml_laps_completed :: Int, - xml_laps_leading :: Int, - xml_status :: Maybe String, - xml_dnf :: Maybe Bool, - xml_nc :: Maybe Bool, - xml_earnings :: Maybe Int } - deriving (Eq, Show) - + _xml_finish_position :: Int, + _xml_starting_position :: Int, + _xml_car_number :: Int, + _xml_driver_id :: Int, + _xml_driver :: String, + _xml_car_make :: String, + _xml_points :: Int, + _xml_laps_completed :: Int, + _xml_laps_leading :: Int, + _xml_status :: Maybe String, + _xml_dnf :: Maybe Bool, + _xml_nc :: Maybe Bool, + _xml_earnings :: Maybe Int } + deriving (Eq, GHC.Generic, Show) + +-- | For 'H.convert'. +-- +instance H.HVector AutoRacingResultsListingXml instance ToDb AutoRacingResultsListingXml where -- | The database analogue of an 'AutoRacingResultsListingXml' is @@ -227,22 +244,7 @@ instance FromXmlFk AutoRacingResultsListingXml where -- 'AutoRacingResultsListing', we add the foreign key and copy -- everything else verbatim. -- - from_xml_fk fk AutoRacingResultsListingXml{..} = - AutoRacingResultsListing { - db_auto_racing_results_id = fk, - db_finish_position = xml_finish_position, - db_starting_position = xml_starting_position, - db_car_number = xml_car_number, - db_driver_id = xml_driver_id, - db_driver = xml_driver, - db_car_make = xml_car_make, - db_points = xml_points, - db_laps_completed = xml_laps_completed, - db_laps_leading = xml_laps_leading, - db_status = xml_status, - db_dnf = xml_dnf, - db_nc = xml_nc, - db_earnings = xml_earnings } + from_xml_fk = H.cons -- | This allows us to insert the XML representation @@ -318,7 +320,7 @@ data AutoRacingResultsRaceInformationXml = xml_lead_changes :: Maybe String, xml_lap_leaders :: Maybe String, xml_most_laps_leading :: Maybe MostLapsLeading } - deriving (Eq,Show) + deriving (Eq, Show) instance ToDb AutoRacingResultsRaceInformationXml where @@ -340,7 +342,7 @@ instance Child AutoRacingResultsRaceInformationXml where instance FromXmlFk AutoRacingResultsRaceInformationXml where -- | To convert an 'AutoRacingResultsRaceInformationXml' to an -- 'AutoRacingResultsRaceInformartion', we add the foreign key and - -- copy everything else verbatim. + -- massage the 'MostLapsLeading' embedded type, -- from_xml_fk fk AutoRacingResultsRaceInformationXml{..} = AutoRacingResultsRaceInformation { @@ -362,9 +364,9 @@ instance FromXmlFk AutoRacingResultsRaceInformationXml where -- the database with an (embedded) 'MostLapsLeading' with three -- missing fields. most_laps_leading = - case xml_most_laps_leading of - Just mll -> mll - Nothing -> MostLapsLeading Nothing Nothing Nothing + fromMaybe (MostLapsLeading Nothing Nothing Nothing) + xml_most_laps_leading + -- | This allows us to insert the XML representation -- 'AutoRacingResultsRaceInformationXml' directly. @@ -414,7 +416,7 @@ mkPersist tsn_codegen_config [groundhog| constructors: - name: AutoRacingResultsListing fields: - - name: db_auto_racing_results_id + - name: _db_auto_racing_results_id reference: onDelete: cascade @@ -457,7 +459,7 @@ mkPersist tsn_codegen_config [groundhog| pickle_listing :: PU AutoRacingResultsListingXml pickle_listing = xpElem "Listing" $ - xpWrap (from_tuple, to_tuple) $ + xpWrap (from_tuple, H.convert) $ xp13Tuple (xpElem "FinishPosition" xpInt) (xpElem "StartingPosition" xpInt) (xpElem "CarNumber" xpInt) @@ -473,19 +475,6 @@ pickle_listing = (xpElem "Earnings" xp_earnings) where from_tuple = uncurryN AutoRacingResultsListingXml - to_tuple m = (xml_finish_position m, - xml_starting_position m, - xml_car_number m, - xml_driver_id m, - xml_driver m, - xml_car_make m, - xml_points m, - xml_laps_completed m, - xml_laps_leading m, - xml_status m, - xml_dnf m, - xml_nc m, - xml_earnings m) -- | Pickler for the top-level 'Message'. @@ -493,7 +482,7 @@ pickle_listing = pickle_message :: PU Message pickle_message = xpElem "message" $ - xpWrap (from_tuple, to_tuple) $ + xpWrap (from_tuple, H.convert) $ xp13Tuple (xpElem "XML_File_ID" xpInt) (xpElem "heading" xpText) (xpElem "category" xpText) @@ -509,19 +498,6 @@ pickle_message = (xpElem "time_stamp" xp_time_stamp) where from_tuple = uncurryN Message - to_tuple m = (xml_xml_file_id m, - xml_heading m, - xml_category m, - xml_sport m, - xml_race_id m, - xml_race_date m, - xml_title m, - xml_track_location m, - xml_laps_remaining m, - xml_checkered_flag m, - xml_listings m, - xml_race_information m, - xml_time_stamp m) -- | Pickler for the \ child of a @@ -535,7 +511,7 @@ pickle_message = pickle_most_laps_leading :: PU (Maybe MostLapsLeading) pickle_most_laps_leading = xpElem "Most_Laps_Leading" $ - xpWrap (from_tuple, to_tuple) $ + xpWrap (from_tuple, to_tuple') $ xpTriple (xpOption $ xpElem "DriverID" xpInt) (xpOption $ xpElem "Driver" xpText) (xpOption $ xpElem "NumberOfLaps" xpInt) @@ -547,14 +523,14 @@ pickle_most_laps_leading = -- Sure had to go out of my way to avoid the warnings about unused -- db_most_laps_foo fields here. - to_tuple :: Maybe MostLapsLeading -> (Maybe Int, Maybe String, Maybe Int) - to_tuple Nothing = (Nothing, Nothing, Nothing) - to_tuple (Just (MostLapsLeading Nothing _ _)) = (Nothing, Nothing, Nothing) - to_tuple (Just (MostLapsLeading _ Nothing _)) = (Nothing, Nothing, Nothing) - to_tuple (Just (MostLapsLeading _ _ Nothing)) = (Nothing, Nothing, Nothing) - to_tuple (Just m) = (db_most_laps_leading_driver_id m, - db_most_laps_leading_driver m, - db_most_laps_leading_number_of_laps m) + to_tuple' :: Maybe MostLapsLeading -> (Maybe Int, Maybe String, Maybe Int) + to_tuple' Nothing = (Nothing, Nothing, Nothing) + to_tuple' (Just (MostLapsLeading Nothing _ _)) = (Nothing, Nothing, Nothing) + to_tuple' (Just (MostLapsLeading _ Nothing _)) = (Nothing, Nothing, Nothing) + to_tuple' (Just (MostLapsLeading _ _ Nothing)) = (Nothing, Nothing, Nothing) + to_tuple' (Just m) = (db_most_laps_leading_driver_id m, + db_most_laps_leading_driver m, + db_most_laps_leading_number_of_laps m) -- | Pickler for the \ child of \. @@ -574,7 +550,7 @@ pickle_most_laps_leading = pickle_race_information :: PU AutoRacingResultsRaceInformationXml pickle_race_information = xpElem "Race_Information" $ - xpWrap (from_tuple, to_tuple) $ + xpWrap (from_tuple, to_tuple') $ xp11Tuple (-- I can't think of another way to get both the -- TrackLength and its KPH attribute. So we shove them -- both in a 2-tuple. This should probably be an embedded type! @@ -599,17 +575,17 @@ pickle_race_information = x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 -- And here we have to re-pair the first two. - to_tuple m = ((xml_track_length m, xml_track_length_kph m), - xml_laps m, - xml_average_speed_mph m, - xml_average_speed_kph m, - xml_average_speed m, - xml_time_of_race m, - xml_margin_of_victory m, - xml_cautions m, - xml_lead_changes m, - xml_lap_leaders m, - xml_most_laps_leading m) + to_tuple' m = ((xml_track_length m, xml_track_length_kph m), + xml_laps m, + xml_average_speed_mph m, + xml_average_speed_kph m, + xml_average_speed m, + xml_time_of_race m, + xml_margin_of_victory m, + xml_cautions m, + xml_lead_changes m, + xml_lap_leaders m, + xml_most_laps_leading m) -- -- * Tasty Tests