{-# LANGUAGE
DataKinds
, FlexibleInstances
, FunctionalDependencies
, GADTs
, LambdaCase
, MultiParamTypeClasses
, OverloadedStrings
, StandaloneDeriving
#-}
module Squeal.PostgreSQL.Expression.Sort
(
SortExpression (..)
, OrderBy (..)
) where
import Squeal.PostgreSQL.Expression
import Squeal.PostgreSQL.Render
import Squeal.PostgreSQL.Type.Schema
data SortExpression grp lat with db params from where
Asc
:: Expression grp lat with db params from ('NotNull ty)
-> SortExpression grp lat with db params from
Desc
:: Expression grp lat with db params from ('NotNull ty)
-> SortExpression grp lat with db params from
AscNullsFirst
:: Expression grp lat with db params from ('Null ty)
-> SortExpression grp lat with db params from
AscNullsLast
:: Expression grp lat with db params from ('Null ty)
-> SortExpression grp lat with db params from
DescNullsFirst
:: Expression grp lat with db params from ('Null ty)
-> SortExpression grp lat with db params from
DescNullsLast
:: Expression grp lat with db params from ('Null ty)
-> SortExpression grp lat with db params from
deriving instance Show (SortExpression grp lat with db params from)
instance RenderSQL (SortExpression grp lat with db params from) where
renderSQL = \case
Asc expression -> renderSQL expression <+> "ASC"
Desc expression -> renderSQL expression <+> "DESC"
AscNullsFirst expression -> renderSQL expression
<+> "ASC NULLS FIRST"
DescNullsFirst expression -> renderSQL expression
<+> "DESC NULLS FIRST"
AscNullsLast expression -> renderSQL expression <+> "ASC NULLS LAST"
DescNullsLast expression -> renderSQL expression <+> "DESC NULLS LAST"
instance RenderSQL [SortExpression grp lat with db params from] where
renderSQL = \case
[] -> ""
srts -> " ORDER BY"
<+> commaSeparated (renderSQL <$> srts)
class OrderBy expr grp | expr -> grp where
orderBy
:: [SortExpression grp lat with db params from]
-> expr lat with db params from
-> expr lat with db params from