mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-24 07:52:14 +03:00
ee15c804bc
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/5080 GitOrigin-RevId: 58e5e6aab136617d1bbfc6621c89942da358b04d
69 lines
2.4 KiB
Haskell
69 lines
2.4 KiB
Haskell
-- | This module defines the top-level translation functions pertaining to
|
|
-- queries that use aggregation (i.e., /not/ so-called "simple" selects) into
|
|
-- Postgres AST.
|
|
module Hasura.Backends.Postgres.Translate.Select.Aggregate
|
|
( mkAggregateSelect,
|
|
selectAggregateQuerySQL,
|
|
)
|
|
where
|
|
|
|
import Control.Monad.Writer.Strict (runWriter)
|
|
import Database.PG.Query (Query, fromBuilder)
|
|
import Hasura.Backends.Postgres.SQL.DML (BoolExp (BELit), Select)
|
|
import Hasura.Backends.Postgres.SQL.RenameIdentifiers
|
|
( renameIdentifiers,
|
|
)
|
|
import Hasura.Backends.Postgres.SQL.Types
|
|
( IsIdentifier (toIdentifier),
|
|
)
|
|
import Hasura.Backends.Postgres.Translate.Select.AnnotatedFieldJSON
|
|
import Hasura.Backends.Postgres.Translate.Select.Internal.GenerateSelect (generateSQLSelectFromArrayNode)
|
|
import Hasura.Backends.Postgres.Translate.Select.Internal.Process (processAnnAggregateSelect)
|
|
import Hasura.Backends.Postgres.Translate.Types
|
|
( MultiRowSelectNode (MultiRowSelectNode),
|
|
SelectNode (SelectNode),
|
|
SourcePrefixes (SourcePrefixes),
|
|
)
|
|
import Hasura.Prelude
|
|
import Hasura.RQL.IR.Select
|
|
( AnnAggregateSelect,
|
|
AnnSelectG (_asnStrfyNum),
|
|
)
|
|
import Hasura.RQL.Types.Backend (Backend)
|
|
import Hasura.RQL.Types.Common (FieldName (FieldName))
|
|
import Hasura.SQL.Backend (BackendType (Postgres))
|
|
import Hasura.SQL.Types (ToSQL (toSQL))
|
|
|
|
-- | Translates IR to Postgres queries for aggregated SELECTs.
|
|
--
|
|
-- See 'mkAggregateSelect' for the Postgres AST.
|
|
selectAggregateQuerySQL ::
|
|
forall pgKind.
|
|
(Backend ('Postgres pgKind), PostgresAnnotatedFieldJSON pgKind) =>
|
|
AnnAggregateSelect ('Postgres pgKind) ->
|
|
Query
|
|
selectAggregateQuerySQL =
|
|
fromBuilder . toSQL . mkAggregateSelect
|
|
|
|
mkAggregateSelect ::
|
|
forall pgKind.
|
|
( Backend ('Postgres pgKind),
|
|
PostgresAnnotatedFieldJSON pgKind
|
|
) =>
|
|
AnnAggregateSelect ('Postgres pgKind) ->
|
|
Select
|
|
mkAggregateSelect annAggSel =
|
|
let ((selectSource, nodeExtractors, topExtractor), joinTree) =
|
|
runWriter $
|
|
flip runReaderT strfyNum $
|
|
processAnnAggregateSelect sourcePrefixes rootFieldName annAggSel
|
|
selectNode = SelectNode nodeExtractors joinTree
|
|
arrayNode = MultiRowSelectNode [topExtractor] selectNode
|
|
in renameIdentifiers $
|
|
generateSQLSelectFromArrayNode selectSource arrayNode $ BELit True
|
|
where
|
|
strfyNum = _asnStrfyNum annAggSel
|
|
rootFieldName = FieldName "root"
|
|
rootIdentifier = toIdentifier rootFieldName
|
|
sourcePrefixes = SourcePrefixes rootIdentifier rootIdentifier
|