Refactoring

pull/1/head
Abhinav Sarkar 2015-12-16 03:03:47 +05:30
parent f016f0de09
commit c39916704e
4 changed files with 46 additions and 42 deletions

View File

@ -1,5 +1,6 @@
module Ringo.Extractor module Ringo.Extractor
( extractDimensions ( extractDimensionTables
, extractAllDimensionTables
, extractFactTable , extractFactTable
) where ) where
@ -13,10 +14,11 @@ import Ringo.Extractor.Internal
import Ringo.Types import Ringo.Types
import Ringo.Utils import Ringo.Utils
extractFactTable :: Fact -> Table -> Reader Env Table extractFactTable :: Fact -> Reader Env Table
extractFactTable fact table = do extractFactTable fact = do
Settings {..} <- asks envSettings Settings {..} <- asks envSettings
allDims <- extractAllDimensions fact table allDims <- extractAllDimensionTables fact
table <- asks $ fromJust . findTable (factTableName fact) . envTables
let intType = "integer" let intType = "integer"
sourceColumnType colName = columnType . fromJust . findColumn colName . tableColumns $ table sourceColumnType colName = columnType . fromJust . findColumn colName . tableColumns $ table

View File

@ -11,18 +11,23 @@ import Data.List (nub)
import Ringo.Types import Ringo.Types
import Ringo.Utils import Ringo.Utils
extractDimensions :: Fact -> Table -> Reader Env [Table] dimColumnName :: Text.Text -> ColumnName -> ColumnName
extractDimensions fact Table {..} = do dimColumnName dimName columnName =
fromMaybe columnName . Text.stripPrefix (dimName <> "_") $ columnName
extractDimensionTables :: Fact -> Reader Env [Table]
extractDimensionTables fact = do
tables <- asks envTables tables <- asks envTables
prefix <- settingDimPrefix <$> asks envSettings prefix <- settingDimPrefix <$> asks envSettings
return $ dimsFromIds tables ++ dimsFromVals prefix let table = fromJust . findTable (factTableName fact) $ tables
return $ dimsFromIds tables ++ dimsFromVals prefix (tableColumns table)
where where
dimsFromIds tables = dimsFromIds tables =
flip mapMaybe (factColumns fact) $ \fcol -> case fcol of flip mapMaybe (factColumns fact) $ \fcol -> case fcol of
DimId d _ -> findTable d tables DimId d _ -> findTable d tables
_ -> Nothing _ -> Nothing
dimsFromVals prefix = dimsFromVals prefix tableColumns =
map (\(dim, cols) -> Table { tableName = prefix <> dim map (\(dim, cols) -> Table { tableName = prefix <> dim
, tableColumns = Column "id" "serial" NotNull : cols , tableColumns = Column "id" "serial" NotNull : cols
, tableConstraints = [ PrimaryKey "id" , tableConstraints = [ PrimaryKey "id"
@ -42,19 +47,12 @@ extractDimensions fact Table {..} = do
. factColumns . factColumns
$ fact $ fact
dimColumnName :: Text.Text -> ColumnName -> ColumnName extractAllDimensionTables :: Fact -> Reader Env [Table]
dimColumnName dimName columnName = extractAllDimensionTables fact = do
fromMaybe columnName . Text.stripPrefix (dimName <> "_") $ columnName myDims <- extractDimensionTables fact
extractAllDimensions :: Fact -> Table -> Reader Env [Table]
extractAllDimensions fact table = do
myDims <- extractDimensions fact table
parentDims <- concat <$> mapM extract (factParentNames fact) parentDims <- concat <$> mapM extract (factParentNames fact)
return . nub $ myDims ++ parentDims return . nub $ myDims ++ parentDims
where where
extract fName = do extract fName = do
tables <- asks envTables
facts <- asks envFacts facts <- asks envFacts
let pFact = fromJust . findFact fName $ facts extractAllDimensionTables . fromJust . findFact fName $ facts
pFactTable = fromJust . findTable (factTableName pFact) $ tables
extractAllDimensions pFact pFactTable

View File

@ -5,6 +5,7 @@ module Ringo.Generator
import qualified Data.Text as Text import qualified Data.Text as Text
import Control.Monad.Reader (Reader, asks)
import Data.List (intersperse) import Data.List (intersperse)
import Data.Maybe (mapMaybe) import Data.Maybe (mapMaybe)
import Data.Monoid ((<>)) import Data.Monoid ((<>))
@ -42,12 +43,15 @@ tableDefnSQL Table {..} =
<> (Text.concat . intersperse ",\n" . map columnDefnSQL $ tableColumns) <> (Text.concat . intersperse ",\n" . map columnDefnSQL $ tableColumns)
<> "\n)" <> "\n)"
dimensionTableInsertSQL :: Text -> Fact -> TableName -> Text dimensionTableInsertSQL :: Fact -> TableName -> Reader Env Text
dimensionTableInsertSQL dimPrefix fact dimTableName = let dimensionTableInsertSQL fact dimTableName = do
colMapping = flip mapMaybe (factColumns fact) $ \fCol -> case fCol of dimPrefix <- settingDimPrefix <$> asks envSettings
DimVal dName cName | dimPrefix <> dName == dimTableName -> Just (dimColumnName dName cName, cName) let colMapping = flip mapMaybe (factColumns fact) $ \fCol -> case fCol of
DimVal dName cName | dimPrefix <> dName == dimTableName ->
Just (dimColumnName dName cName, cName)
_ -> Nothing _ -> Nothing
in "INSERT INTO " <> dimTableName <> " (\n"
return $ "INSERT INTO " <> dimTableName <> " (\n"
<> colNamesString (map fst colMapping) <> colNamesString (map fst colMapping)
<> "\n) SELECT DISTINCT \n" <> "\n) SELECT DISTINCT \n"
<> colNamesString (map snd colMapping) <> colNamesString (map snd colMapping)

View File

@ -1,8 +1,10 @@
module Ringo.Validator where module Ringo.Validator
( validateTable
, validateFact
, withFactValidation
) where
import Control.Monad.Reader (Reader, asks) import Control.Monad.Reader (Reader, asks)
import Data.Maybe (mapMaybe, fromMaybe, fromJust)
import Data.Monoid ((<>))
import Ringo.Types import Ringo.Types
import Ringo.Utils import Ringo.Utils
@ -46,11 +48,9 @@ validateFact Fact {..} = do
checkColumn table = maybe [] (checkTableForCol table) . factColumnName checkColumn table = maybe [] (checkTableForCol table) . factColumnName
withFactValidation :: Fact -> (Table -> Reader Env a) withFactValidation :: Fact -> Reader Env a -> Reader Env (Either [ValidationError] a)
-> Reader Env (Either [ValidationError] a)
withFactValidation fact func = do withFactValidation fact func = do
tables <- asks envTables
errors <- validateFact fact errors <- validateFact fact
if not $ null errors if not $ null errors
then return $ Left errors then return $ Left errors
else fmap Right . func . fromJust . findTable (factTableName fact) $ tables else fmap Right func