{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
module Orville.PostgreSQL.Execution.Select
( Select
, executeSelect
, useSelect
, selectToQueryExpr
, selectTable
, selectMarshalledColumns
, rawSelectQueryExpr
)
where
import qualified Orville.PostgreSQL.Execution.Execute as Execute
import qualified Orville.PostgreSQL.Execution.QueryType as QueryType
import qualified Orville.PostgreSQL.Execution.SelectOptions as SelectOptions
import qualified Orville.PostgreSQL.Expr as Expr
import Orville.PostgreSQL.Marshall.SqlMarshaller (AnnotatedSqlMarshaller, marshallerDerivedColumns, unannotatedSqlMarshaller)
import qualified Orville.PostgreSQL.Monad as Monad
import Orville.PostgreSQL.Schema (TableDefinition, tableMarshaller, tableName)
data Select readEntity where
Select :: AnnotatedSqlMarshaller writeEntity readEntity -> Expr.QueryExpr -> Select readEntity
selectToQueryExpr :: Select readEntity -> Expr.QueryExpr
selectToQueryExpr :: forall readEntity. Select readEntity -> QueryExpr
selectToQueryExpr (Select AnnotatedSqlMarshaller writeEntity readEntity
_ QueryExpr
query) = QueryExpr
query
executeSelect :: Monad.MonadOrville m => Select row -> m [row]
executeSelect :: forall (m :: * -> *) row. MonadOrville m => Select row -> m [row]
executeSelect =
(forall writeEntity.
QueryExpr -> AnnotatedSqlMarshaller writeEntity row -> m [row])
-> Select row -> m [row]
forall readEntity a.
(forall writeEntity.
QueryExpr -> AnnotatedSqlMarshaller writeEntity readEntity -> a)
-> Select readEntity -> a
useSelect (QueryType
-> QueryExpr -> AnnotatedSqlMarshaller writeEntity row -> m [row]
forall (m :: * -> *) sql writeEntity readEntity.
(MonadOrville m, SqlExpression sql) =>
QueryType
-> sql
-> AnnotatedSqlMarshaller writeEntity readEntity
-> m [readEntity]
Execute.executeAndDecode QueryType
QueryType.SelectQuery)
useSelect ::
( forall writeEntity.
Expr.QueryExpr ->
AnnotatedSqlMarshaller writeEntity readEntity ->
a
) ->
Select readEntity ->
a
useSelect :: forall readEntity a.
(forall writeEntity.
QueryExpr -> AnnotatedSqlMarshaller writeEntity readEntity -> a)
-> Select readEntity -> a
useSelect forall writeEntity.
QueryExpr -> AnnotatedSqlMarshaller writeEntity readEntity -> a
f (Select AnnotatedSqlMarshaller writeEntity readEntity
marshaller QueryExpr
query) =
QueryExpr -> AnnotatedSqlMarshaller writeEntity readEntity -> a
forall writeEntity.
QueryExpr -> AnnotatedSqlMarshaller writeEntity readEntity -> a
f QueryExpr
query AnnotatedSqlMarshaller writeEntity readEntity
marshaller
selectTable ::
TableDefinition key writeEntity readEntity ->
SelectOptions.SelectOptions ->
Select readEntity
selectTable :: forall key writeEntity readEntity.
TableDefinition key writeEntity readEntity
-> SelectOptions -> Select readEntity
selectTable TableDefinition key writeEntity readEntity
tableDef =
AnnotatedSqlMarshaller writeEntity readEntity
-> Qualified TableName -> SelectOptions -> Select readEntity
forall writeEntity readEntity.
AnnotatedSqlMarshaller writeEntity readEntity
-> Qualified TableName -> SelectOptions -> Select readEntity
selectMarshalledColumns (TableDefinition key writeEntity readEntity
-> AnnotatedSqlMarshaller writeEntity readEntity
forall key writeEntity readEntity.
TableDefinition key writeEntity readEntity
-> AnnotatedSqlMarshaller writeEntity readEntity
tableMarshaller TableDefinition key writeEntity readEntity
tableDef) (TableDefinition key writeEntity readEntity -> Qualified TableName
forall key writeEntity readEntity.
TableDefinition key writeEntity readEntity -> Qualified TableName
tableName TableDefinition key writeEntity readEntity
tableDef)
selectMarshalledColumns ::
AnnotatedSqlMarshaller writeEntity readEntity ->
Expr.Qualified Expr.TableName ->
SelectOptions.SelectOptions ->
Select readEntity
selectMarshalledColumns :: forall writeEntity readEntity.
AnnotatedSqlMarshaller writeEntity readEntity
-> Qualified TableName -> SelectOptions -> Select readEntity
selectMarshalledColumns AnnotatedSqlMarshaller writeEntity readEntity
marshaller Qualified TableName
qualifiedTableName SelectOptions
selectOptions =
AnnotatedSqlMarshaller writeEntity readEntity
-> QueryExpr -> Select readEntity
forall writeEntity readEntity.
AnnotatedSqlMarshaller writeEntity readEntity
-> QueryExpr -> Select readEntity
rawSelectQueryExpr AnnotatedSqlMarshaller writeEntity readEntity
marshaller (QueryExpr -> Select readEntity) -> QueryExpr -> Select readEntity
forall a b. (a -> b) -> a -> b
$
SelectList -> TableReferenceList -> SelectOptions -> QueryExpr
SelectOptions.selectOptionsQueryExpr
([DerivedColumn] -> SelectList
Expr.selectDerivedColumns (SqlMarshaller writeEntity readEntity -> [DerivedColumn]
forall writeEntity readEntity.
SqlMarshaller writeEntity readEntity -> [DerivedColumn]
marshallerDerivedColumns (SqlMarshaller writeEntity readEntity -> [DerivedColumn])
-> (AnnotatedSqlMarshaller writeEntity readEntity
-> SqlMarshaller writeEntity readEntity)
-> AnnotatedSqlMarshaller writeEntity readEntity
-> [DerivedColumn]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AnnotatedSqlMarshaller writeEntity readEntity
-> SqlMarshaller writeEntity readEntity
forall writeEntity readEntity.
AnnotatedSqlMarshaller writeEntity readEntity
-> SqlMarshaller writeEntity readEntity
unannotatedSqlMarshaller (AnnotatedSqlMarshaller writeEntity readEntity -> [DerivedColumn])
-> AnnotatedSqlMarshaller writeEntity readEntity -> [DerivedColumn]
forall a b. (a -> b) -> a -> b
$ AnnotatedSqlMarshaller writeEntity readEntity
marshaller))
(Qualified TableName -> TableReferenceList
Expr.referencesTable Qualified TableName
qualifiedTableName)
SelectOptions
selectOptions
rawSelectQueryExpr ::
AnnotatedSqlMarshaller writeEntity readEntity ->
Expr.QueryExpr ->
Select readEntity
rawSelectQueryExpr :: forall writeEntity readEntity.
AnnotatedSqlMarshaller writeEntity readEntity
-> QueryExpr -> Select readEntity
rawSelectQueryExpr = AnnotatedSqlMarshaller writeEntity readEntity
-> QueryExpr -> Select readEntity
forall writeEntity readEntity.
AnnotatedSqlMarshaller writeEntity readEntity
-> QueryExpr -> Select readEntity
Select