2module TutorialD.Interpreter.RODatabaseContextOperator where
5import ProjectM36.InclusionDependency
6import qualified ProjectM36.Client as C
8import Text.Megaparsec.Text
9import TutorialD.Interpreter.Base
10import TutorialD.Interpreter.RelationalExpr
11import TutorialD.Interpreter.DatabaseContextExpr
12import Control.Monad.State
13import qualified Data.Text as T
14import ProjectM36.Relation.Show.Gnuplot
15import qualified Data.Map as M
18--operators which only rely on database context reading
19data RODatabaseContextOperator where
20 ShowRelation :: RelationalExpr -> RODatabaseContextOperator
21 PlotRelation :: RelationalExpr -> RODatabaseContextOperator
22 ShowRelationType :: RelationalExpr -> RODatabaseContextOperator
23 ShowConstraint :: StringType -> RODatabaseContextOperator
24 ShowPlan :: DatabaseContextExpr -> RODatabaseContextOperator
25 ShowTypes :: RODatabaseContextOperator
26 ShowRelationVariables :: RODatabaseContextOperator
27 Quit :: RODatabaseContextOperator
30typeP :: Parser RODatabaseContextOperator
34 return $ ShowRelationType expr
36showRelP :: Parser RODatabaseContextOperator
38 reservedOp ":showexpr"
40 return $ ShowRelation expr
42showPlanP :: Parser RODatabaseContextOperator
44 reservedOp ":showplan"
45 expr <- databaseContextExprP
46 return $ ShowPlan expr
48showTypesP :: Parser RODatabaseContextOperator
49showTypesP = reserved ":showtypes" >> pure ShowTypes
51showRelationVariables :: Parser RODatabaseContextOperator
52showRelationVariables = reserved ":showrelvars" >> pure ShowRelationVariables
54quitP :: Parser RODatabaseContextOperator
59showConstraintsP :: Parser RODatabaseContextOperator
61 reservedOp ":constraints"
62 constraintName <- option "" identifier
63 return $ ShowConstraint constraintName
65plotRelExprP :: Parser RODatabaseContextOperator
69 return $ PlotRelation expr
71roDatabaseContextOperatorP :: Parser RODatabaseContextOperator
72roDatabaseContextOperatorP = typeP
74 <|> showRelationVariables
81--logically, these read-only operations could happen purely, but not if a remote call is required
82evalRODatabaseContextOp :: C.SessionId -> C.Connection -> RODatabaseContextOperator -> IO TutorialDOperatorResult
83evalRODatabaseContextOp sessionId conn (ShowRelationType expr) = do
84 res <- C.typeForRelationalExpr sessionId conn expr
86 Left err -> pure $ DisplayErrorResult $ T.pack (show err)
87 Right rel -> pure $ DisplayRelationResult rel
89evalRODatabaseContextOp sessionId conn (ShowRelation expr) = do
90 res <- C.executeRelationalExpr sessionId conn expr
92 Left err -> pure $ DisplayErrorResult $ T.pack (show err)
93 Right rel -> pure $ DisplayRelationResult rel
95evalRODatabaseContextOp sessionId conn (PlotRelation expr) = do
96 res <- C.executeRelationalExpr sessionId conn expr
98 Left err -> DisplayErrorResult $ T.pack (show err)
99 Right rel -> DisplayIOResult $ do
100 err <- plotRelation rel
101 when (isJust err) $ print err
103evalRODatabaseContextOp sessionId conn (ShowConstraint name) = do
104 eIncDeps <- C.inclusionDependencies sessionId conn
105 let val = case eIncDeps of
107 Right incDeps -> case name of
108 "" -> inclusionDependenciesAsRelation incDeps
109 depName -> case M.lookup depName incDeps of
110 Nothing -> Left (InclusionDependencyNameNotInUseError depName)
111 Just dep -> inclusionDependenciesAsRelation (M.singleton depName dep)
113 Left err -> DisplayErrorResult (T.pack (show err))
114 Right rel -> DisplayRelationResult rel
116evalRODatabaseContextOp sessionId conn (ShowPlan dbExpr) = do
117 plan <- C.planForDatabaseContextExpr sessionId conn dbExpr
119 Left err -> DisplayErrorResult (T.pack (show err))
120 Right optDbExpr -> DisplayResult $ T.pack (show optDbExpr)
122evalRODatabaseContextOp sessionId conn ShowTypes = do
123 eRel <- C.atomTypesAsRelation sessionId conn
125 Left err -> pure $ DisplayErrorResult (T.pack (show err))
126 Right rel -> evalRODatabaseContextOp sessionId conn (ShowRelation (ExistingRelation rel))
128evalRODatabaseContextOp sessionId conn ShowRelationVariables = do
129 eRel <- C.relationVariablesAsRelation sessionId conn
131 Left err -> pure $ DisplayErrorResult (T.pack (show err))
132 Right rel -> evalRODatabaseContextOp sessionId conn (ShowRelation (ExistingRelation rel))
134evalRODatabaseContextOp _ _ Quit = pure QuitResult
136interpretRODatabaseContextOp :: C.SessionId -> C.Connection -> T.Text -> IO TutorialDOperatorResult
137interpretRODatabaseContextOp sessionId conn tutdstring = case parse roDatabaseContextOperatorP "" tutdstring of
138 Left err -> pure $ DisplayErrorResult (T.pack (show err))
139 Right parsed -> evalRODatabaseContextOp sessionId conn parsed
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list