on master help sign in
add primary keys to date examples

add "deleteconstraint" database expr parsing

commit636861e824591db3aea1b221b6a33c72e8546e5b authorAgentM <agentm@themactionfaction.com> dateSat 13 Jun 2015, 19:09 (11 years ago) parentf1f00f7
3 files changed+27−9
ProjectM36/Error.hs+2−1 ProjectM36/RelationalExpression.hs+15−5 TutorialD/Interpreter/DatabaseExpr.hs+10−3
ProjectM36/Error.hs+2−1
@@ -20,7 +20,8 @@ data RelationalError = NoSuchAttributeNamesError (S.Set AttributeName)
2020 | RelVarAlreadyDefinedError RelVarName
2121 | RelVarAssignmentTypeMismatchError Attributes Attributes --expected, found
2222 | InclusionDependencyCheckError IncDepName
23− | InclusionDepedencyNameInUseError IncDepName
23+ | InclusionDependencyNameInUseError IncDepName
24+ | InclusionDependencyNameNotInUseError IncDepName
2425 | ParseError T.Text
2526 | PredicateExpressionError T.Text
2627 | NoSuchTransactionError U.UUID
ProjectM36/RelationalExpression.hs+15−5
@@ -6,10 +6,12 @@ import ProjectM36.TupleSet
66import ProjectM36.Base
77import ProjectM36.Error
88import ProjectM36.Atom
9+import ProjectM36.Key
910import ProjectM36.AtomFunction
1011import qualified ProjectM36.Attribute as A
1112import qualified Data.Map as M
1213import qualified Data.HashSet as HS
14+import qualified Data.Set as S
1315import Control.Monad.State hiding (join)
1416import Data.Maybe
1517import Data.Either
@@ -124,7 +126,7 @@ basicDatabaseContext = DatabaseContext { inclusionDependencies = M.empty,
124126 }
125127
126128dateExamples :: DatabaseContext
127−dateExamples = DatabaseContext { inclusionDependencies = M.empty,
129+dateExamples = DatabaseContext { inclusionDependencies = dateIncDeps,
128130 relationVariables = M.union (relationVariables basicDatabaseContext) dateRelVars,
129131 atomFunctions = basicAtomFunctions}
130132 where
@@ -134,6 +136,11 @@ dateExamples = DatabaseContext { inclusionDependencies = M.empty,
134136 suppliers = suppliersRel
135137 products = productsRel
136138 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)
137144
138145suppliersRel :: Relation
139146suppliersRel = case mkRelationFromList attrs atomMatrix of
@@ -274,17 +281,20 @@ evalContextExpr (AddInclusionDependency newDepName newDep) = do
274281 let currDeps = inclusionDependencies currContext
275282 newDeps = M.insert newDepName newDep currDeps
276283 if M.member newDepName currDeps then
277− return $ Just (InclusionDepedencyNameInUseError newDepName)
284+ return $ Just (InclusionDependencyNameInUseError newDepName)
278285 else do
279286 put $ DatabaseContext newDeps (relationVariables currContext) (atomFunctions currContext)
280287 return Nothing
281−
288+
282289evalContextExpr (RemoveInclusionDependency depName) = do
283290 currContext <- get
284291 let currDeps = inclusionDependencies currContext
285292 newDeps = M.delete depName currDeps
286− put $ DatabaseContext newDeps (relationVariables currContext) (atomFunctions currContext)
287− return Nothing
293+ if M.notMember depName currDeps then
294+ return $ Just (InclusionDependencyNameNotInUseError depName)
295+ else do
296+ put $ DatabaseContext newDeps (relationVariables currContext) (atomFunctions currContext)
297+ return Nothing
288298
289299evalContextExpr (MultipleExpr exprs) = do
290300 --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
1717--parsers which create "database expressions" which modify the database context (such as relvar assignment)
1818databaseExprP :: Parser DatabaseExpr
1919databaseExprP = insertP
20+ <|> deleteConstraintP
2021 <|> deleteP
2122 <|> updateP
22− <|> constraintP
23+ <|> addConstraintP
2324 <|> keyP
2425 <|> defineP
2526 <|> undefineP
@@ -76,8 +77,8 @@ updateP = do
7677 attributeAssignments <- liftM M.fromList $ parens (sepBy attributeAssignmentP comma)
7778 return $ Update (T.pack relVarName) (M.mapKeys T.pack $ attributeAssignments) predicate
7879
79−constraintP :: Parser DatabaseExpr
80−constraintP = do
80+addConstraintP :: Parser DatabaseExpr
81+addConstraintP = do
8182 reservedOp "constraint" <|> reservedOp "foreign key"
8283 constraintName <- identifier
8384 subset <- relExprP
@@ -85,6 +86,12 @@ constraintP = do
8586 superset <- relExprP
8687 return $ AddInclusionDependency (T.pack constraintName) (InclusionDependency subset superset)
8788
89+deleteConstraintP :: Parser DatabaseExpr
90+deleteConstraintP = do
91+ reserved "deleteconstraint"
92+ constraintName <- identifier
93+ return $ RemoveInclusionDependency (T.pack constraintName)
94+
8895-- key <constraint name> {<uniqueness attributes>} <uniqueness relexpr>
8996keyP :: Parser DatabaseExpr
9097keyP = do