graphql-engine/server/src-lib/Hasura/RQL/IR/Update.hs
Antoine Leblanc d8c56a40f6 server: split boolean operators between core and backend-specific
GitOrigin-RevId: f1291946a1122220e82371676d88867fd7b2b7c4
2021-03-25 17:51:08 +00:00

66 lines
2.1 KiB
Haskell

module Hasura.RQL.IR.Update where
import Hasura.Prelude
import Hasura.RQL.IR.BoolExp
import Hasura.RQL.IR.Returning
import Hasura.RQL.Types.Backend
import Hasura.RQL.Types.Column
import Hasura.SQL.Backend
data AnnUpdG (b :: BackendType) v
= AnnUpd
{ uqp1Table :: !(TableName b)
, uqp1OpExps :: ![(Column b, UpdOpExpG v)]
, uqp1Where :: !(AnnBoolExp b v, AnnBoolExp b v)
, uqp1Check :: !(AnnBoolExp b v)
-- we don't prepare the arguments for returning
-- however the session variable can still be
-- converted as desired
, uqp1Output :: !(MutationOutputG b v)
, uqp1AllCols :: ![ColumnInfo b]
}
type AnnUpd b = AnnUpdG b (SQLExpression b)
data UpdOpExpG v = UpdSet !v
| UpdInc !v
| UpdAppend !v
| UpdPrepend !v
| UpdDeleteKey !v
| UpdDeleteElem !v
| UpdDeleteAtPath ![v]
deriving (Functor, Foldable, Traversable, Generic, Data)
-- NOTE: This function can be improved, because we use
-- the literal values defined below in the 'updateOperators'
-- function in 'Hasura.GraphQL.Schema.Mutation'. It would
-- be nice if we could avoid duplicating the string literal
-- values
updateOperatorText :: UpdOpExpG a -> Text
updateOperatorText (UpdSet _) = "_set"
updateOperatorText (UpdInc _) = "_inc"
updateOperatorText (UpdAppend _) = "_append"
updateOperatorText (UpdPrepend _) = "_prepend"
updateOperatorText (UpdDeleteKey _) = "_delete_key"
updateOperatorText (UpdDeleteElem _) = "_delete_elem"
updateOperatorText (UpdDeleteAtPath _) = "_delete_at_path"
traverseAnnUpd
:: (Applicative f, Backend backend)
=> (a -> f b)
-> AnnUpdG backend a
-> f (AnnUpdG backend b)
traverseAnnUpd f annUpd =
AnnUpd tn
<$> traverse (traverse $ traverse f) opExps
<*> ((,) <$> traverseAnnBoolExp f whr <*> traverseAnnBoolExp f fltr)
<*> traverseAnnBoolExp f chk
<*> traverseMutationOutput f mutOutput
<*> pure allCols
where
AnnUpd tn opExps (whr, fltr) chk mutOutput allCols = annUpd