on 6fad4d1 help sign in
rel8/src/Rel8/Query/Indexed.hs
34 lines 1.1 kB history raw
1module Rel8.Query.Indexed
2 ( indexed
3 )
4where
6-- base
7import Data.Int ( Int64 )
8import Prelude
10-- opaleye
11import qualified Opaleye.Internal.HaskellDB.PrimQuery as Opaleye
12import qualified Opaleye.Internal.PackMap as Opaleye
13import qualified Opaleye.Internal.PrimQuery as Opaleye
14import qualified Opaleye.Internal.QueryArr as Opaleye
15import qualified Opaleye.Internal.Tag as Opaleye
17-- rel8
18import Rel8.Expr ( Expr )
19import Rel8.Expr.Opaleye ( fromPrimExpr )
20import Rel8.Query ( Query )
21import Rel8.Query.Opaleye ( mapOpaleye )
24-- | Pair each row of a query with its index within the query.
25indexed :: Query a -> Query (Expr Int64, a)
26indexed = mapOpaleye $ \(Opaleye.QueryArr f) -> Opaleye.QueryArr $ \(_, tag) ->
27 let
28 (a, query, tag') = f ((), tag)
29 tag'' = Opaleye.next tag'
30 window = Opaleye.ConstExpr $ Opaleye.OtherLit "ROW_NUMBER() OVER () - 1"
31 (index, bindings) = Opaleye.run $ Opaleye.extractAttr "index" tag' window
32 query' lateral = Opaleye.Rebind True bindings . query lateral
33 in
34 ((fromPrimExpr index, a), query', tag'')