@@ -6,10 +6,12 @@ import ProjectM36.TupleSet
6import ProjectM36.Base
6import ProjectM36.Base
7import ProjectM36.Error
7import ProjectM36.Error
8import ProjectM36.Atom
8import ProjectM36.Atom
9import ProjectM36.AtomFunction
10import ProjectM36.AtomFunction
10import qualified ProjectM36.Attribute as A
11import qualified ProjectM36.Attribute as A
11import qualified Data.Map as M
12import qualified Data.Map as M
12import qualified Data.HashSet as HS
13import qualified Data.HashSet as HS
14+import qualified Data.Set as S
13import Control.Monad.State hiding (join)
15import Control.Monad.State hiding (join)
14import Data.Maybe
16import Data.Maybe
15import Data.Either
17import Data.Either
@@ -124,7 +126,7 @@ basicDatabaseContext = DatabaseContext { inclusionDependencies = M.empty,
126dateExamples :: DatabaseContext
128dateExamples :: DatabaseContext
127−dateExamples = DatabaseContext { inclusionDependencies = M.empty,
129+dateExamples = DatabaseContext { inclusionDependencies = dateIncDeps,
128 relationVariables = M.union (relationVariables basicDatabaseContext) dateRelVars,
130 relationVariables = M.union (relationVariables basicDatabaseContext) dateRelVars,
129 atomFunctions = basicAtomFunctions}
131 atomFunctions = basicAtomFunctions}
@@ -134,6 +136,11 @@ dateExamples = DatabaseContext { inclusionDependencies = M.empty,
134 suppliers = suppliersRel
136 suppliers = suppliersRel
135 products = productsRel
137 products = productsRel
136 supplierProducts = supplierProductsRel
138 supplierProducts = supplierProductsRel
139+ dateIncDeps = M.fromList [("S_pkey", simplePKey ["S#"] "S"),
140+ ("P_pkey", simplePKey ["P#"] "P"),
141+ ("SP_pkey", simplePKey ["S#", "P#"] "SP")
143+ simplePKey attrNames relvarName = inclusionDependencyForKey (AttributeNames $ S.fromList attrNames) (RelationVariable relvarName)
138suppliersRel :: Relation
145suppliersRel :: Relation
139suppliersRel = case mkRelationFromList attrs atomMatrix of
146suppliersRel = case mkRelationFromList attrs atomMatrix of
@@ -274,17 +281,20 @@ evalContextExpr (AddInclusionDependency newDepName newDep) = do
274 let currDeps = inclusionDependencies currContext
281 let currDeps = inclusionDependencies currContext
275 newDeps = M.insert newDepName newDep currDeps
282 newDeps = M.insert newDepName newDep currDeps
276 if M.member newDepName currDeps then
283 if M.member newDepName currDeps then
277− return $ Just (InclusionDepedencyNameInUseError newDepName)
284+ return $ Just (InclusionDependencyNameInUseError newDepName)
279 put $ DatabaseContext newDeps (relationVariables currContext) (atomFunctions currContext)
286 put $ DatabaseContext newDeps (relationVariables currContext) (atomFunctions currContext)
280 return Nothing
287 return Nothing
282evalContextExpr (RemoveInclusionDependency depName) = do
289evalContextExpr (RemoveInclusionDependency depName) = do
283 currContext <- get
290 currContext <- get
284 let currDeps = inclusionDependencies currContext
291 let currDeps = inclusionDependencies currContext
285 newDeps = M.delete depName currDeps
292 newDeps = M.delete depName currDeps
293+ if M.notMember depName currDeps then
294+ return $ Just (InclusionDependencyNameNotInUseError depName)
286− put $ DatabaseContext newDeps (relationVariables currContext) (atomFunctions currContext)
296+ put $ DatabaseContext newDeps (relationVariables currContext) (atomFunctions currContext)
287− return Nothing
297+ return Nothing
289evalContextExpr (MultipleExpr exprs) = do
299evalContextExpr (MultipleExpr exprs) = do
290 --the multiple expressions must pass the same context around- not the old unmodified context
300 --the multiple expressions must pass the same context around- not the old unmodified context