Skip to content

Commit

Permalink
add support for drop table sql
Browse files Browse the repository at this point in the history
add display for equivalent tutoriald migration/learning assistant
  • Loading branch information
agentm committed Mar 13, 2024
1 parent 7653dfd commit f7976dd
Show file tree
Hide file tree
Showing 9 changed files with 109 additions and 8 deletions.
7 changes: 5 additions & 2 deletions project-m36.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,8 @@ Library
ProjectM36.SQL.Insert,
ProjectM36.SQL.Delete,
ProjectM36.SQL.DBUpdate,
ProjectM36.SQL.CreateTable
ProjectM36.SQL.CreateTable,
ProjectM36.SQL.DropTable
GHC-Options: -Wall -rdynamic
if os(windows)
Build-Depends: Win32 >= 2.12
Expand Down Expand Up @@ -295,7 +296,9 @@ Executable sqlegacy
SQL.Interpreter.Insert,
SQL.Interpreter.Delete,
SQL.Interpreter.DBUpdate,
SQL.Interpreter.CreateTable
SQL.Interpreter.CreateTable,
SQL.Interpreter.DropTable,
TutorialD.Printer

Main-Is: ./SQL/Interpreter/sqlegacy.hs
if os(windows)
Expand Down
4 changes: 4 additions & 0 deletions src/bin/ProjectM36/Interpreter.hs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ data ConsoleResult = QuitResult |
DisplayIOResult (IO ()) |
DisplayRelationResult Relation |
DisplayDataFrameResult DataFrame |
DisplayHintWith Text ConsoleResult |
DisplayErrorResult StringType |
DisplayRelationalErrorResult RelationalError |
DisplayParseErrorResult (Maybe PromptLength) ParserError | -- PromptLength refers to length of prompt text
Expand Down Expand Up @@ -55,3 +56,6 @@ displayResult (DisplayParseErrorResult mPromptLength err) = do
displayResult (DisplayDataFrameResult dFrame) = TIO.putStrLn (showDataFrame dFrame)
displayResult (DisplayRelationalErrorResult err) =
TIO.putStrLn ("ERR:" <> T.pack (show err))
displayResult (DisplayHintWith hint result) = do
displayResult (DisplayResult hint)
displayResult result
12 changes: 8 additions & 4 deletions src/bin/SQL/Interpreter.hs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import ProjectM36.SQL.Select
import ProjectM36.DatabaseContext
import ProjectM36.DateExamples
import ProjectM36.Error
import TutorialD.Printer
import SQL.Interpreter.ImportBasicExample
import SQL.Interpreter.TransactionGraphOperator
import SQL.Interpreter.Select
Expand Down Expand Up @@ -49,23 +50,26 @@ evalSQLInteractive sessionId conn safeFlag interactiveConsole command =
case eDFExpr of
Left err -> pure $ DisplayRelationalErrorResult err
Right dfExpr -> do
let hint = renderPretty dfExpr
eDF <- C.executeDataFrameExpr sessionId conn dfExpr
case eDF of
Left err -> pure $ DisplayRelationalErrorResult err
Right df -> pure $ DisplayDataFrameResult df
Right df -> pure $ DisplayHintWith ("[Equivalent TutorialD] " <> hint) (DisplayDataFrameResult df)
ImportBasicExampleOp (ImportBasicExampleOperator exampleName) -> do
if exampleName == "cjdate" then
evalSQLInteractive sessionId conn safeFlag interactiveConsole (DatabaseContextExprOp (databaseContextAsDatabaseContextExpr dateExamples))
else
pure (DisplayErrorResult ("No such example: " <> exampleName))
DatabaseContextExprOp dbcExpr -> do
eHandler $ C.executeDatabaseContextExpr sessionId conn dbcExpr
eHandler $ C.executeDatabaseContextExpr sessionId conn dbcExpr
DBUpdateOp updates -> do
eDBCExpr <- C.convertSQLDBUpdates sessionId conn updates
case eDBCExpr of
Left err -> pure $ DisplayRelationalErrorResult err
Right dbcExpr ->
evalSQLInteractive sessionId conn safeFlag interactiveConsole (DatabaseContextExprOp dbcExpr)
Right dbcExpr -> do
let hint = renderPretty dbcExpr
_ <- eHandler $ C.executeDatabaseContextExpr sessionId conn dbcExpr
pure $ DisplayHintWith ("Equivalent TutorialD: " <> hint) QuietSuccessResult
TransactionGraphOp Commit -> do
eHandler $ C.commit sessionId conn
TransactionGraphOp Rollback -> do
Expand Down
4 changes: 3 additions & 1 deletion src/bin/SQL/Interpreter/DBUpdate.hs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import SQL.Interpreter.Update
import SQL.Interpreter.Insert
import SQL.Interpreter.Delete
import SQL.Interpreter.CreateTable
import SQL.Interpreter.DropTable
import SQL.Interpreter.Base
import Text.Megaparsec

