@@ -21,7 +21,7 @@ import qualified Data.Set as S
21import qualified Data.HashSet as HS
21import qualified Data.HashSet as HS
22import qualified Data.Map as M
22import qualified Data.Map as M
23import qualified Data.List as L
23import qualified Data.List as L
24−import Control.Applicative (liftA, (<*), (*>))
24+import Control.Applicative (liftA, (<*), (*>), (<*>), (<$>))
25import Control.Monad.State
25import Control.Monad.State
26import System.Console.Haskeline
26import System.Console.Haskeline
27import System.IO
27import System.IO
@@ -191,6 +191,14 @@ ungroupP = do
191 rvaAttrName <- identifier
191 rvaAttrName <- identifier
192 return $ Ungroup (T.pack rvaAttrName)
192 return $ Ungroup (T.pack rvaAttrName)
194+extendP :: Parser RelationalExpr
199+ tupleExpr <- braces tupleExpressionP
200+ return $ Extend tupleExpr expr
194relOperators = [
202relOperators = [
195 [Postfix projectOp],
203 [Postfix projectOp],
196 [Postfix renameP],
204 [Postfix renameP],
@@ -203,7 +211,7 @@ relOperators = [
205relExpr :: Parser RelationalExpr
213relExpr :: Parser RelationalExpr
206−relExpr = buildExpressionParser relOperators relTerm
214+relExpr = extendP <|> buildExpressionParser relOperators relTerm
208databaseExpr :: Parser DatabaseExpr
216databaseExpr :: Parser DatabaseExpr
209databaseExpr = insertP
217databaseExpr = insertP
@@ -500,7 +508,7 @@ interpretNO context tutdstring = case parseString tutdstring of
500 Left err -> (Just err, context)
508 Left err -> (Just err, context)
501 Right parsed -> runState (evalContextExpr parsed) context
509 Right parsed -> runState (evalContextExpr parsed) context
503−-- for interpreter-specific operations
511+-- for interpreter-specific operations
504interpretOps :: U.UUID -> DisconnectedTransaction -> TransactionGraph -> String -> (DisconnectedTransaction, TransactionGraph, TutorialDOperatorResult)
512interpretOps :: U.UUID -> DisconnectedTransaction -> TransactionGraph -> String -> (DisconnectedTransaction, TransactionGraph, TutorialDOperatorResult)
505interpretOps newUUID trans@(DisconnectedTransaction _ context) transGraph instring = case parse interpreterOps "" instring of
513interpretOps newUUID trans@(DisconnectedTransaction _ context) transGraph instring = case parse interpreterOps "" instring of
506 Left _ -> (trans, transGraph, NoActionResult)
514 Left _ -> (trans, transGraph, NoActionResult)
@@ -588,3 +596,17 @@ intAtomP = do
588displayTransactionGraph :: TransactionGraph -> String
596displayTransactionGraph :: TransactionGraph -> String
589displayTransactionGraph (TransactionGraph _ transSet) = L.intercalate "\n" $ S.foldr (\(Transaction tUUID pUUID _ ) acc -> acc ++ [show tUUID ++ " " ++ show pUUID]) [] transSet
597displayTransactionGraph (TransactionGraph _ transSet) = L.intercalate "\n" $ S.foldr (\(Transaction tUUID pUUID _ ) acc -> acc ++ [show tUUID ++ " " ++ show pUUID]) [] transSet
600+multiTupleExpressionP :: Parser TupleExpr
601+multiTupleExpressionP = MultipleTupleExpr <$> (sepBy tupleExpressionP comma)
603+tupleExpressionP :: Parser TupleExpr
604+tupleExpressionP = attributeTupleExpressionP
606+attributeTupleExpressionP :: Parser TupleExpr
607+attributeTupleExpressionP = do
608+ newAttr <- identifier
611+ return $ AttributeTupleExpr (T.pack newAttr) (T.pack attr)