2015-12-10 13:58:14 +05:30
|
|
|
module Ringo.Types where
|
|
|
|
|
2015-12-17 20:02:13 +05:30
|
|
|
import qualified Data.Text as Text
|
2015-12-10 13:58:14 +05:30
|
|
|
|
2015-12-21 15:30:23 +05:30
|
|
|
import Data.Map (Map)
|
|
|
|
import Data.Text (Text)
|
|
|
|
|
2015-12-10 13:58:14 +05:30
|
|
|
type ColumnName = Text
|
|
|
|
type ColumnType = Text
|
2015-12-18 01:00:32 +05:30
|
|
|
type TableName = Text
|
2015-12-10 13:58:14 +05:30
|
|
|
|
2015-12-14 21:57:11 +05:30
|
|
|
data Nullable = Null | NotNull deriving (Eq, Enum, Show)
|
2015-12-10 20:30:55 +05:30
|
|
|
|
2015-12-10 13:58:14 +05:30
|
|
|
data Column = Column
|
2015-12-14 21:57:11 +05:30
|
|
|
{ columnName :: !ColumnName
|
|
|
|
, columnType :: !ColumnType
|
|
|
|
, columnNullable :: !Nullable
|
2015-12-10 13:58:14 +05:30
|
|
|
} deriving (Eq, Show)
|
|
|
|
|
2015-12-15 17:22:45 +05:30
|
|
|
data TableConstraint = PrimaryKey !ColumnName
|
|
|
|
| UniqueKey ![ColumnName]
|
|
|
|
| ForeignKey !TableName ![(ColumnName, ColumnName)]
|
|
|
|
deriving (Eq, Show)
|
2015-12-10 13:58:14 +05:30
|
|
|
|
|
|
|
data Table = Table
|
2015-12-14 21:57:11 +05:30
|
|
|
{ tableName :: !TableName
|
|
|
|
, tableColumns :: ![Column]
|
2015-12-15 17:22:45 +05:30
|
|
|
, tableConstraints :: ![TableConstraint]
|
2015-12-10 13:58:14 +05:30
|
|
|
} deriving (Eq, Show)
|
|
|
|
|
2015-12-16 16:57:10 +05:30
|
|
|
data TimeUnit = Second | Minute | Hour | Day | Week
|
2015-12-17 20:02:13 +05:30
|
|
|
deriving (Eq, Enum, Show, Read)
|
2015-12-10 20:30:55 +05:30
|
|
|
|
2015-12-14 21:57:11 +05:30
|
|
|
timeUnitName :: TimeUnit -> Text
|
2015-12-17 20:02:13 +05:30
|
|
|
timeUnitName = Text.toLower . Text.pack . show
|
2015-12-14 21:57:11 +05:30
|
|
|
|
2015-12-16 16:57:10 +05:30
|
|
|
timeUnitToSeconds :: TimeUnit -> Int
|
|
|
|
timeUnitToSeconds Second = 1
|
|
|
|
timeUnitToSeconds Minute = 60 * timeUnitToSeconds Second
|
|
|
|
timeUnitToSeconds Hour = 60 * timeUnitToSeconds Minute
|
|
|
|
timeUnitToSeconds Day = 24 * timeUnitToSeconds Hour
|
|
|
|
timeUnitToSeconds Week = 7 * timeUnitToSeconds Day
|
|
|
|
|
2015-12-10 20:30:55 +05:30
|
|
|
data Fact = Fact
|
2015-12-14 21:57:11 +05:30
|
|
|
{ factName :: !TableName
|
|
|
|
, factTableName :: !TableName
|
|
|
|
, factParentNames :: ![TableName]
|
|
|
|
, factColumns :: ![FactColumn]
|
2015-12-10 20:30:55 +05:30
|
|
|
} deriving (Eq, Show)
|
|
|
|
|
2015-12-14 21:57:11 +05:30
|
|
|
data FactColumn = DimTime !ColumnName
|
|
|
|
| NoDimId !ColumnName
|
2015-12-21 22:19:54 +05:30
|
|
|
| DimId !TableName !ColumnName
|
|
|
|
| DimVal !TableName !ColumnName
|
|
|
|
| FactCount !(Maybe ColumnName) !ColumnName
|
|
|
|
| FactSum !ColumnName !ColumnName
|
|
|
|
| FactAverage !ColumnName !ColumnName
|
|
|
|
| FactCountDistinct !(Maybe ColumnName) !ColumnName
|
2015-12-10 20:30:55 +05:30
|
|
|
deriving (Eq, Show)
|
|
|
|
|
2015-12-30 12:21:41 +05:30
|
|
|
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
|
2015-12-14 21:57:11 +05:30
|
|
|
|
|
|
|
data Settings = Settings
|
2015-12-22 19:46:37 +05:30
|
|
|
{ settingDimPrefix :: !Text
|
|
|
|
, settingFactPrefix :: !Text
|
|
|
|
, settingTimeUnit :: !TimeUnit
|
|
|
|
, settingAvgCountColumSuffix :: !Text
|
|
|
|
, settingAvgSumColumnSuffix :: !Text
|
|
|
|
, settingDimTableIdColumnName :: !Text
|
|
|
|
, settingDimTableIdColumnType :: !Text
|
|
|
|
, settingFactCountColumnType :: !Text
|
|
|
|
, settingFactCountDistinctErrorRate :: !Double
|
|
|
|
, settingFactInfix :: !Text
|
|
|
|
, settingDependenciesJSONFileName :: !Text
|
|
|
|
, settingFactsJSONFileName :: !Text
|
|
|
|
, settingDimensionJSONFileName :: !Text
|
2015-12-30 12:34:35 +05:30
|
|
|
, settingForeignKeyIdCoalesceValue :: !Int
|
2015-12-30 19:57:38 +05:30
|
|
|
, settingTableNameSuffixTemplate :: !Text
|
2015-12-14 21:57:11 +05:30
|
|
|
} deriving (Eq, Show)
|
|
|
|
|
|
|
|
defSettings :: Settings
|
|
|
|
defSettings = Settings
|
2015-12-22 19:46:37 +05:30
|
|
|
{ settingDimPrefix = "dim_"
|
|
|
|
, settingFactPrefix = "fact_"
|
|
|
|
, settingTimeUnit = Minute
|
|
|
|
, settingAvgCountColumSuffix = "_count"
|
|
|
|
, settingAvgSumColumnSuffix = "_sum"
|
|
|
|
, settingDimTableIdColumnName = "id"
|
|
|
|
, settingDimTableIdColumnType = "serial"
|
|
|
|
, settingFactCountColumnType = "integer"
|
|
|
|
, settingFactCountDistinctErrorRate = 0.05
|
|
|
|
, settingFactInfix = "_by_"
|
|
|
|
, settingDependenciesJSONFileName = "dependencies.json"
|
|
|
|
, settingFactsJSONFileName = "facts.json"
|
|
|
|
, settingDimensionJSONFileName = "dimensions.json"
|
2015-12-30 12:34:35 +05:30
|
|
|
, settingForeignKeyIdCoalesceValue = -1
|
2015-12-30 19:57:38 +05:30
|
|
|
, settingTableNameSuffixTemplate = "{{suff}}"
|
2015-12-14 21:57:11 +05:30
|
|
|
}
|
2015-12-15 11:59:53 +05:30
|
|
|
|
2015-12-28 19:28:35 +05:30
|
|
|
data ValidationError = MissingTable !TableName
|
|
|
|
| MissingFact !TableName
|
|
|
|
| MissingColumn !TableName !ColumnName
|
|
|
|
| MissingTimeColumn !TableName
|
|
|
|
| MissingNotNullConstraint !TableName !ColumnName
|
|
|
|
| MissingTypeDefault !Text
|
2015-12-15 11:59:53 +05:30
|
|
|
deriving (Eq, Show)
|
|
|
|
|
2015-12-28 19:28:35 +05:30
|
|
|
type TypeDefaults = Map Text Text
|
|
|
|
|
2015-12-16 02:05:36 +05:30
|
|
|
data Env = Env
|
2015-12-28 19:28:35 +05:30
|
|
|
{ envTables :: ![Table]
|
|
|
|
, envFacts :: ![Fact]
|
|
|
|
, envSettings :: !Settings
|
|
|
|
, envTypeDefaults :: !TypeDefaults
|
2015-12-16 02:05:36 +05:30
|
|
|
} deriving (Eq, Show)
|
2015-12-19 11:55:08 +05:30
|
|
|
|
|
|
|
data TablePopulationMode = FullPopulation | IncrementalPopulation deriving (Eq, Show)
|
2015-12-21 15:30:23 +05:30
|
|
|
|
|
|
|
type Dependencies = Map TableName [TableName]
|