mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-26 00:43:09 +03:00
6e8da71ece
(Work here originally done by awjchen, rebased and fixed up for merge by jberryman) This is part of a merge train towards GHC 9.2 compatibility. The main issue is the use of the new abstract `KeyMap` in 2.0. See: https://hackage.haskell.org/package/aeson-2.0.3.0/changelog Alex's original work is here: #4305 BEHAVIOR CHANGE NOTE: This change causes a different arbitrary ordering of serialized Json, for example during metadata export. CLI users care about this in particular, and so we need to call it out as a _behavior change_ as we did in v2.5.0. The good news though is that after this change ordering should be more stable (alphabetical key order). See: https://hasurahq.slack.com/archives/C01M20G1YRW/p1654012632634389 PR-URL: https://github.com/hasura/graphql-engine-mono/pull/4611 Co-authored-by: awjchen <13142944+awjchen@users.noreply.github.com> GitOrigin-RevId: 700265162c782739b2bb88300ee3cda3819b2e87
48 lines
1.5 KiB
Haskell
48 lines
1.5 KiB
Haskell
{-# LANGUAGE DeriveAnyClass #-}
|
|
|
|
module Hasura.Backends.DataConnector.IR.Export
|
|
( QueryError (..),
|
|
queryToAPI,
|
|
)
|
|
where
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
import Data.Aeson (ToJSON)
|
|
import Data.Aeson.KeyMap (fromHashMapText)
|
|
import Data.HashMap.Strict qualified as M
|
|
import Hasura.Backends.DataConnector.API qualified as API
|
|
import Hasura.Backends.DataConnector.IR.Query qualified as IR.Q
|
|
import Hasura.Prelude
|
|
import Witch qualified
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
data QueryError = ExposedLiteral Text
|
|
deriving stock (Generic)
|
|
deriving anyclass (ToJSON)
|
|
|
|
queryToAPI :: IR.Q.Query -> Either QueryError API.Query
|
|
queryToAPI IR.Q.Query {..} = do
|
|
fields' <- traverse fromField fields
|
|
pure $
|
|
API.Query
|
|
{ fields = fromHashMapText fields',
|
|
from = Witch.from from,
|
|
limit = limit,
|
|
offset = offset,
|
|
where_ = fmap Witch.from where_,
|
|
orderBy = nonEmpty $ fmap Witch.from orderBy
|
|
}
|
|
|
|
fromField :: IR.Q.Field -> Either QueryError API.Field
|
|
fromField = \case
|
|
IR.Q.Column contents -> Right $ Witch.from contents
|
|
IR.Q.Relationship contents -> rcToAPI contents
|
|
IR.Q.Literal lit -> Left $ ExposedLiteral lit
|
|
|
|
rcToAPI :: IR.Q.RelationshipContents -> Either QueryError API.Field
|
|
rcToAPI (IR.Q.RelationshipContents joinCondition relType query) =
|
|
let joinCondition' = M.mapKeys Witch.from $ fmap Witch.from joinCondition
|
|
in fmap (API.RelationshipField . API.RelField joinCondition' (Witch.from relType)) $ queryToAPI query
|