diff --git a/ringo.cabal b/ringo.cabal index 3e97c94..cb0a8b2 100644 --- a/ringo.cabal +++ b/ringo.cabal @@ -30,7 +30,7 @@ library text >=1.2 && <1.3, containers >=0.5 && <0.6, mtl >=2.1 && <2.3, - raw-strings-qq >= 1.0 && <1.2 + raw-strings-qq >=1.0 && <1.2 ghc-options: -Wall -fno-warn-unused-do-bind -funbox-strict-fields -fno-warn-orphans -O2 default-extensions: OverloadedStrings, RecordWildCards, ScopedTypeVariables, BangPatterns, TupleSections, CPP, NamedFieldPuns diff --git a/src/Ringo/Extractor/Internal.hs b/src/Ringo/Extractor/Internal.hs index 5b0d93b..c6af1f4 100644 --- a/src/Ringo/Extractor/Internal.hs +++ b/src/Ringo/Extractor/Internal.hs @@ -12,11 +12,19 @@ import Control.Monad.Reader (Reader, asks) import Data.Function (on) import Data.Maybe (mapMaybe, fromMaybe, fromJust, catMaybes) import Data.Monoid ((<>)) -import Data.List (nub, nubBy) +import Data.List (nub, nubBy, find) import Data.Text (Text) import Ringo.Types -import Ringo.Utils + +findTable :: TableName -> [Table] -> Maybe Table +findTable tName = find ((== tName) . tableName) + +findFact :: TableName -> [Fact] -> Maybe Fact +findFact fName = find ((== fName) . factName) + +findColumn :: ColumnName -> [Column] -> Maybe Column +findColumn cName = find ((== cName) . columnName) dimColumnName :: Text -> ColumnName -> ColumnName dimColumnName dimName columnName = diff --git a/src/Ringo/Generator/Create.hs b/src/Ringo/Generator/Create.hs index badc434..02f4452 100644 --- a/src/Ringo/Generator/Create.hs +++ b/src/Ringo/Generator/Create.hs @@ -13,16 +13,16 @@ tableDefnSQL :: Table -> [Text] tableDefnSQL Table {..} = tableSQL : concatMap constraintDefnSQL tableConstraints where + tableSQL = "CREATE TABLE " <> tableName <> " (\n" + <> (joinColumnNames . map columnDefnSQL $ tableColumns) + <> "\n)" + columnDefnSQL Column {..} = columnName <> " " <> columnType <> " " <> nullableDefnSQL columnNullable nullableDefnSQL Null = "NULL" nullableDefnSQL NotNull = "NOT NULL" - tableSQL = "CREATE TABLE " <> tableName <> " (\n" - <> (joinColumnNames . map columnDefnSQL $ tableColumns) - <> "\n)" - constraintDefnSQL constraint = let alterTableSQL = "ALTER TABLE ONLY " <> tableName <> " ADD " in case constraint of diff --git a/src/Ringo/Generator/Internal.hs b/src/Ringo/Generator/Internal.hs index 42a812c..5deb821 100644 --- a/src/Ringo/Generator/Internal.hs +++ b/src/Ringo/Generator/Internal.hs @@ -19,7 +19,8 @@ fullColumnName tName cName = tName <> "." <> cName dimColumnMapping :: Text -> Fact -> TableName -> [(ColumnName, ColumnName)] dimColumnMapping dimPrefix fact dimTableName = [ (dimColumnName dName cName, cName) - | DimVal dName cName <- factColumns fact , dimPrefix <> dName == dimTableName] + | DimVal dName cName <- factColumns fact + , dimPrefix <> dName == dimTableName ] coalesceColumn :: TypeDefaults -> TableName -> Column -> Text coalesceColumn defaults tName Column{..} = diff --git a/src/Ringo/Generator/Populate/Dimension.hs b/src/Ringo/Generator/Populate/Dimension.hs index 067fa2e..ac46f94 100644 --- a/src/Ringo/Generator/Populate/Dimension.hs +++ b/src/Ringo/Generator/Populate/Dimension.hs @@ -12,9 +12,9 @@ import Data.Maybe (fromJust) import Data.Monoid ((<>)) import Data.Text (Text) +import Ringo.Extractor.Internal import Ringo.Generator.Internal import Ringo.Types -import Ringo.Utils dimensionTablePopulateSQL :: TablePopulationMode -> Fact -> TableName -> Reader Env Text dimensionTablePopulateSQL popMode fact dimTableName = do diff --git a/src/Ringo/Generator/Populate/Fact.hs b/src/Ringo/Generator/Populate/Fact.hs index 1976688..0447c83 100644 --- a/src/Ringo/Generator/Populate/Fact.hs +++ b/src/Ringo/Generator/Populate/Fact.hs @@ -206,7 +206,7 @@ factTablePopulateSQL popMode fact = do coalesceFKId col = if "coalesce" `Text.isPrefixOf` col then col - else "coalesce((" <> col <> "), -1)" + else "coalesce((" <> col <> "), -1)" -- TODO extract this out to settings toSelectSQL :: FactTablePopulateSelectSQL -> Text toSelectSQL FactTablePopulateSelectSQL {..} = diff --git a/src/Ringo/Types.hs b/src/Ringo/Types.hs index a952991..100b642 100644 --- a/src/Ringo/Types.hs +++ b/src/Ringo/Types.hs @@ -58,15 +58,15 @@ data FactColumn = DimTime !ColumnName | FactCountDistinct !(Maybe ColumnName) !ColumnName deriving (Eq, Show) -factColumnName :: FactColumn -> Maybe ColumnName -factColumnName (DimTime cName) = Just cName -factColumnName (NoDimId cName) = Just cName -factColumnName (DimId _ cName) = Just cName -factColumnName (DimVal _ cName) = Just cName -factColumnName (FactCount cName _) = cName -factColumnName (FactSum cName _) = Just cName -factColumnName (FactAverage cName _) = Just cName -factColumnName (FactCountDistinct cName _) = cName +factSourceColumnName :: FactColumn -> Maybe ColumnName +factSourceColumnName (DimTime cName) = Just cName +factSourceColumnName (NoDimId cName) = Just cName +factSourceColumnName (DimId _ cName) = Just cName +factSourceColumnName (DimVal _ cName) = Just cName +factSourceColumnName (FactCount cName _) = cName +factSourceColumnName (FactSum cName _) = Just cName +factSourceColumnName (FactAverage cName _) = Just cName +factSourceColumnName (FactCountDistinct cName _) = cName data Settings = Settings { settingDimPrefix :: !Text diff --git a/src/Ringo/Utils.hs b/src/Ringo/Utils.hs index a7813a2..69400d6 100644 --- a/src/Ringo/Utils.hs +++ b/src/Ringo/Utils.hs @@ -3,18 +3,6 @@ module Ringo.Utils where import qualified Control.Arrow as Arrow import Data.Maybe (mapMaybe) -import Data.List (find) - -import Ringo.Types - -findTable :: TableName -> [Table] -> Maybe Table -findTable tName = find ((== tName) . tableName) - -findFact :: TableName -> [Fact] -> Maybe Fact -findFact fName = find ((== fName) . factName) - -findColumn :: ColumnName -> [Column] -> Maybe Column -findColumn cName = find ((== cName) . columnName) for :: [a] -> (a -> b) -> [b] for = flip map diff --git a/src/Ringo/Validator.hs b/src/Ringo/Validator.hs index 55ff06f..d00bda9 100644 --- a/src/Ringo/Validator.hs +++ b/src/Ringo/Validator.hs @@ -12,10 +12,10 @@ import Control.Applicative ((<$>)) #endif import Control.Monad.Reader (Reader, asks) +import Data.Maybe (isJust, fromJust) -import Data.Maybe (isJust, fromJust) +import Ringo.Extractor.Internal import Ringo.Types -import Ringo.Utils checkTableForCol :: Table -> ColumnName -> [ValidationError] checkTableForCol tab colName = @@ -44,8 +44,8 @@ validateFact Fact {..} = do case findTable factTableName tables of Nothing -> return [ MissingTable factTableName ] Just table -> do - tableVs <- validateTable table - parentVs <- concat <$> mapM checkFactParents factParentNames + tableVs <- validateTable table + parentVs <- concat <$> mapM checkFactParents factParentNames let colVs = concatMap (checkColumn tables table) factColumns timeVs = [ MissingTimeColumn factTableName | null [ c | DimTime c <- factColumns ] ] @@ -71,7 +71,7 @@ validateFact Fact {..} = do Just pFact -> validateFact pFact checkColumn tables table factCol = - maybe [] (checkTableForCol table) (factColumnName factCol) + maybe [] (checkTableForCol table) (factSourceColumnName factCol) ++ checkColumnTable tables factCol checkColumnTable tables factCol = case factCol of