@@ -8,6 +8,7 @@ import RelationalError
88import RelationExpr
99import RelationTerm
1010import RelationalTransaction
11+import RelationalTransactionShow
1112import Text.Parsec
1213import Text.Parsec.String
1314import Text.Parsec.Expr
@@ -25,6 +26,21 @@ import System.Directory (getHomeDirectory)
2526import qualified Data.UUID as U
2627import Data.UUID.V4 (nextRandom)
2728
29+{-
30+List of Tutorial D operators:
31+show relation expression type :: relexpr -> context -> opresult
32+show relvar :: relvar name -> context -> opresult
33+quit :: ()
34+show graph :: graph -> DisconnectedTransaction -> opresult
35+show constraints :: context -> opresult
36+jump to head :: head name -> graph -> DisconnectedTransaction (graph unchanged)
37+jump to UUID :: uuid -> graph -> DisconnectedTransaction (graph unchanged)
38+branch :: uuid -> branch name -> graph -> (DisconnectedTransation, graph)
39+commit :: uuid -> DisconnectedTransaction -> graph -> (DisconnectedTransaction, graph)
40+rollback :: DisconnectedTransaction -> graph -> (DisconnectedTransaction, graph)
41+
42+
43+-}
2844lexer :: Token.TokenParser ()
2945lexer = Token.makeTokenParser tutD
3046 where tutD = emptyDef {
@@ -260,6 +276,7 @@ data GraphOperator where
260276 Branch :: HeadName -> GraphOperator
261277 Commit :: GraphOperator
262278 Rollback :: GraphOperator
279+ ShowGraph :: GraphOperator
263280 deriving (Show)
264281
265282typeP :: Parser ContextOperator
@@ -270,7 +287,7 @@ typeP = do
270287
271288showRelP :: Parser ContextOperator
272289showRelP = do
273− reservedOp ":show"
290+ reservedOp ":showExpr"
274291 expr <- relExpr
275292 return $ ShowRelation expr
276293
@@ -313,12 +330,18 @@ rollbackTransactionP = do
313330 reservedOp ":rollback"
314331 return $ Rollback
315332
333+showGraphP :: Parser GraphOperator
334+showGraphP = do
335+ reservedOp ":showGraph"
336+ return $ ShowGraph
337+
316338transactionGraphOps = do
317339 jumpToHeadP
318340 <|> jumpToTransactionP
319341 <|> branchTransactionP
320342 <|> commitTransactionP
321343 <|> rollbackTransactionP
344+ <|> showGraphP
322345
323346contextOps :: Parser ContextOperator
324347contextOps = typeP
@@ -341,6 +364,7 @@ showRelationAttributes rel = "{" ++ concat (L.intersperse ", " $ map showAttribu
341364data TutorialDOperatorResult = QuitResult |
342365 DisplayResult String |
343366 DisplayErrorResult String |
367+ QuietSuccessResult |
344368 NoActionResult
345369
346370evalContextOp :: DatabaseContext -> ContextOperator -> TutorialDOperatorResult
@@ -366,12 +390,12 @@ evalContextOp context (Quit) = QuitResult
366390
367391-- returns the new "current" transaction, updated graph, and tutorial d result
368392-- the current transaction is not part of the transaction graph until it is committed
369−evalGraphOp :: U.UUID -> DisconnectedTransaction -> TransactionGraph -> GraphOperator -> Either RelationalError (DisconnectedTransaction, TransactionGraph)
393+evalGraphOp :: U.UUID -> DisconnectedTransaction -> TransactionGraph -> GraphOperator -> Either RelationalError (DisconnectedTransaction, TransactionGraph, TutorialDOperatorResult)
370394
371395--affects only disconncted transaction
372396evalGraphOp newUUID trans graph (JumpToTransaction jumpUUID) = case transactionForUUID jumpUUID graph of
373397 Left err -> Left err
374− Right parentTrans -> Right (newTrans, graph)
398+ Right parentTrans -> Right (newTrans, graph, QuietSuccessResult)
375399 where
376400 newTrans = DisconnectedTransaction jumpUUID (transactionContext parentTrans)
377401
@@ -380,7 +404,7 @@ evalGraphOp newUUID trans graph (JumpToTransaction jumpUUID) = case transactionF
380404evalGraphOp newUUID currentTransaction graph (JumpToHead headName) =
381405 case transactionForHead headName graph of
382406 Just newHeadTransaction -> let disconnectedTrans = newDisconnectedTransaction (transactionUUID newHeadTransaction) (transactionContext newHeadTransaction) in
383− Right (disconnectedTrans, graph)
407+ Right (disconnectedTrans, graph, QuietSuccessResult)
384408 Nothing -> Left $ NoSuchHeadNameError headName
385409-- add new head pointing to branchPoint
386410-- repoint the disconnected transaction to the new branch commit (with a potentially different disconnected context)
@@ -401,7 +425,7 @@ evalGraphOp newUUID discon@(DisconnectedTransaction parentUUID disconContext) gr
401425 Left err -> Left err
402426 Right parentTrans -> case addBranch newUUID newBranchName parentTrans graph of
403427 Left err -> Left err
404− Right (newTrans, newGraph) -> Right (newDiscon, newGraph)
428+ Right (newTrans, newGraph) -> Right (newDiscon, newGraph, QuietSuccessResult)
405429 where
406430 newDiscon = DisconnectedTransaction newUUID disconContext
407431
@@ -413,18 +437,23 @@ evalGraphOp newTransUUID discon@(DisconnectedTransaction parentUUID context) gra
413437 Nothing -> Left $ TransactionIsNotAHeadError parentUUID
414438 Just headName -> case maybeUpdatedGraph of
415439 Left err-> Left err
416− Right (_, updatedGraph) -> Right (newDisconnectedTrans, updatedGraph)
440+ Right (_, updatedGraph) -> Right (newDisconnectedTrans, updatedGraph, QuietSuccessResult)
417441 where
418442 newDisconnectedTrans = newDisconnectedTransaction newTransUUID context
419443 --parentTransaction = transactionForUUID parentUUID graph
420444 maybeUpdatedGraph = addDisconnectedTransaction newTransUUID headName discon graph
421445
422446-- refresh the disconnected transaction, return the same graph
423−evalGraphOp newTransUUID discon@(DisconnectedTransaction parentUUID _) graph Rollback = case transactionForUUID parentUUID graph of
447+evalGraphOp _ discon@(DisconnectedTransaction parentUUID _) graph Rollback = case transactionForUUID parentUUID graph of
424448 Left err -> Left err
425− Right parentTransaction -> Right (newDiscon, graph)
449+ Right parentTransaction -> Right (newDiscon, graph, QuietSuccessResult)
426450 where
427451 newDiscon = newDisconnectedTransaction parentUUID (transactionContext parentTransaction)
452+
453+--display transaction graph as relation
454+evalGraphOp _ discon graph ShowGraph = do
455+ graphStr <- graphAsRelation discon graph
456+ return (discon, graph, DisplayResult $ showRelation graphStr)
428457
429458--shouldn't this be Either RelationalError DatabaseContext?
430459interpret :: DatabaseContext -> String -> (Maybe RelationalError, DatabaseContext)
@@ -440,7 +469,7 @@ interpretOps newUUID trans@(DisconnectedTransaction parentUUID context) transGra
440469 Left contextOp -> (trans, transGraph, (evalContextOp context contextOp))
441470 Right graphOp -> case evalGraphOp newUUID trans transGraph graphOp of
442471 Left err -> (trans, transGraph, DisplayErrorResult $ show err)
443− Right (newDiscon, newGraph) -> (newDiscon, newGraph, DisplayResult "Done.")
472+ Right (newDiscon, newGraph, result) -> (newDiscon, newGraph, result)
444473
445474promptText :: DisconnectedTransaction -> TransactionGraph -> String
446475promptText (DisconnectedTransaction parentUUID _) graph = "TutorialD (" ++ transInfo ++ "): "