ringo/ringo/src/Main.hs

89 lines
3.5 KiB
Haskell
Raw Normal View History

2016-01-01 20:57:54 +05:30
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
2015-12-09 17:11:57 +05:30
module Main where
import qualified Data.ByteString.Lazy as BS
import qualified Data.Map as Map
import qualified Data.Text as Text
import Data.Aeson (encode)
import Data.Char (toLower)
import Control.Monad (forM_)
import System.Directory (createDirectoryIfMissing)
import System.FilePath ((</>), (<.>))
import System.Exit (exitFailure, exitSuccess)
2015-12-09 17:11:57 +05:30
import Ringo
import Ringo.ArgParser
import Ringo.InputParser
2015-12-09 17:11:57 +05:30
data SQLType = Create | FullRefresh | IncRefresh deriving (Eq, Show)
2015-12-09 17:11:57 +05:30
main :: IO ()
main = do
ProgArgs {..} <- parseArgs
result <- parseInput progInputFile
case result of
Left err -> putStrLn err >> exitFailure
Right (tables, facts, defaults) ->
2016-07-12 12:57:41 +05:30
case makeConfig tables facts progSettings defaults of
Left errors -> mapM_ print errors >> exitFailure
Right config -> writeFiles progOutputDir config >> exitSuccess
2016-07-12 12:57:41 +05:30
writeFiles :: FilePath -> Config -> IO ()
writeFiles outputDir config = do
let Settings{..} = configSettings config
2016-07-12 12:57:41 +05:30
forM_ (makeSQLs config dimTables factTables) $ \(sqlType, table, sql) -> do
let dirName = outputDir </> map toLower (show sqlType)
createDirectoryIfMissing True dirName
writeFile (dirName </> Text.unpack table <.> "sql") sql
BS.writeFile (outputDir </> Text.unpack settingDependenciesJSONFileName)
. encode
2016-07-12 12:57:41 +05:30
. foldl (\acc -> Map.union acc . extractDependencies config) Map.empty
$ facts
2016-07-11 19:00:59 +05:30
BS.writeFile (outputDir </> Text.unpack settingDimensionsJSONFileName) . encode $
[ tableName table | (_, tabs) <- dimTables, table <- tabs , table `notElem` tables ]
BS.writeFile (outputDir </> Text.unpack settingFactsJSONFileName) . encode $
[ tableName table | (_, table) <- factTables ]
where
2016-07-12 12:57:41 +05:30
facts = configFacts config
tables = configTables config
2016-07-12 12:57:41 +05:30
dimTables = [ (fact, extractDimensionTables config fact) | fact <- facts ]
factTables = [ (fact, extractFactTable config fact) | fact <- facts, factTablePersistent fact ]
makeSQLs :: Config -> [(Fact, [Table])] -> [(Fact, Table)] -> [(SQLType, TableName, String)]
makeSQLs config dimTables factTables = let
tables = configTables config
dimTableDefinitionSQLs =
2016-07-12 12:57:41 +05:30
[ (Create, tableName table, unlines . map Text.unpack $ dimensionTableDefinitionSQL config table)
| (_, tabs) <- dimTables
, table <- tabs
, table `notElem` tables ]
factTableDefinitionSQLs =
2016-07-12 12:57:41 +05:30
[ (Create , tableName table, unlines . map Text.unpack $ factTableDefinitionSQL config fact table)
| (fact, table) <- factTables ]
dimTablePopulationSQLs typ gen =
2016-07-12 12:57:41 +05:30
[ (typ , tableName table, Text.unpack $ gen config fact (tableName table))
| (fact, tabs) <- dimTables
, table <- tabs
, table `notElem` tables ]
2016-07-12 12:57:41 +05:30
factTablePopulationSQLs typ gen = [ (typ, tableName table, unlines . map Text.unpack $ gen config fact)
| (fact, table) <- factTables ]
in concat [ dimTableDefinitionSQLs
, factTableDefinitionSQLs
, dimTablePopulationSQLs FullRefresh $ dimensionTablePopulationSQL FullPopulation
, dimTablePopulationSQLs IncRefresh $ dimensionTablePopulationSQL IncrementalPopulation
, factTablePopulationSQLs FullRefresh $ factTablePopulationSQL FullPopulation
, factTablePopulationSQLs IncRefresh $ factTablePopulationSQL IncrementalPopulation
]