@@ -28,7 +28,7 @@ data RODatabaseContextOperator where
28 ShowRelationVariables :: RODatabaseContextOperator
28 ShowRelationVariables :: RODatabaseContextOperator
29 ShowAtomFunctions :: RODatabaseContextOperator
29 ShowAtomFunctions :: RODatabaseContextOperator
30 ShowDatabaseContextFunctions :: RODatabaseContextOperator
30 ShowDatabaseContextFunctions :: RODatabaseContextOperator
31− ShowSortedDataFrame :: RelationalExpr -> AttributeName -> RODatabaseContextOperator
31+ ShowDataFrame :: RelationalExpr -> AttributeName -> Maybe Integer -> Maybe Integer -> RODatabaseContextOperator
32 Quit :: RODatabaseContextOperator
32 Quit :: RODatabaseContextOperator
33 deriving (Show)
33 deriving (Show)
@@ -84,7 +84,7 @@ roDatabaseContextOperatorP = typeP
84 <|> showTypesP
84 <|> showTypesP
85 <|> showAtomFunctionsP
85 <|> showAtomFunctionsP
86 <|> showDatabaseContextFunctionsP
86 <|> showDatabaseContextFunctionsP
87− <|> showSortedDataFrameP
87+ <|> showDataFrameP
90--logically, these read-only operations could happen purely, but not if a remote call is required
90--logically, these read-only operations could happen purely, but not if a remote call is required
@@ -152,7 +152,7 @@ evalRODatabaseContextOp sessionId conn ShowDatabaseContextFunctions = do
152 Left err -> pure $ DisplayErrorResult (T.pack (show err))
152 Left err -> pure $ DisplayErrorResult (T.pack (show err))
153 Right rel -> evalRODatabaseContextOp sessionId conn (ShowRelation (ExistingRelation rel))
153 Right rel -> evalRODatabaseContextOp sessionId conn (ShowRelation (ExistingRelation rel))
155−evalRODatabaseContextOp sessionId conn (ShowSortedDataFrame expr attrName) = do
155+evalRODatabaseContextOp sessionId conn (ShowDataFrame expr attrName mbOffset mbLimit) = do
156 res <- C.executeRelationalExpr sessionId conn expr
156 res <- C.executeRelationalExpr sessionId conn expr
157 case res of
157 case res of
158 Left err -> pure $ DisplayErrorResult $ T.pack (show err)
158 Left err -> pure $ DisplayErrorResult $ T.pack (show err)
@@ -161,7 +161,10 @@ evalRODatabaseContextOp sessionId conn (ShowSortedDataFrame expr attrName) = do
161 case attributeForName attrName attrs of
161 case attributeForName attrName attrs of
162 Left err -> pure $ DisplayErrorResult $ T.pack (show err)
162 Left err -> pure $ DisplayErrorResult $ T.pack (show err)
163 Right attr -> do
163 Right attr -> do
164− pure $ DisplayDataFrameResult $ sortDataFrameBy attr . toDataFrame $ rel
164+ let dFrame = sortDataFrameBy attr . toDataFrame $ rel
165+ let dFrame' = maybe dFrame (`drop'` dFrame) mbOffset
166+ let dFrame'' = maybe dFrame' (`take'` dFrame') mbLimit
167+ pure $ DisplayDataFrameResult $ dFrame''
167evalRODatabaseContextOp _ _ Quit = pure QuitResult
170evalRODatabaseContextOp _ _ Quit = pure QuitResult
@@ -171,10 +174,27 @@ interpretRODatabaseContextOp sessionId conn tutdstring = case parse roDatabaseCo
171 Left err -> pure $ DisplayErrorResult (T.pack (show err))
174 Left err -> pure $ DisplayErrorResult (T.pack (show err))
172 Right parsed -> evalRODatabaseContextOp sessionId conn parsed
175 Right parsed -> evalRODatabaseContextOp sessionId conn parsed
174−showSortedDataFrameP :: Parser RODatabaseContextOperator
177+showDataFrameP :: Parser RODatabaseContextOperator
175−showSortedDataFrameP = do
178+showDataFrameP = do
176− reservedOp ":showsorteddataframe"
179+ reservedOp ":showdataframe"
181+ attriName <- orderByP
182+ mbOffset <- optional offsetP
183+ mbLimit <- optional limitP
184+ pure $ ShowDataFrame relExpr attriName mbOffset mbLimit
186+orderByP :: Parser AttributeName
188+ reservedOp "orderby"
177− ShowSortedDataFrame <$> relExprP <*> identifier
189+ identifier
179−
191+offsetP :: Parser Integer
196+limitP :: Parser Integer