You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
3.5 KiB
88 lines
3.5 KiB
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# LANGUAGE RecordWildCards #-}
|
|
|
|
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)
|
|
|
|
import Ringo
|
|
import Ringo.ArgParser
|
|
import Ringo.InputParser
|
|
|
|
data SQLType = Create | FullRefresh | IncRefresh deriving (Eq, Show)
|
|
|
|
main :: IO ()
|
|
main = do
|
|
ProgArgs {..} <- parseArgs
|
|
result <- parseInput progInputFile
|
|
case result of
|
|
Left err -> putStrLn err >> exitFailure
|
|
Right (tables, facts, defaults) ->
|
|
case makeConfig tables facts progSettings defaults of
|
|
Left errors -> mapM_ print errors >> exitFailure
|
|
Right config -> writeFiles progOutputDir config >> exitSuccess
|
|
|
|
writeFiles :: FilePath -> Config -> IO ()
|
|
writeFiles outputDir config = do
|
|
let Settings{..} = configSettings config
|
|
|
|
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
|
|
. foldl (\acc -> Map.union acc . extractDependencies config) Map.empty
|
|
$ facts
|
|
|
|
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
|
|
facts = configFacts config
|
|
tables = configTables config
|
|
|
|
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 =
|
|
[ (Create, tableName table, unlines . map Text.unpack $ dimensionTableDefinitionSQL config table)
|
|
| (_, tabs) <- dimTables
|
|
, table <- tabs
|
|
, table `notElem` tables ]
|
|
|
|
factTableDefinitionSQLs =
|
|
[ (Create , tableName table, unlines . map Text.unpack $ factTableDefinitionSQL config fact table)
|
|
| (fact, table) <- factTables ]
|
|
|
|
dimTablePopulationSQLs typ gen =
|
|
[ (typ , tableName table, Text.unpack $ gen config fact (tableName table))
|
|
| (fact, tabs) <- dimTables
|
|
, table <- tabs
|
|
, table `notElem` tables ]
|
|
|
|
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
|
|
]
|
|
|