ringo/src/Ringo/Types.hs

87 lines
3.0 KiB
Haskell

module Ringo.Types where
import Data.Text (Text)
import qualified Data.Text as T
type ColumnName = Text
type ColumnType = Text
type TableName = Text
data Nullable = Null | NotNull deriving (Eq, Enum, Show)
data Column = Column
{ columnName :: !ColumnName
, columnType :: !ColumnType
, columnNullable :: !Nullable
} deriving (Eq, Show)
data TableConstraint = PrimaryKey !ColumnName
| UniqueKey ![ColumnName]
| ForeignKey !TableName ![(ColumnName, ColumnName)]
deriving (Eq, Show)
data Table = Table
{ tableName :: !TableName
, tableColumns :: ![Column]
, tableConstraints :: ![TableConstraint]
} deriving (Eq, Show)
data TimeUnit = Second | Minute | Hour | Day | Week | Month | Year
deriving (Eq, Enum, Show)
timeUnitName :: TimeUnit -> Text
timeUnitName = T.toLower . T.pack . show
data Fact = Fact
{ factName :: !TableName
, factTableName :: !TableName
, factParentNames :: ![TableName]
, factColumns :: ![FactColumn]
} deriving (Eq, Show)
data FactValType = Count | Sum | Average | CountDistinct deriving (Eq, Enum, Show)
data FactColumn = DimTime !ColumnName
| NoDimId !ColumnName
| DimId !TableName !ColumnName
| DimVal !TableName !ColumnName
| FactCount !ColumnName
| FactSum !ColumnName !ColumnName
| FactAverage !ColumnName !ColumnName
| FactCountDistinct !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 _) = Nothing
factColumnName (FactSum cName _) = Just cName
factColumnName (FactAverage cName _) = Just cName
factColumnName (FactCountDistinct _) = Nothing
data Settings = Settings
{ settingDimPrefix :: !Text
, settingFactPrefix :: !Text
, settingTimeUnit :: !TimeUnit
} deriving (Eq, Show)
defSettings :: Settings
defSettings = Settings
{ settingDimPrefix = "dim_"
, settingFactPrefix = "fact_"
, settingTimeUnit = Minute
}
data ValidationError = MissingTable TableName
| MissingFact TableName
| MissingColumn TableName ColumnName
deriving (Eq, Show)
data ExtractorEnv = ExtractorEnv
{ eeTables :: [Table]
, eeFacts :: [Fact]
, eeSettings :: Settings
} deriving (Eq, Show)