Expand All @@ -15,5 +16,6 @@ dbUpdateP :: Parser DBUpdate
dbUpdateP = (UpdateUpdate <$> updateP <* semi) <|>
(UpdateInsert <$> insertP <* semi) <|>
(UpdateDelete <$> deleteP <* semi) <|>
(UpdateCreateTable <$> createTableP <* semi)
(UpdateCreateTable <$> createTableP <* semi) <|>
(UpdateDropTable <$> dropTableP <* semi)

10 changes: 10 additions & 0 deletions src/bin/SQL/Interpreter/DropTable.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
module SQL.Interpreter.DropTable where
import ProjectM36.SQL.DropTable
import SQL.Interpreter.Select
import SQL.Interpreter.Base
import ProjectM36.Interpreter

dropTableP :: Parser DropTable
dropTableP = do
reserveds "drop table"
DropTable <$> tableNameP
55 changes: 55 additions & 0 deletions src/bin/TutorialD/Printer.hs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import ProjectM36.Base
import ProjectM36.Attribute as A hiding (null)
import ProjectM36.DataFrame
import Prettyprinter
import Prettyprinter.Render.Text
import qualified Data.Set as S hiding (fromList)
import qualified Data.Vector as V
import qualified Data.Map.Strict as M
Expand All @@ -16,6 +17,10 @@ import Data.Time.Clock.POSIX
import qualified Data.ByteString.Base64 as B64
import qualified Data.Text.Encoding as TE
import Data.UUID hiding (null)
import Data.Text (Text)

renderPretty :: Pretty a => a -> Text
renderPretty = renderStrict . layoutPretty defaultLayoutOptions . pretty

instance Pretty Atom where
pretty (IntegerAtom x) = pretty x
Expand Down Expand Up @@ -193,6 +198,56 @@ instance Pretty Order where
pretty AscendingOrder = "ascending"
pretty DescendingOrder = "descending"

instance Pretty DatabaseContextExpr where
pretty expr =
case expr of
NoOperation -> mempty
Define rvname attrExprs -> pretty rvname <+> "::" <+> bracesList (map pretty attrExprs)
Undefine rvname -> "undefine" <+> pretty rvname
Assign rvname relExpr -> pretty rvname <+> ":=" <+> pretty relExpr
Insert rvname relExpr -> "insert" <+> pretty rvname <+> pretty relExpr
Delete rvname restExpr -> "delete" <+> pretty rvname <+> "where" <+> pretty restExpr
Update rvname attrAtomMap restExpr -> "update" <+> pretty rvname <+> "where" <+> pretty restExpr <+> pretty attrAtomMap
AddInclusionDependency idName (InclusionDependency idA idB) ->
"constraint" <+> pretty idName <+> pretty idA <+> "in" <+> pretty idB
RemoveInclusionDependency idName -> "deleteconstraint" <+> pretty idName
AddNotification notName trigger old new ->
"notify" <+> pretty notName <+> pretty trigger <+> pretty old <+> pretty new
RemoveNotification notName ->
"unnotify" <+> pretty notName
AddTypeConstructor tConsDef dConss ->
"data" <+> pretty tConsDef <+> "=" <+> group (encloseSep "" "" "| " (pretty <$> dConss))
RemoveTypeConstructor tConsName ->
"undata" <+> pretty tConsName
RemoveAtomFunction fname ->
"removeatomfunction" <+> pretty fname
RemoveDatabaseContextFunction fname ->
"removedatabasecontextfunction" <+> pretty fname
ExecuteDatabaseContextFunction fname atomExprs ->
"execute" <+> pretty fname <> prettyParensList atomExprs
AddRegisteredQuery rQName relExpr ->
"registerquery" <+> pretty rQName <+> pretty relExpr
RemoveRegisteredQuery rQName ->
"unregisterquery" <+> pretty rQName
MultipleExpr dbcExprs ->
group (encloseSep "" "" "; " (pretty <$> dbcExprs))

