@@ -2,22 +2,32 @@
3module Rel8.Query.Aggregate
3module Rel8.Query.Aggregate
4 ( aggregate
4 ( aggregate
9−import Prelude ()
10+import Data.Int ( Int64 )
12import qualified Opaleye.Aggregate as Opaleye
14import qualified Opaleye.Aggregate as Opaleye
15import Rel8.Aggregate ( Aggregate )
17import Rel8.Aggregate ( Aggregate )
18+import Rel8.Expr ( Expr )
19+import Rel8.Expr.Aggregate ( countStar )
16import Rel8.Query ( Query )
20import Rel8.Query ( Query )
21+import Rel8.Query.Maybe ( optional )
17import Rel8.Query.Opaleye ( mapOpaleye )
22import Rel8.Query.Opaleye ( mapOpaleye )
18import Rel8.Table.Opaleye ( aggregator )
23import Rel8.Table.Opaleye ( aggregator )
24+import Rel8.Table.Maybe ( maybeTable )
21-- | Apply an aggregation to all rows returned by a 'Query'.
27-- | Apply an aggregation to all rows returned by a 'Query'.
22aggregate :: Query (Aggregate exprs) -> Query exprs
28aggregate :: Query (Aggregate exprs) -> Query exprs
23aggregate = mapOpaleye (Opaleye.aggregate aggregator)
29aggregate = mapOpaleye (Opaleye.aggregate aggregator)
32+countRows :: Query a -> Query (Expr Int64)
33+countRows = fmap (maybeTable 0 id) . optional . aggregate . fmap (const countStar)