module ProjectM36.DateExamples where import ProjectM36.Base import qualified ProjectM36.Attribute as A import ProjectM36.Key import ProjectM36.AtomFunctions.Basic import ProjectM36.DataTypes.Basic import ProjectM36.DatabaseContext import ProjectM36.Relation import qualified Data.Map as M import qualified Data.Set as S dateExamples :: DatabaseContext dateExamples = empty { inclusionDependencies = dateIncDeps, relationVariables = M.union (relationVariables basicDatabaseContext) dateRelVars, notifications = M.empty, atomFunctions = basicAtomFunctions, typeConstructorMapping = basicTypeConstructorMapping } where -- these must be lower case now that data constructors are in play dateRelVars = M.fromList [("s", suppliers), ("p", products), ("sp", supplierProducts)] suppliers = suppliersRel products = productsRel supplierProducts = supplierProductsRel dateIncDeps = M.fromList [("s_pkey", simplePKey ["s#"] "s"), ("p_pkey", simplePKey ["p#"] "p"), ("sp_pkey", simplePKey ["s#", "p#"] "sp") ] simplePKey attrNames relvarName = inclusionDependencyForKey (AttributeNames $ S.fromList attrNames) (RelationVariable relvarName ()) suppliersRel :: Relation suppliersRel = case mkRelationFromList attrs atomMatrix of Left _ -> undefined Right rel -> rel where attrs = A.attributesFromList [Attribute "s#" TextAtomType, Attribute "sname" TextAtomType, Attribute "status" IntegerAtomType, Attribute "city" TextAtomType] atomMatrix = [ [TextAtom "S1", TextAtom "Smith", IntegerAtom 20, TextAtom "London"], [TextAtom "S2", TextAtom "Jones", IntegerAtom 10, TextAtom "Paris"], [TextAtom "S3", TextAtom "Blake", IntegerAtom 30, TextAtom "Paris"], [TextAtom "S4", TextAtom "Clark", IntegerAtom 20, TextAtom "London"], [TextAtom "S5", TextAtom "Adams", IntegerAtom 30, TextAtom "Athens"]] supplierProductsRel :: Relation supplierProductsRel = case mkRelationFromList attrs matrix of Left _ -> undefined Right rel -> rel where attrs = A.attributesFromList [Attribute "s#" TextAtomType, Attribute "p#" TextAtomType, Attribute "qty" IntegerAtomType] matrix = [ [TextAtom "S1", TextAtom "P1", IntegerAtom 300], [TextAtom "S1", TextAtom "P2", IntegerAtom 200], [TextAtom "S1", TextAtom "P3", IntegerAtom 400], [TextAtom "S1", TextAtom "P4", IntegerAtom 200], [TextAtom "S1", TextAtom "P5", IntegerAtom 100], [TextAtom "S1", TextAtom "P6", IntegerAtom 100], [TextAtom "S2", TextAtom "P1", IntegerAtom 300], [TextAtom "S2", TextAtom "P2", IntegerAtom 400], [TextAtom "S3", TextAtom "P2", IntegerAtom 200], [TextAtom "S4", TextAtom "P2", IntegerAtom 200], [TextAtom "S4", TextAtom "P4", IntegerAtom 300], [TextAtom "S4", TextAtom "P5", IntegerAtom 400] ] productsRel :: Relation productsRel = case mkRelationFromList attrs matrix of Left _ -> undefined Right rel -> rel where attrs = A.attributesFromList [Attribute "p#" TextAtomType, Attribute "pname" TextAtomType, Attribute "color" TextAtomType, Attribute "weight" IntegerAtomType, Attribute "city" TextAtomType] matrix = [ [TextAtom "P1", TextAtom "Nut", TextAtom "Red", IntegerAtom 12, TextAtom "London"], [TextAtom "P2", TextAtom "Bolt", TextAtom "Green", IntegerAtom 17, TextAtom "Paris"], [TextAtom "P3", TextAtom "Screw", TextAtom "Blue", IntegerAtom 17, TextAtom "Oslo"], [TextAtom "P4", TextAtom "Screw", TextAtom "Red", IntegerAtom 14, TextAtom "London"], [TextAtom "P5", TextAtom "Cam", TextAtom "Blue", IntegerAtom 12, TextAtom "Paris"], [TextAtom "P6", TextAtom "Cog", TextAtom "Red", IntegerAtom 19, TextAtom "London"] ]