instance Pretty AttributeNameAtomExprMap where
pretty m =
group (encloseSep "(" ")" "," (map (\(attrName, atomExpr) -> pretty attrName <+> ":=" <+> pretty atomExpr) (M.toList m)))

instance Pretty TypeConstructorDef where
pretty (ADTypeConstructorDef tConsName tVarNames) = pretty tConsName <+> hsep (pretty <$> tVarNames)
pretty (PrimitiveTypeConstructorDef tConsName _atomType') = pretty tConsName

instance Pretty DataConstructorDef where
pretty (DataConstructorDef dConsName []) = pretty dConsName
pretty (DataConstructorDef dConsName args) = "(" <+> pretty dConsName <+> hsep (pretty <$> args) <+> ")"

instance Pretty DataConstructorDefArg where
pretty (DataConstructorDefTypeConstructorArg tCons) = pretty tCons
pretty (DataConstructorDefTypeVarNameArg tVar) = pretty tVar

bracesList :: [Doc ann] -> Doc ann
bracesList = group . encloseSep (flatAlt "{ " "{") (flatAlt " }" "}") ", "

Expand Down
7 changes: 7 additions & 0 deletions src/lib/ProjectM36/SQL/Convert.hs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import ProjectM36.SQL.DBUpdate
import ProjectM36.SQL.Update as Update
import ProjectM36.SQL.Delete as Delete
import ProjectM36.SQL.CreateTable as CreateTable
import ProjectM36.SQL.DropTable as DropTable
import ProjectM36.RelationalExpression
import ProjectM36.DataFrame (DataFrameExpr(..), AttributeOrderExpr(..), Order(..), usesDataFrameFeatures)
import ProjectM36.AttributeNames as A
Expand Down Expand Up @@ -1170,6 +1171,7 @@ convertDBUpdate typeF (UpdateUpdate up) = convertUpdate typeF up
convertDBUpdate typeF (UpdateInsert ins) = convertInsert typeF ins
convertDBUpdate typeF (UpdateDelete del) = convertDelete typeF del
convertDBUpdate typeF (UpdateCreateTable ct) = convertCreateTable typeF ct
convertDBUpdate typeF (UpdateDropTable dt) = convertDropTable typeF dt

convertInsert :: TypeForRelExprF -> Insert -> ConvertM DatabaseContextExpr
convertInsert typeF ins = do
Expand Down Expand Up @@ -1212,6 +1214,11 @@ convertCreateTable _typeF ct = do
attrs <- convertColumnNamesAndTypes (CreateTable.targetColumns ct)
pure (Define rvTarget attrs)

convertDropTable :: TypeForRelExprF -> DropTable -> ConvertM DatabaseContextExpr
convertDropTable _typeF dt = do
rvTarget <- convertTableName (DropTable.target dt)
pure (Undefine rvTarget)

convertColumnNamesAndTypes :: [(UnqualifiedColumnName, ColumnType, PerColumnConstraints)] -> ConvertM [AttributeExpr]
convertColumnNamesAndTypes colAssocs =
mapM mkAttributeExpr colAssocs
Expand Down
4 changes: 3 additions & 1 deletion src/lib/ProjectM36/SQL/DBUpdate.hs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import ProjectM36.SQL.Update
import ProjectM36.SQL.Insert
import ProjectM36.SQL.Delete
import ProjectM36.SQL.CreateTable
import ProjectM36.SQL.DropTable
import Control.DeepSeq
import Codec.Winery
import GHC.Generics
Expand All @@ -12,7 +13,8 @@ import GHC.Generics
data DBUpdate = UpdateUpdate Update |
UpdateInsert Insert |
UpdateDelete Delete |
UpdateCreateTable CreateTable
UpdateCreateTable CreateTable |
UpdateDropTable DropTable
deriving (Show, Eq, Generic, NFData)
deriving Serialise via WineryVariant DBUpdate

Expand Down
14 changes: 14 additions & 0 deletions src/lib/ProjectM36/SQL/DropTable.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{-# LANGUAGE DeriveGeneric, DerivingStrategies, DerivingVia, DeriveAnyClass #-}
module ProjectM36.SQL.DropTable where
import ProjectM36.SQL.Select
import Control.DeepSeq
import Codec.Winery
import GHC.Generics

data DropTable = DropTable
{ target :: TableName }
deriving (Show, Eq, Generic, NFData)
deriving Serialise via WineryRecord DropTable



0 comments on commit f7976dd

Please sign in to comment.