on 2cdc394 help sign in
rel8/src/Rel8/Expr/Order.hs
69 lines 2.0 kB history raw
1{-# language DataKinds #-}
3{-# options_ghc -fno-warn-redundant-constraints #-}
5module Rel8.Expr.Order
6 ( asc
7 , desc
8 , nullsFirst
9 , nullsLast
10 )
11where
13-- base
14import Data.Bifunctor ( first )
15import Prelude
17-- opaleye
18import Opaleye.Internal.HaskellDB.PrimQuery ( OrderOp( orderDirection, orderNulls ) )
19import qualified Opaleye.Internal.HaskellDB.PrimQuery as Opaleye
20import qualified Opaleye.Internal.Order as Opaleye
22-- rel8
23import Rel8.Expr ( Expr )
24import Rel8.Expr.Null ( unsafeUnnullify )
25import Rel8.Expr.Opaleye ( toPrimExpr )
26import Rel8.Order ( Order( Order ) )
27import Rel8.Type.Ord ( DBOrd )
30-- | Sort a column in ascending order.
31asc :: DBOrd a => Order (Expr a)
32asc = Order $ Opaleye.Order (\expr -> [(orderOp, toPrimExpr expr)])
33 where
34 orderOp :: Opaleye.OrderOp
35 orderOp = Opaleye.OrderOp
36 { orderDirection = Opaleye.OpAsc
37 , orderNulls = Opaleye.NullsLast
38 }
41-- | Sort a column in descending order.
42desc :: DBOrd a => Order (Expr a)
43desc = Order $ Opaleye.Order (\expr -> [(orderOp, toPrimExpr expr)])
44 where
45 orderOp :: Opaleye.OrderOp
46 orderOp = Opaleye.OrderOp
47 { orderDirection = Opaleye.OpDesc
48 , orderNulls = Opaleye.NullsFirst
49 }
52-- | Transform an ordering so that @null@ values appear first. This corresponds
53-- to @NULLS FIRST@ in SQL.
54nullsFirst :: Order (Expr a) -> Order (Expr (Maybe a))
55nullsFirst (Order (Opaleye.Order f)) =
56 Order $ Opaleye.Order $ fmap (first g) . f . unsafeUnnullify
57 where
58 g :: Opaleye.OrderOp -> Opaleye.OrderOp
59 g orderOp = orderOp { Opaleye.orderNulls = Opaleye.NullsFirst }
62-- | Transform an ordering so that @null@ values appear first. This corresponds
63-- to @NULLS LAST@ in SQL.
64nullsLast :: Order (Expr a) -> Order (Expr (Maybe a))
65nullsLast (Order (Opaleye.Order f)) =
66 Order $ Opaleye.Order $ fmap (first g) . f . unsafeUnnullify
67 where
68 g :: Opaleye.OrderOp -> Opaleye.OrderOp
69 g orderOp = orderOp { Opaleye.orderNulls = Opaleye.NullsLast }