@@ -141,6 +141,7 @@ databaseExpr :: Parser DatabaseExpr
141databaseExpr = insertP
141databaseExpr = insertP
142 <|> deleteP
142 <|> deleteP
143 <|> updateP
143 <|> updateP
144 <|> try defineP
145 <|> try defineP
145 <|> try assignP
146 <|> try assignP
@@ -177,6 +178,15 @@ updateP = do
177 attributeAssignments <- liftM M.fromList $ parens (sepBy attributeAssignment comma)
178 attributeAssignments <- liftM M.fromList $ parens (sepBy attributeAssignment comma)
178 return $ Update relVarName attributeAssignments
179 return $ Update relVarName attributeAssignments
181+constraintP :: Parser DatabaseExpr
183+ reservedOp "constraint"
184+ constraintName <- identifier
188+ return $ AddInclusionDependency (InclusionDependency constraintName subset superset)
180attributeAssignment :: Parser (String, RelationalExpr)
190attributeAssignment :: Parser (String, RelationalExpr)
181attributeAssignment = do
191attributeAssignment = do
182 attrName <- identifier
192 attrName <- identifier
@@ -192,6 +202,7 @@ parseString str = case parse multipleDatabaseExpr "" str of
192data TutorialDOperator where
202data TutorialDOperator where
193 ShowRelation :: RelationalExpr -> TutorialDOperator
203 ShowRelation :: RelationalExpr -> TutorialDOperator
194 ShowRelationVariableType :: String -> TutorialDOperator
204 ShowRelationVariableType :: String -> TutorialDOperator
205+ ShowConstraint :: String -> TutorialDOperator
195 deriving (Show)
206 deriving (Show)
197typeP :: Parser TutorialDOperator
208typeP :: Parser TutorialDOperator
@@ -200,15 +211,22 @@ typeP = do
200 relVarName <- identifier
211 relVarName <- identifier
201 return $ ShowRelationVariableType relVarName
212 return $ ShowRelationVariableType relVarName
203−showP :: Parser TutorialDOperator
214+showRelP :: Parser TutorialDOperator
204−showP = do
215+showRelP = do
205 reservedOp ":s"
216 reservedOp ":s"
206 expr <- relExpr
217 expr <- relExpr
207 return $ ShowRelation expr
218 return $ ShowRelation expr
220+showConstraintsP :: Parser TutorialDOperator
221+showConstraintsP = do
223+ constraintName <- option "" identifier
224+ return $ ShowConstraint constraintName
209interpreterOps :: Parser TutorialDOperator
226interpreterOps :: Parser TutorialDOperator
210interpreterOps = typeP
227interpreterOps = typeP
211− <|> showP
228+ <|> showRelP
229+ <|> showConstraintsP
213showRelationAttributes :: Relation -> String
231showRelationAttributes :: Relation -> String
214showRelationAttributes rel = "{" ++ concat (L.intersperse ", " $ map showAttribute attrs) ++ "}"
232showRelationAttributes rel = "{" ++ concat (L.intersperse ", " $ map showAttribute attrs) ++ "}"
@@ -228,6 +246,14 @@ evalTutorialDOp context (ShowRelation expr) = do
228 case runState (evalRelationalExpr expr) context of
246 case runState (evalRelationalExpr expr) context of
229 (Left err, _) -> show err
247 (Left err, _) -> show err
230 (Right rel, _) -> showRelation rel
248 (Right rel, _) -> showRelation rel
250+evalTutorialDOp context (ShowConstraint name) = do
253+ deps = inclusionDependencies context
254+ filteredDeps = case name of
256+ name -> HS.filter (\(InclusionDependency n _ _) -> n == name) deps
232example1 = "relA {a,b, c}"
258example1 = "relA {a,b, c}"
233example2 = "relA join relB"
259example2 = "relA join relB"