2022-04-22 16:38:35 +03:00
|
|
|
-- | This module defines the top-level translation functions pertaining to
|
|
|
|
-- translating Connection (i.e. Relay) queries into Postgres AST.
|
|
|
|
module Hasura.Backends.Postgres.Translate.Select.Connection
|
|
|
|
( connectionSelectQuerySQL,
|
|
|
|
mkConnectionSelect,
|
|
|
|
)
|
|
|
|
where
|
|
|
|
|
|
|
|
import Control.Monad.Writer (runWriter)
|
2023-01-27 17:36:35 +03:00
|
|
|
import Database.PG.Query (Query)
|
2022-04-22 16:38:35 +03:00
|
|
|
import Hasura.Backends.Postgres.SQL.DML qualified as S
|
|
|
|
import Hasura.Backends.Postgres.SQL.Types
|
|
|
|
import Hasura.Backends.Postgres.Translate.Select.AnnotatedFieldJSON
|
2022-04-22 20:18:20 +03:00
|
|
|
import Hasura.Backends.Postgres.Translate.Select.Internal.GenerateSelect (connectionToSelectWith)
|
2023-01-27 17:36:35 +03:00
|
|
|
import Hasura.Backends.Postgres.Translate.Select.Internal.Helpers (customSQLToTopLevelCTEs, toQuery)
|
2022-04-22 20:18:20 +03:00
|
|
|
import Hasura.Backends.Postgres.Translate.Select.Internal.Process (processConnectionSelect)
|
2022-04-22 16:38:35 +03:00
|
|
|
import Hasura.Backends.Postgres.Translate.Types
|
|
|
|
import Hasura.Prelude
|
|
|
|
import Hasura.RQL.IR.Select
|
|
|
|
( AnnSelectG (_asnStrfyNum),
|
|
|
|
ConnectionSelect (_csSelect),
|
|
|
|
)
|
|
|
|
import Hasura.RQL.Types.Backend (Backend)
|
2023-04-24 21:35:48 +03:00
|
|
|
import Hasura.RQL.Types.BackendType (BackendType (Postgres))
|
2022-04-22 16:38:35 +03:00
|
|
|
import Hasura.RQL.Types.Common (FieldName (FieldName))
|
|
|
|
|
|
|
|
-- | Translates IR to Postgres queries for "connection" queries (used for Relay).
|
|
|
|
--
|
|
|
|
-- See 'mkConnectionSelect' for the Postgres AST.
|
|
|
|
connectionSelectQuerySQL ::
|
|
|
|
forall pgKind.
|
|
|
|
( Backend ('Postgres pgKind),
|
|
|
|
PostgresAnnotatedFieldJSON pgKind
|
|
|
|
) =>
|
|
|
|
ConnectionSelect ('Postgres pgKind) Void S.SQLExp ->
|
|
|
|
Query
|
|
|
|
connectionSelectQuerySQL =
|
2023-01-27 17:36:35 +03:00
|
|
|
toQuery
|
|
|
|
. ( \(selectWith, customCTEs) ->
|
|
|
|
selectWith
|
|
|
|
{ S.swCTEs =
|
|
|
|
map (fmap S.CTESelect) (S.swCTEs selectWith)
|
|
|
|
<> customSQLToTopLevelCTEs customCTEs
|
|
|
|
}
|
|
|
|
)
|
|
|
|
. runWriter
|
|
|
|
. mkConnectionSelect
|
2022-04-22 16:38:35 +03:00
|
|
|
|
|
|
|
mkConnectionSelect ::
|
2023-01-27 17:36:35 +03:00
|
|
|
forall pgKind m.
|
2022-04-22 16:38:35 +03:00
|
|
|
( Backend ('Postgres pgKind),
|
2023-01-27 17:36:35 +03:00
|
|
|
PostgresAnnotatedFieldJSON pgKind,
|
|
|
|
MonadWriter CustomSQLCTEs m
|
2022-04-22 16:38:35 +03:00
|
|
|
) =>
|
|
|
|
ConnectionSelect ('Postgres pgKind) Void S.SQLExp ->
|
2023-01-27 17:36:35 +03:00
|
|
|
m (S.SelectWithG S.Select)
|
|
|
|
mkConnectionSelect connectionSelect = do
|
|
|
|
let ( (connectionSource, topExtractor, nodeExtractors),
|
|
|
|
SelectWriter {_swJoinTree = joinTree, _swCustomSQLCTEs = customSQLCTEs}
|
|
|
|
) =
|
2023-05-24 16:51:56 +03:00
|
|
|
runWriter
|
|
|
|
$ flip runReaderT strfyNum
|
|
|
|
$ processConnectionSelect
|
|
|
|
sourcePrefixes
|
|
|
|
rootFieldName
|
|
|
|
(S.toTableAlias rootIdentifier)
|
|
|
|
mempty
|
|
|
|
connectionSelect
|
2022-04-22 16:38:35 +03:00
|
|
|
selectNode =
|
2023-05-24 16:51:56 +03:00
|
|
|
MultiRowSelectNode [topExtractor]
|
|
|
|
$ SelectNode nodeExtractors joinTree
|
2023-01-27 17:36:35 +03:00
|
|
|
selectWith =
|
2022-07-18 12:44:17 +03:00
|
|
|
connectionToSelectWith (S.toTableAlias rootIdentifier) connectionSource selectNode
|
2023-01-27 17:36:35 +03:00
|
|
|
tell customSQLCTEs
|
|
|
|
|
|
|
|
pure selectWith
|
2022-04-22 16:38:35 +03:00
|
|
|
where
|
|
|
|
strfyNum = _asnStrfyNum $ _csSelect connectionSelect
|
|
|
|
rootFieldName = FieldName "root"
|
|
|
|
rootIdentifier = toIdentifier rootFieldName
|
|
|
|
sourcePrefixes = SourcePrefixes rootIdentifier rootIdentifier
|