on master help sign in
add primary keys to date examples
636861eAgentM
ProjectM36/Error.hs+2−1
@@ -20,7 +20,8 @@ data RelationalError = NoSuchAttributeNamesError (S.Set AttributeName)
20 | RelVarAlreadyDefinedError RelVarName
20 | RelVarAlreadyDefinedError RelVarName
21 | RelVarAssignmentTypeMismatchError Attributes Attributes --expected, found
21 | RelVarAssignmentTypeMismatchError Attributes Attributes --expected, found
22 | InclusionDependencyCheckError IncDepName
22 | InclusionDependencyCheckError IncDepName
23− | InclusionDepedencyNameInUseError IncDepName
23+ | InclusionDependencyNameInUseError IncDepName
24+ | InclusionDependencyNameNotInUseError IncDepName
24 | ParseError T.Text
25 | ParseError T.Text
25 | PredicateExpressionError T.Text
26 | PredicateExpressionError T.Text
26 | NoSuchTransactionError U.UUID
27 | NoSuchTransactionError U.UUID
ProjectM36/RelationalExpression.hs+15−5
@@ -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
9+import ProjectM36.Key
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,
124 }
126 }
125
127
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}
130 where
132 where
@@ -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")
142+ ]
143+ simplePKey attrNames relvarName = inclusionDependencyForKey (AttributeNames $ S.fromList attrNames) (RelationVariable relvarName)
137
144
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)
278 else do
285 else do
279 put $ DatabaseContext newDeps (relationVariables currContext) (atomFunctions currContext)
286 put $ DatabaseContext newDeps (relationVariables currContext) (atomFunctions currContext)
280 return Nothing
287 return Nothing
281−
288+
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)
295+ else do
286− put $ DatabaseContext newDeps (relationVariables currContext) (atomFunctions currContext)
296+ put $ DatabaseContext newDeps (relationVariables currContext) (atomFunctions currContext)
287− return Nothing
297+ return Nothing
288
298
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
TutorialD/Interpreter/DatabaseExpr.hs+10−3
@@ -17,9 +17,10 @@ import ProjectM36.Key
17--parsers which create "database expressions" which modify the database context (such as relvar assignment)
17--parsers which create "database expressions" which modify the database context (such as relvar assignment)
18databaseExprP :: Parser DatabaseExpr
18databaseExprP :: Parser DatabaseExpr
19databaseExprP = insertP
19databaseExprP = insertP
20+ <|> deleteConstraintP
20 <|> deleteP
21 <|> deleteP
21 <|> updateP
22 <|> updateP
22− <|> constraintP
23+ <|> addConstraintP
23 <|> keyP
24 <|> keyP
24 <|> defineP
25 <|> defineP
25 <|> undefineP
26 <|> undefineP
@@ -76,8 +77,8 @@ updateP = do
76 attributeAssignments <- liftM M.fromList $ parens (sepBy attributeAssignmentP comma)
77 attributeAssignments <- liftM M.fromList $ parens (sepBy attributeAssignmentP comma)
77 return $ Update (T.pack relVarName) (M.mapKeys T.pack $ attributeAssignments) predicate
78 return $ Update (T.pack relVarName) (M.mapKeys T.pack $ attributeAssignments) predicate
78
79
79−constraintP :: Parser DatabaseExpr
80+addConstraintP :: Parser DatabaseExpr
80−constraintP = do
81+addConstraintP = do
81 reservedOp "constraint" <|> reservedOp "foreign key"
82 reservedOp "constraint" <|> reservedOp "foreign key"
82 constraintName <- identifier
83 constraintName <- identifier
83 subset <- relExprP
84 subset <- relExprP
@@ -85,6 +86,12 @@ constraintP = do
85 superset <- relExprP
86 superset <- relExprP
86 return $ AddInclusionDependency (T.pack constraintName) (InclusionDependency subset superset)
87 return $ AddInclusionDependency (T.pack constraintName) (InclusionDependency subset superset)
87
88
89+deleteConstraintP :: Parser DatabaseExpr
90+deleteConstraintP = do
91+ reserved "deleteconstraint"
92+ constraintName <- identifier
93+ return $ RemoveInclusionDependency (T.pack constraintName)
94+
88-- key <constraint name> {<uniqueness attributes>} <uniqueness relexpr>
95-- key <constraint name> {<uniqueness attributes>} <uniqueness relexpr>
89keyP :: Parser DatabaseExpr
96keyP :: Parser DatabaseExpr
90keyP = do
97keyP = do