{-# LANGUAGE FlexibleContexts #-}
module Opaleye.Order (
orderBy
, O.Order
, asc
, desc
, ascNullsFirst
, ascNullsLast
, descNullsLast
, descNullsFirst
, limit
, offset
, distinctOn
, distinctOnBy
, O.exact
, SqlOrd
, distinctOnExplicit
, distinctOnByExplicit
, distinctOnCorrect
, distinctOnByCorrect
) where
import qualified Data.Profunctor.Product.Default as D
import qualified Opaleye.Field as F
import qualified Opaleye.Internal.HaskellDB.PrimQuery as HPQ
import qualified Opaleye.Internal.Order as O
import qualified Opaleye.Internal.QueryArr as Q
import qualified Opaleye.Internal.Unpackspec as U
import qualified Opaleye.Select as S
import qualified Opaleye.SqlTypes as T
orderBy :: O.Order a -> S.Select a -> S.Select a
orderBy :: forall a. Order a -> Select a -> Select a
orderBy Order a
os Select a
q =
forall a. State Tag (a, PrimQuery) -> Query a
Q.productQueryArr forall a b. (a -> b) -> a -> b
$ do
(a, PrimQuery)
a_pq <- forall a. Select a -> State Tag (a, PrimQuery)
Q.runSimpleSelect Select a
q
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a. Order a -> (a, PrimQuery) -> (a, PrimQuery)
O.orderByU Order a
os (a, PrimQuery)
a_pq)
asc :: SqlOrd b => (a -> F.Field b) -> O.Order a
asc :: forall b a. SqlOrd b => (a -> Field b) -> Order a
asc = forall a (n :: Nullability) b.
OrderOp -> (a -> Field_ n b) -> Order a
O.order HPQ.OrderOp { orderDirection :: OrderDirection
HPQ.orderDirection = OrderDirection
HPQ.OpAsc
, orderNulls :: OrderNulls
HPQ.orderNulls = OrderNulls
HPQ.NullsLast }
desc :: SqlOrd b => (a -> F.Field b) -> O.Order a
desc :: forall b a. SqlOrd b => (a -> Field b) -> Order a
desc = forall a (n :: Nullability) b.
OrderOp -> (a -> Field_ n b) -> Order a
O.order HPQ.OrderOp { orderDirection :: OrderDirection
HPQ.orderDirection = OrderDirection
HPQ.OpDesc
, orderNulls :: OrderNulls
HPQ.orderNulls = OrderNulls
HPQ.NullsFirst }
ascNullsFirst :: SqlOrd b => (a -> F.Field_ n b) -> O.Order a
ascNullsFirst :: forall b a (n :: Nullability).
SqlOrd b =>
(a -> Field_ n b) -> Order a
ascNullsFirst = forall a (n :: Nullability) b.
OrderOp -> (a -> Field_ n b) -> Order a
O.order HPQ.OrderOp { orderDirection :: OrderDirection
HPQ.orderDirection = OrderDirection
HPQ.OpAsc
, orderNulls :: OrderNulls
HPQ.orderNulls = OrderNulls
HPQ.NullsFirst }
ascNullsLast :: SqlOrd b => (a -> F.Field_ n b) -> O.Order a
ascNullsLast :: forall b a (n :: Nullability).
SqlOrd b =>
(a -> Field_ n b) -> Order a
ascNullsLast = forall a (n :: Nullability) b.
OrderOp -> (a -> Field_ n b) -> Order a
O.order HPQ.OrderOp { orderDirection :: OrderDirection
HPQ.orderDirection = OrderDirection
HPQ.OpAsc
, orderNulls :: OrderNulls
HPQ.orderNulls = OrderNulls
HPQ.NullsLast }
descNullsFirst :: SqlOrd b => (a -> F.Field_ n b) -> O.Order a
descNullsFirst :: forall b a (n :: Nullability).
SqlOrd b =>
(a -> Field_ n b) -> Order a
descNullsFirst = forall a (n :: Nullability) b.
OrderOp -> (a -> Field_ n b) -> Order a
O.order HPQ.OrderOp { orderDirection :: OrderDirection
HPQ.orderDirection = OrderDirection
HPQ.OpDesc
, orderNulls :: OrderNulls
HPQ.orderNulls = OrderNulls
HPQ.NullsFirst }
descNullsLast :: SqlOrd b => (a -> F.Field_ n b) -> O.Order a
descNullsLast :: forall b a (n :: Nullability).
SqlOrd b =>
(a -> Field_ n b) -> Order a
descNullsLast = forall a (n :: Nullability) b.
OrderOp -> (a -> Field_ n b) -> Order a
O.order HPQ.OrderOp { orderDirection :: OrderDirection
HPQ.orderDirection = OrderDirection
HPQ.OpDesc
, orderNulls :: OrderNulls
HPQ.orderNulls = OrderNulls
HPQ.NullsLast }
limit :: Int -> S.Select a -> S.Select a
limit :: forall a. Int -> Select a -> Select a
limit Int
n Select a
a = forall a. State Tag (a, PrimQuery) -> Query a
Q.productQueryArr forall a b. (a -> b) -> a -> b
$ do
(a, PrimQuery)
a_pq <- forall a. Select a -> State Tag (a, PrimQuery)
Q.runSimpleSelect Select a
a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a. Int -> (a, PrimQuery) -> (a, PrimQuery)
O.limit' Int
n (a, PrimQuery)
a_pq)
offset :: Int -> S.Select a -> S.Select a
offset :: forall a. Int -> Select a -> Select a
offset Int
n Select a
a = forall a. State Tag (a, PrimQuery) -> Query a
Q.productQueryArr forall a b. (a -> b) -> a -> b
$ do
(a, PrimQuery)
a_pq <- forall a. Select a -> State Tag (a, PrimQuery)
Q.runSimpleSelect Select a
a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a. Int -> (a, PrimQuery) -> (a, PrimQuery)
O.offset' Int
n (a, PrimQuery)
a_pq)
{-# DEPRECATED distinctOnCorrect "Use 'distinctOn' instead. Will be removed in 0.11." #-}
distinctOnCorrect :: D.Default U.Unpackspec b b
=> (a -> b)
-> S.Select a
-> S.Select a
distinctOnCorrect :: forall b a.
Default Unpackspec b b =>
(a -> b) -> Select a -> Select a
distinctOnCorrect = forall b a. Unpackspec b b -> (a -> b) -> Select a -> Select a
distinctOnExplicit forall (p :: * -> * -> *) a b. Default p a b => p a b
D.def
{-# DEPRECATED distinctOnByCorrect "Use 'distinctOnBy' instead. Will be removed in 0.11." #-}
distinctOnByCorrect :: D.Default U.Unpackspec b b
=> (a -> b)
-> O.Order a
-> S.Select a
-> S.Select a
distinctOnByCorrect :: forall b a.
Default Unpackspec b b =>
(a -> b) -> Order a -> Select a -> Select a
distinctOnByCorrect = forall b a.
Unpackspec b b -> (a -> b) -> Order a -> Select a -> Select a
distinctOnByExplicit forall (p :: * -> * -> *) a b. Default p a b => p a b
D.def
class SqlOrd a where
instance SqlOrd T.SqlBool
instance SqlOrd T.SqlDate
instance SqlOrd T.SqlFloat8
instance SqlOrd T.SqlFloat4
instance SqlOrd T.SqlInt8
instance SqlOrd T.SqlInt4
instance SqlOrd T.SqlInt2
instance SqlOrd T.SqlNumeric
instance SqlOrd T.SqlText
instance SqlOrd T.SqlVarcharN
instance SqlOrd T.SqlTime
instance SqlOrd T.SqlTimestamptz
instance SqlOrd T.SqlTimestamp
instance SqlOrd T.SqlCitext
instance SqlOrd T.SqlUuid
distinctOn :: D.Default U.Unpackspec b b => (a -> b) -> S.Select a -> S.Select a
distinctOn :: forall b a.
Default Unpackspec b b =>
(a -> b) -> Select a -> Select a
distinctOn = forall b a.
Default Unpackspec b b =>
(a -> b) -> Select a -> Select a
distinctOnCorrect
distinctOnBy :: D.Default U.Unpackspec b b => (a -> b) -> O.Order a
-> S.Select a -> S.Select a
distinctOnBy :: forall b a.
Default Unpackspec b b =>
(a -> b) -> Order a -> Select a -> Select a
distinctOnBy = forall b a.
Default Unpackspec b b =>
(a -> b) -> Order a -> Select a -> Select a
distinctOnByCorrect
distinctOnExplicit :: U.Unpackspec b b
-> (a -> b)
-> S.Select a
-> S.Select a
distinctOnExplicit :: forall b a. Unpackspec b b -> (a -> b) -> Select a -> Select a
distinctOnExplicit Unpackspec b b
unpack a -> b
proj Select a
q = forall a. State Tag (a, PrimQuery) -> Query a
Q.productQueryArr forall a b. (a -> b) -> a -> b
$ do
(a, PrimQuery)
a_pq <- forall a. Select a -> State Tag (a, PrimQuery)
Q.runSimpleSelect Select a
q
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall b a.
Unpackspec b b -> (a -> b) -> (a, PrimQuery) -> (a, PrimQuery)
O.distinctOn Unpackspec b b
unpack a -> b
proj (a, PrimQuery)
a_pq)
distinctOnByExplicit :: U.Unpackspec b b
-> (a -> b)
-> O.Order a
-> S.Select a
-> S.Select a
distinctOnByExplicit :: forall b a.
Unpackspec b b -> (a -> b) -> Order a -> Select a -> Select a
distinctOnByExplicit Unpackspec b b
unpack a -> b
proj Order a
ord Select a
q = forall a. State Tag (a, PrimQuery) -> Query a
Q.productQueryArr forall a b. (a -> b) -> a -> b
$ do
(a, PrimQuery)
a_pq <- forall a. Select a -> State Tag (a, PrimQuery)
Q.runSimpleSelect Select a
q
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall b a.
Unpackspec b b
-> (a -> b) -> Order a -> (a, PrimQuery) -> (a, PrimQuery)
O.distinctOnBy Unpackspec b b
unpack a -> b
proj Order a
ord (a, PrimQuery)
a_pq)