2020-10-29 19:58:13 +03:00
|
|
|
module Hasura.RQL.IR.Update where
|
|
|
|
|
|
|
|
|
|
|
|
import Hasura.Prelude
|
|
|
|
|
2020-11-02 14:50:40 +03:00
|
|
|
import Hasura.RQL.IR.BoolExp
|
2020-10-29 19:58:13 +03:00
|
|
|
import Hasura.RQL.IR.Returning
|
2021-02-14 09:07:52 +03:00
|
|
|
import Hasura.RQL.Types.Backend
|
2020-10-29 19:58:13 +03:00
|
|
|
import Hasura.RQL.Types.Column
|
|
|
|
import Hasura.SQL.Backend
|
|
|
|
|
|
|
|
|
2020-11-12 12:25:48 +03:00
|
|
|
data AnnUpdG (b :: BackendType) v
|
2020-10-29 19:58:13 +03:00
|
|
|
= AnnUpd
|
2020-11-12 12:25:48 +03:00
|
|
|
{ uqp1Table :: !(TableName b)
|
2020-10-29 19:58:13 +03:00
|
|
|
, 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]
|
|
|
|
}
|
|
|
|
|
2020-11-25 17:18:58 +03:00
|
|
|
type AnnUpd b = AnnUpdG b (SQLExpression b)
|
2020-10-29 19:58:13 +03:00
|
|
|
|
|
|
|
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
|
2021-03-25 20:50:08 +03:00
|
|
|
:: (Applicative f, Backend backend)
|
2020-10-29 19:58:13 +03:00
|
|
|
=> (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
|