2021-07-15 15:44:26 +03:00
|
|
|
{-# OPTIONS_GHC -fno-warn-orphans #-}
|
|
|
|
|
|
|
|
module Hasura.Backends.MySQL.Instances.Execute where
|
|
|
|
|
2021-10-18 19:04:30 +03:00
|
|
|
import Data.Aeson as J
|
|
|
|
import Data.HashMap.Strict.InsOrd qualified as OMap
|
|
|
|
import Data.Text qualified as T
|
|
|
|
import Data.Tree
|
|
|
|
import Hasura.Backends.MySQL.DataLoader.Execute (OutputValue (..), RecordSet (..))
|
|
|
|
import Hasura.Backends.MySQL.DataLoader.Execute qualified as DataLoader
|
|
|
|
import Hasura.Backends.MySQL.DataLoader.Plan qualified as DataLoader
|
|
|
|
import Hasura.Backends.MySQL.Plan
|
|
|
|
import Hasura.Base.Error
|
|
|
|
import Hasura.EncJSON
|
2021-09-24 01:56:37 +03:00
|
|
|
import Hasura.GraphQL.Execute.Backend
|
2021-10-18 19:04:30 +03:00
|
|
|
import Hasura.GraphQL.Parser
|
2021-09-24 01:56:37 +03:00
|
|
|
import Hasura.Prelude
|
2021-10-18 19:04:30 +03:00
|
|
|
import Hasura.RQL.IR
|
|
|
|
import Hasura.RQL.Types
|
|
|
|
import Hasura.Session
|
2021-07-15 15:44:26 +03:00
|
|
|
|
|
|
|
instance BackendExecute 'MySQL where
|
2021-09-24 01:56:37 +03:00
|
|
|
type PreparedQuery 'MySQL = Text
|
2021-07-15 15:44:26 +03:00
|
|
|
type MultiplexedQuery 'MySQL = Void
|
2021-09-24 01:56:37 +03:00
|
|
|
type ExecutionMonad 'MySQL = ExceptT QErr IO
|
|
|
|
mkDBQueryPlan = mysqlDBQueryPlan
|
|
|
|
mkDBMutationPlan = error "mkDBMutationPlan: MySQL backend does not support this operation yet."
|
2021-08-04 14:42:24 +03:00
|
|
|
mkDBSubscriptionPlan _ _ _ _ = error "mkDBSubscriptionPlan: MySQL backend does not support this operation yet."
|
2021-09-24 01:56:37 +03:00
|
|
|
mkDBQueryExplain = error "mkDBQueryExplain: MySQL backend does not support this operation yet."
|
|
|
|
mkLiveQueryExplain _ = error "mkLiveQueryExplain: MySQL backend does not support this operation yet."
|
2021-10-18 19:04:30 +03:00
|
|
|
mkDBRemoteRelationshipPlan = error "mkDBRemoteRelationshipPlan: MySQL does not support this operation yet."
|
2021-09-22 13:43:05 +03:00
|
|
|
|
2021-09-24 01:56:37 +03:00
|
|
|
mysqlDBQueryPlan ::
|
|
|
|
forall m.
|
|
|
|
( MonadError QErr m
|
|
|
|
) =>
|
|
|
|
UserInfo ->
|
2021-10-18 19:04:30 +03:00
|
|
|
SourceName ->
|
|
|
|
SourceConfig 'MySQL ->
|
2021-09-24 01:56:37 +03:00
|
|
|
QueryDB 'MySQL (Const Void) (UnpreparedValue 'MySQL) ->
|
|
|
|
m (DBStepInfo 'MySQL)
|
2021-09-23 15:37:56 +03:00
|
|
|
mysqlDBQueryPlan userInfo sourceName sourceConfig qrf = do
|
2021-10-18 19:04:30 +03:00
|
|
|
(headAndTail, actionsForest) <- queryToActionForest userInfo qrf
|
|
|
|
pure
|
|
|
|
( DBStepInfo
|
|
|
|
@'MySQL
|
|
|
|
sourceName
|
|
|
|
sourceConfig
|
|
|
|
(Just (T.pack (drawForest (fmap (fmap show) actionsForest))))
|
|
|
|
( do
|
|
|
|
result <-
|
|
|
|
DataLoader.runExecute
|
|
|
|
sourceConfig
|
|
|
|
headAndTail
|
|
|
|
(DataLoader.execute actionsForest)
|
|
|
|
either
|
|
|
|
(throw500WithDetail "MySQL DataLoader Error" . toJSON . show)
|
|
|
|
(pure . encJFromRecordSet)
|
|
|
|
result
|
|
|
|
)
|
|
|
|
)
|
2021-09-22 13:43:05 +03:00
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
2021-10-18 19:04:30 +03:00
|
|
|
-- Encoding for Hasura's GraphQL JSON representation
|
2021-09-22 13:43:05 +03:00
|
|
|
|
2021-10-18 19:04:30 +03:00
|
|
|
encJFromRecordSet :: RecordSet -> EncJSON
|
|
|
|
encJFromRecordSet RecordSet {rows} =
|
|
|
|
encJFromList
|
|
|
|
( map
|
|
|
|
( encJFromAssocList
|
|
|
|
. map (first coerce . second encJFromOutputValue)
|
|
|
|
. OMap.toList
|
|
|
|
)
|
|
|
|
(toList rows)
|
|
|
|
)
|
|
|
|
|
|
|
|
encJFromOutputValue :: DataLoader.OutputValue -> EncJSON
|
|
|
|
encJFromOutputValue =
|
|
|
|
\case
|
|
|
|
ArrayOutputValue array -> encJFromList (map encJFromOutputValue (toList array))
|
|
|
|
RecordOutputValue m ->
|
|
|
|
encJFromAssocList
|
|
|
|
. map (first coerce . second encJFromOutputValue)
|
|
|
|
. OMap.toList
|
|
|
|
$ m
|
|
|
|
ScalarOutputValue value -> encJFromJValue value
|
|
|
|
NullOutputValue {} -> encJFromJValue J.Null
|