on 00a36f5 help sign in
rel8/src/Rel8/Expr/Order.hs
81 lines 2.5 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.
31--
32-- >>> select c $ orderBy asc $ values [ lit x | x <- [1..5 :: Int32] ]
33-- [1,2,3,4,5]
34asc :: DBOrd a => Order (Expr a)
35asc = Order $ Opaleye.Order (\expr -> [(orderOp, toPrimExpr expr)])
36 where
37 orderOp :: Opaleye.OrderOp
38 orderOp = Opaleye.OrderOp
39 { orderDirection = Opaleye.OpAsc
40 , orderNulls = Opaleye.NullsLast
41 }
44-- | Sort a column in descending order.
45--
46-- >>> select c $ orderBy desc $ values [ lit x | x <- [1..5 :: Int32] ]
47-- [5,4,3,2,1]
48desc :: DBOrd a => Order (Expr a)
49desc = Order $ Opaleye.Order (\expr -> [(orderOp, toPrimExpr expr)])
50 where
51 orderOp :: Opaleye.OrderOp
52 orderOp = Opaleye.OrderOp
53 { orderDirection = Opaleye.OpDesc
54 , orderNulls = Opaleye.NullsFirst
55 }
58-- | Transform an ordering so that @null@ values appear first. This corresponds
59-- to @NULLS FIRST@ in SQL.
60--
61-- >>> select c $ orderBy (nullsFirst desc) $ values $ [ nullExpr, nullExpr ] <> [ lit (Just x) | x <- [1..5 :: Int32] ]
62-- [Nothing,Nothing,Just 5,Just 4,Just 3,Just 2,Just 1]
63nullsFirst :: Order (Expr a) -> Order (Expr (Maybe a))
64nullsFirst (Order (Opaleye.Order f)) =
65 Order $ Opaleye.Order $ fmap (first g) . f . unsafeUnnullify
66 where
67 g :: Opaleye.OrderOp -> Opaleye.OrderOp
68 g orderOp = orderOp { Opaleye.orderNulls = Opaleye.NullsFirst }
71-- | Transform an ordering so that @null@ values appear first. This corresponds
72-- to @NULLS LAST@ in SQL.
73--
74-- >>> select c $ orderBy (nullsLast desc) $ values $ [ nullExpr, nullExpr ] <> [ lit (Just x) | x <- [1..5 :: Int32] ]
75-- [Just 5,Just 4,Just 3,Just 2,Just 1,Nothing,Nothing]
76nullsLast :: Order (Expr a) -> Order (Expr (Maybe a))
77nullsLast (Order (Opaleye.Order f)) =
78 Order $ Opaleye.Order $ fmap (first g) . f . unsafeUnnullify
79 where
80 g :: Opaleye.OrderOp -> Opaleye.OrderOp
81 g orderOp = orderOp { Opaleye.orderNulls = Opaleye.NullsLast }