{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Orville.PostgreSQL.Expr.GroupBy
( GroupByClause
, groupByClause
, GroupByExpr
, appendGroupByExpr
, groupByColumnsExpr
)
where
import Data.List.NonEmpty (NonEmpty)
import Orville.PostgreSQL.Expr.Name (ColumnName)
import qualified Orville.PostgreSQL.Raw.RawSql as RawSql
newtype GroupByClause
= GroupByClause RawSql.RawSql
deriving
(
RawSql -> GroupByClause
GroupByClause -> RawSql
(GroupByClause -> RawSql)
-> (RawSql -> GroupByClause) -> SqlExpression GroupByClause
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: GroupByClause -> RawSql
toRawSql :: GroupByClause -> RawSql
$cunsafeFromRawSql :: RawSql -> GroupByClause
unsafeFromRawSql :: RawSql -> GroupByClause
RawSql.SqlExpression
)
groupByClause :: GroupByExpr -> GroupByClause
groupByClause :: GroupByExpr -> GroupByClause
groupByClause GroupByExpr
expr = RawSql -> GroupByClause
GroupByClause (String -> RawSql
RawSql.fromString String
"GROUP BY " RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> GroupByExpr -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql GroupByExpr
expr)
newtype GroupByExpr
= GroupByExpr RawSql.RawSql
deriving
(
RawSql -> GroupByExpr
GroupByExpr -> RawSql
(GroupByExpr -> RawSql)
-> (RawSql -> GroupByExpr) -> SqlExpression GroupByExpr
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: GroupByExpr -> RawSql
toRawSql :: GroupByExpr -> RawSql
$cunsafeFromRawSql :: RawSql -> GroupByExpr
unsafeFromRawSql :: RawSql -> GroupByExpr
RawSql.SqlExpression
)
instance Semigroup GroupByExpr where
<> :: GroupByExpr -> GroupByExpr -> GroupByExpr
(<>) = GroupByExpr -> GroupByExpr -> GroupByExpr
appendGroupByExpr
appendGroupByExpr :: GroupByExpr -> GroupByExpr -> GroupByExpr
appendGroupByExpr :: GroupByExpr -> GroupByExpr -> GroupByExpr
appendGroupByExpr (GroupByExpr RawSql
a) (GroupByExpr RawSql
b) =
RawSql -> GroupByExpr
GroupByExpr (RawSql
a RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.commaSpace RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
b)
groupByColumnsExpr :: NonEmpty ColumnName -> GroupByExpr
groupByColumnsExpr :: NonEmpty ColumnName -> GroupByExpr
groupByColumnsExpr =
RawSql -> GroupByExpr
GroupByExpr (RawSql -> GroupByExpr)
-> (NonEmpty ColumnName -> RawSql)
-> NonEmpty ColumnName
-> GroupByExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RawSql -> NonEmpty ColumnName -> RawSql
forall sql (f :: * -> *).
(SqlExpression sql, Foldable f) =>
RawSql -> f sql -> RawSql
RawSql.intercalate RawSql
RawSql.commaSpace