{-# language DataKinds #-}
{-# language DisambiguateRecordFields #-}
{-# language FlexibleContexts #-}
{-# language NamedFieldPuns #-}
{-# language OverloadedStrings #-}
{-# language ScopedTypeVariables #-}
{-# language TypeApplications #-}
{-# language TypeFamilies #-}

{-# options_ghc -fno-warn-redundant-constraints #-}

module Rel8.Expr.Aggregate
  ( count, countOn, countStar
  , countDistinct, countDistinctOn
  , countWhere, countWhereOn
  , and, andOn, or, orOn
  , min, minOn, max, maxOn
  , sum, sumOn, sumWhere
  , avg, avgOn
  , stringAgg, stringAggOn
  , mode, modeOn
  , percentile, percentileOn
  , percentileContinuous, percentileContinuousOn
  , hypotheticalRank
  , hypotheticalDenseRank
  , hypotheticalPercentRank
  , hypotheticalCumeDist
  , groupByExpr, groupByExprOn
  , distinctAggregate
  , filterWhereExplicit
  , listAggExpr, listAggExprOn, nonEmptyAggExpr, nonEmptyAggExprOn
  , listCatExpr, listCatExprOn, nonEmptyCatExpr, nonEmptyCatExprOn
  , slistAggExpr, snonEmptyAggExpr
  , slistCatExpr, snonEmptyCatExpr
  )
where

-- base
import Data.Functor.Contravariant ((>$<))
import Data.Int ( Int64 )
import Data.List.NonEmpty ( NonEmpty )
import Data.String (IsString)
import Prelude hiding (and, max, min, null, or, show, sum)

-- opaleye
import qualified Opaleye.Aggregate as Opaleye
import qualified Opaleye.Internal.Aggregate as Opaleye
import qualified Opaleye.Internal.HaskellDB.PrimQuery as Opaleye
import qualified Opaleye.Internal.Operators as Opaleye

-- profunctors
import Data.Profunctor (dimap, lmap)

-- rel8
import Rel8.Aggregate
  ( Aggregator' (Aggregator)
  , Aggregator1
  , filterWhereExplicit
  , unsafeMakeAggregator
  )
import Rel8.Aggregate.Fold (Fallback (Empty, Fallback))
import Rel8.Expr ( Expr )
import Rel8.Expr.Array (sempty)
import Rel8.Expr.Bool (false, true)
import Rel8.Expr.Eq ((/=.))
import Rel8.Expr.Opaleye
  ( castExpr
  , fromColumn
  , fromPrimExpr
  , toColumn
  , toPrimExpr
  , unsafeCastExpr
  )
import Rel8.Expr.Order (asc)
import Rel8.Expr.Read (sread)
import Rel8.Expr.Show (show)
import qualified Rel8.Expr.Text as Text
import Rel8.Order (Order (Order))
import Rel8.Schema.Null ( Sql, Unnullify )
import Rel8.Table.Opaleye (fromOrder, unpackspec)
import Rel8.Table.Order (ascTable)
import Rel8.Type ( DBType, typeInformation )
import Rel8.Type.Array (arrayTypeName, encodeArrayElement)
import Rel8.Type.Eq ( DBEq )
import Rel8.Type.Information (TypeInformation)
import Rel8.Type.Num (DBFractional, DBNum)
import Rel8.Type.Ord (DBMax, DBMin, DBOrd)
import Rel8.Type.String ( DBString )
import Rel8.Type.Sum ( DBSum )


-- | Count the occurances of a single column. Corresponds to @COUNT(a)@
count :: Aggregator' fold (Expr a) (Expr Int64)
count :: forall (fold :: Fold) a. Aggregator' fold (Expr a) (Expr Int64)
count =
  (Expr a -> Field_ 'NonNullable Any)
-> (Field_ 'NonNullable SqlInt8 -> Expr Int64)
-> Fallback fold (Expr Int64)
-> Aggregator
     (Field_ 'NonNullable Any) (Field_ 'NonNullable SqlInt8)
-> Aggregator' fold (Expr a) (Expr Int64)
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    (PrimExpr -> Field_ 'NonNullable Any
forall (n :: Nullability) b. PrimExpr -> Field_ n b
toColumn (PrimExpr -> Field_ 'NonNullable Any)
-> (Expr a -> PrimExpr) -> Expr a -> Field_ 'NonNullable Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr a -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr)
    (PrimExpr -> Expr Int64
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr Int64)
-> (Field_ 'NonNullable SqlInt8 -> PrimExpr)
-> Field_ 'NonNullable SqlInt8
-> Expr Int64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ 'NonNullable SqlInt8 -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    (Expr Int64 -> Fallback fold (Expr Int64)
forall a (fold :: Fold). a -> Fallback fold a
Fallback Expr Int64
0)
    Aggregator (Field_ 'NonNullable Any) (Field_ 'NonNullable SqlInt8)
forall a. Aggregator (Field a) (Field_ 'NonNullable SqlInt8)
Opaleye.count


-- | Applies 'count' to the column selected by the given function.
countOn :: (i -> Expr a) -> Aggregator' fold i (Expr Int64)
countOn :: forall i a (fold :: Fold).
(i -> Expr a) -> Aggregator' fold i (Expr Int64)
countOn i -> Expr a
f = (i -> Expr a)
-> Aggregator' fold (Expr a) (Expr Int64)
-> Aggregator' fold i (Expr Int64)
forall a b c.
(a -> b) -> Aggregator' fold b c -> Aggregator' fold a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr a
f Aggregator' fold (Expr a) (Expr Int64)
forall (fold :: Fold) a. Aggregator' fold (Expr a) (Expr Int64)
count


-- | Count the number of distinct occurrences of a single column. Corresponds to
-- @COUNT(DISTINCT a)@
countDistinct :: Sql DBEq a
  => Aggregator' fold (Expr a) (Expr Int64)
countDistinct :: forall a (fold :: Fold).
Sql DBEq a =>
Aggregator' fold (Expr a) (Expr Int64)
countDistinct = Aggregator' fold (Expr a) (Expr Int64)
-> Aggregator' fold (Expr a) (Expr Int64)
forall (fold :: Fold) i a.
Aggregator' fold i a -> Aggregator' fold i a
distinctAggregate Aggregator' fold (Expr a) (Expr Int64)
forall (fold :: Fold) a. Aggregator' fold (Expr a) (Expr Int64)
count


-- | Applies 'countDistinct' to the column selected by the given function.
countDistinctOn :: Sql DBEq a
  => (i -> Expr a) -> Aggregator' fold i (Expr Int64)
countDistinctOn :: forall a i (fold :: Fold).
Sql DBEq a =>
(i -> Expr a) -> Aggregator' fold i (Expr Int64)
countDistinctOn i -> Expr a
f = (i -> Expr a)
-> Aggregator' fold (Expr a) (Expr Int64)
-> Aggregator' fold i (Expr Int64)
forall a b c.
(a -> b) -> Aggregator' fold b c -> Aggregator' fold a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr a
f Aggregator' fold (Expr a) (Expr Int64)
forall a (fold :: Fold).
Sql DBEq a =>
Aggregator' fold (Expr a) (Expr Int64)
countDistinct


-- | Corresponds to @COUNT(*)@.
countStar :: Aggregator' fold i (Expr Int64)
countStar :: forall (fold :: Fold) i. Aggregator' fold i (Expr Int64)
countStar = (i -> Expr Bool)
-> Aggregator' fold (Expr Bool) (Expr Int64)
-> Aggregator' fold i (Expr Int64)
forall a b c.
(a -> b) -> Aggregator' fold b c -> Aggregator' fold a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap (Expr Bool -> i -> Expr Bool
forall a b. a -> b -> a
const Expr Bool
true) Aggregator' fold (Expr Bool) (Expr Int64)
forall (fold :: Fold) a. Aggregator' fold (Expr a) (Expr Int64)
count


-- | A count of the number of times a given expression is @true@.
countWhere :: Aggregator' fold (Expr Bool) (Expr Int64)
countWhere :: forall (fold :: Fold). Aggregator' fold (Expr Bool) (Expr Int64)
countWhere = IfPP (Expr Int64) (Expr Int64)
-> (Expr Bool -> Expr Bool)
-> Aggregator (Expr Bool) (Expr Int64)
-> Aggregator' fold (Expr Bool) (Expr Int64)
forall a i (fold :: Fold).
IfPP a a
-> (i -> Expr Bool) -> Aggregator i a -> Aggregator' fold i a
filterWhereExplicit IfPP (Expr Int64) (Expr Int64)
forall a. IfPP (Expr a) (Expr a)
ifPP Expr Bool -> Expr Bool
forall a. a -> a
id Aggregator (Expr Bool) (Expr Int64)
forall (fold :: Fold) i. Aggregator' fold i (Expr Int64)
countStar


-- | Applies 'countWhere' to the column selected by the given function.
countWhereOn :: (i -> Expr Bool) -> Aggregator' fold i (Expr Int64)
countWhereOn :: forall i (fold :: Fold).
(i -> Expr Bool) -> Aggregator' fold i (Expr Int64)
countWhereOn i -> Expr Bool
f = (i -> Expr Bool)
-> Aggregator' fold (Expr Bool) (Expr Int64)
-> Aggregator' fold i (Expr Int64)
forall a b c.
(a -> b) -> Aggregator' fold b c -> Aggregator' fold a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr Bool
f Aggregator' fold (Expr Bool) (Expr Int64)
forall (fold :: Fold). Aggregator' fold (Expr Bool) (Expr Int64)
countWhere


-- | Corresponds to @bool_and@.
and :: Aggregator' fold (Expr Bool) (Expr Bool)
and :: forall (fold :: Fold). Aggregator' fold (Expr Bool) (Expr Bool)
and =
  (Expr Bool -> Field_ 'NonNullable SqlBool)
-> (Field_ 'NonNullable SqlBool -> Expr Bool)
-> Fallback fold (Expr Bool)
-> Aggregator
     (Field_ 'NonNullable SqlBool) (Field_ 'NonNullable SqlBool)
-> Aggregator' fold (Expr Bool) (Expr Bool)
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    (PrimExpr -> Field_ 'NonNullable SqlBool
forall (n :: Nullability) b. PrimExpr -> Field_ n b
toColumn (PrimExpr -> Field_ 'NonNullable SqlBool)
-> (Expr Bool -> PrimExpr)
-> Expr Bool
-> Field_ 'NonNullable SqlBool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr Bool -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr)
    (PrimExpr -> Expr Bool
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr Bool)
-> (Field_ 'NonNullable SqlBool -> PrimExpr)
-> Field_ 'NonNullable SqlBool
-> Expr Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ 'NonNullable SqlBool -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    (Expr Bool -> Fallback fold (Expr Bool)
forall a (fold :: Fold). a -> Fallback fold a
Fallback Expr Bool
true)
    Aggregator
  (Field_ 'NonNullable SqlBool) (Field_ 'NonNullable SqlBool)
Opaleye.boolAnd


-- | Applies 'and' to the column selected by the given function.
andOn :: (i -> Expr Bool) -> Aggregator' fold i (Expr Bool)
andOn :: forall i (fold :: Fold).
(i -> Expr Bool) -> Aggregator' fold i (Expr Bool)
andOn i -> Expr Bool
f = (i -> Expr Bool)
-> Aggregator' fold (Expr Bool) (Expr Bool)
-> Aggregator' fold i (Expr Bool)
forall a b c.
(a -> b) -> Aggregator' fold b c -> Aggregator' fold a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr Bool
f Aggregator' fold (Expr Bool) (Expr Bool)
forall (fold :: Fold). Aggregator' fold (Expr Bool) (Expr Bool)
and


-- | Corresponds to @bool_or@.
or :: Aggregator' fold (Expr Bool) (Expr Bool)
or :: forall (fold :: Fold). Aggregator' fold (Expr Bool) (Expr Bool)
or =
  (Expr Bool -> Field_ 'NonNullable SqlBool)
-> (Field_ 'NonNullable SqlBool -> Expr Bool)
-> Fallback fold (Expr Bool)
-> Aggregator
     (Field_ 'NonNullable SqlBool) (Field_ 'NonNullable SqlBool)
-> Aggregator' fold (Expr Bool) (Expr Bool)
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    (PrimExpr -> Field_ 'NonNullable SqlBool
forall (n :: Nullability) b. PrimExpr -> Field_ n b
toColumn (PrimExpr -> Field_ 'NonNullable SqlBool)
-> (Expr Bool -> PrimExpr)
-> Expr Bool
-> Field_ 'NonNullable SqlBool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr Bool -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr)
    (PrimExpr -> Expr Bool
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr Bool)
-> (Field_ 'NonNullable SqlBool -> PrimExpr)
-> Field_ 'NonNullable SqlBool
-> Expr Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ 'NonNullable SqlBool -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    (Expr Bool -> Fallback fold (Expr Bool)
forall a (fold :: Fold). a -> Fallback fold a
Fallback Expr Bool
false)
    Aggregator
  (Field_ 'NonNullable SqlBool) (Field_ 'NonNullable SqlBool)
Opaleye.boolOr


-- | Applies 'or' to the column selected by the given function.
orOn :: (i -> Expr Bool) -> Aggregator' fold i (Expr Bool)
orOn :: forall i (fold :: Fold).
(i -> Expr Bool) -> Aggregator' fold i (Expr Bool)
orOn i -> Expr Bool
f = (i -> Expr Bool)
-> Aggregator' fold (Expr Bool) (Expr Bool)
-> Aggregator' fold i (Expr Bool)
forall a b c.
(a -> b) -> Aggregator' fold b c -> Aggregator' fold a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr Bool
f Aggregator' fold (Expr Bool) (Expr Bool)
forall (fold :: Fold). Aggregator' fold (Expr Bool) (Expr Bool)
or


-- | Produce an aggregation for @Expr a@ using the @max@ function.
max :: Sql DBMax a => Aggregator1 (Expr a) (Expr a)
max :: forall a. Sql DBMax a => Aggregator1 (Expr a) (Expr a)
max =
  (Expr a -> Field_ 'NonNullable Any)
-> (Field_ 'NonNullable Any -> Expr a)
-> Fallback 'Semi (Expr a)
-> Aggregator (Field_ 'NonNullable Any) (Field_ 'NonNullable Any)
-> Aggregator' 'Semi (Expr a) (Expr a)
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    (PrimExpr -> Field_ 'NonNullable Any
forall (n :: Nullability) b. PrimExpr -> Field_ n b
toColumn (PrimExpr -> Field_ 'NonNullable Any)
-> (Expr a -> PrimExpr) -> Expr a -> Field_ 'NonNullable Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr a -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr)
    (PrimExpr -> Expr a
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr a)
-> (Field_ 'NonNullable Any -> PrimExpr)
-> Field_ 'NonNullable Any
-> Expr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ 'NonNullable Any -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    Fallback 'Semi (Expr a)
forall a. Fallback 'Semi a
Empty
    Aggregator (Field_ 'NonNullable Any) (Field_ 'NonNullable Any)
forall a. Aggregator (Field a) (Field a)
Opaleye.unsafeMax


-- | Applies 'max' to the column selected by the given function.
maxOn :: Sql DBMax a => (i -> Expr a) -> Aggregator1 i (Expr a)
maxOn :: forall a i. Sql DBMax a => (i -> Expr a) -> Aggregator1 i (Expr a)
maxOn i -> Expr a
f = (i -> Expr a)
-> Aggregator' 'Semi (Expr a) (Expr a)
-> Aggregator' 'Semi i (Expr a)
forall a b c.
(a -> b) -> Aggregator' 'Semi b c -> Aggregator' 'Semi a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr a
f Aggregator' 'Semi (Expr a) (Expr a)
forall a. Sql DBMax a => Aggregator1 (Expr a) (Expr a)
max


-- | Produce an aggregation for @Expr a@ using the @min@ function.
min :: Sql DBMin a => Aggregator1 (Expr a) (Expr a)
min :: forall a. Sql DBMin a => Aggregator1 (Expr a) (Expr a)
min =
  (Expr a -> Field_ 'NonNullable Any)
-> (Field_ 'NonNullable Any -> Expr a)
-> Fallback 'Semi (Expr a)
-> Aggregator (Field_ 'NonNullable Any) (Field_ 'NonNullable Any)
-> Aggregator' 'Semi (Expr a) (Expr a)
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    (PrimExpr -> Field_ 'NonNullable Any
forall (n :: Nullability) b. PrimExpr -> Field_ n b
toColumn (PrimExpr -> Field_ 'NonNullable Any)
-> (Expr a -> PrimExpr) -> Expr a -> Field_ 'NonNullable Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr a -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr)
    (PrimExpr -> Expr a
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr a)
-> (Field_ 'NonNullable Any -> PrimExpr)
-> Field_ 'NonNullable Any
-> Expr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ 'NonNullable Any -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    Fallback 'Semi (Expr a)
forall a. Fallback 'Semi a
Empty
    Aggregator (Field_ 'NonNullable Any) (Field_ 'NonNullable Any)
forall a. Aggregator (Field a) (Field a)
Opaleye.unsafeMin


-- | Applies 'min' to the column selected by the given function.
minOn :: Sql DBMin a => (i -> Expr a) -> Aggregator1 i (Expr a)
minOn :: forall a i. Sql DBMin a => (i -> Expr a) -> Aggregator1 i (Expr a)
minOn i -> Expr a
f = (i -> Expr a)
-> Aggregator' 'Semi (Expr a) (Expr a)
-> Aggregator' 'Semi i (Expr a)
forall a b c.
(a -> b) -> Aggregator' 'Semi b c -> Aggregator' 'Semi a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr a
f Aggregator' 'Semi (Expr a) (Expr a)
forall a. Sql DBMin a => Aggregator1 (Expr a) (Expr a)
min


-- | Corresponds to @sum@. Note that in SQL, @sum@ is type changing - for
-- example the @sum@ of @integer@ returns a @bigint@. Rel8 doesn't support
-- this, and will add explicit casts back to the original input type. This can
-- lead to overflows, and if you anticipate very large sums, you should upcast
-- your input.
sum :: (Sql DBNum a, Sql DBSum a) => Aggregator' fold (Expr a) (Expr a)
sum :: forall a (fold :: Fold).
(Sql DBNum a, Sql DBSum a) =>
Aggregator' fold (Expr a) (Expr a)
sum =
  (Expr a -> Field_ 'NonNullable Any)
-> (Field_ 'NonNullable Any -> Expr a)
-> Fallback fold (Expr a)
-> Aggregator (Field_ 'NonNullable Any) (Field_ 'NonNullable Any)
-> Aggregator' fold (Expr a) (Expr a)
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    (PrimExpr -> Field_ 'NonNullable Any
forall (n :: Nullability) b. PrimExpr -> Field_ n b
toColumn (PrimExpr -> Field_ 'NonNullable Any)
-> (Expr a -> PrimExpr) -> Expr a -> Field_ 'NonNullable Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr a -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr)
    (PrimExpr -> Expr a
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr a)
-> (Field_ 'NonNullable Any -> PrimExpr)
-> Field_ 'NonNullable Any
-> Expr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ 'NonNullable Any -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    (Expr a -> Fallback fold (Expr a)
forall a (fold :: Fold). a -> Fallback fold a
Fallback Expr a
0)
    Aggregator (Field_ 'NonNullable Any) (Field_ 'NonNullable Any)
forall a. Aggregator (Field a) (Field a)
Opaleye.unsafeSum


-- | Applies 'sum' to the column selected by the given fucntion.
sumOn :: (Sql DBNum a, Sql DBSum a)
  => (i -> Expr a) -> Aggregator' fold i (Expr a)
sumOn :: forall a i (fold :: Fold).
(Sql DBNum a, Sql DBSum a) =>
(i -> Expr a) -> Aggregator' fold i (Expr a)
sumOn i -> Expr a
f = (i -> Expr a)
-> Aggregator' fold (Expr a) (Expr a)
-> Aggregator' fold i (Expr a)
forall a b c.
(a -> b) -> Aggregator' fold b c -> Aggregator' fold a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr a
f Aggregator' fold (Expr a) (Expr a)
forall a (fold :: Fold).
(Sql DBNum a, Sql DBSum a) =>
Aggregator' fold (Expr a) (Expr a)
sum


-- | 'sumWhere' is a combination of 'Rel8.filterWhere' and 'sumOn'.
sumWhere :: (Sql DBNum a, Sql DBSum a)
  => (i -> Expr Bool) -> (i -> Expr a) -> Aggregator' fold i (Expr a)
sumWhere :: forall a i (fold :: Fold).
(Sql DBNum a, Sql DBSum a) =>
(i -> Expr Bool) -> (i -> Expr a) -> Aggregator' fold i (Expr a)
sumWhere i -> Expr Bool
condition = IfPP (Expr a) (Expr a)
-> (i -> Expr Bool)
-> Aggregator i (Expr a)
-> Aggregator' fold i (Expr a)
forall a i (fold :: Fold).
IfPP a a
-> (i -> Expr Bool) -> Aggregator i a -> Aggregator' fold i a
filterWhereExplicit IfPP (Expr a) (Expr a)
forall a. IfPP (Expr a) (Expr a)
ifPP i -> Expr Bool
condition (Aggregator i (Expr a) -> Aggregator' fold i (Expr a))
-> ((i -> Expr a) -> Aggregator i (Expr a))
-> (i -> Expr a)
-> Aggregator' fold i (Expr a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (i -> Expr a) -> Aggregator i (Expr a)
forall a i (fold :: Fold).
(Sql DBNum a, Sql DBSum a) =>
(i -> Expr a) -> Aggregator' fold i (Expr a)
sumOn


-- | Corresponds to @avg@. Note that in SQL, @avg@ is type changing - for
-- example, the @avg@ of @integer@ returns a @numeric@. Rel8 doesn't support
-- this, and will add explicit casts back to the original input type. If you
-- need a fractional result on an integral column, you should cast your input
-- to 'Double' or 'Data.Scientific.Scientific' before calling 'avg'.
avg :: Sql DBSum a => Aggregator1 (Expr a) (Expr a)
avg :: forall a. Sql DBSum a => Aggregator1 (Expr a) (Expr a)
avg =
  (Expr a -> Field_ 'NonNullable Any)
-> (Field_ 'NonNullable Any -> Expr a)
-> Fallback 'Semi (Expr a)
-> Aggregator (Field_ 'NonNullable Any) (Field_ 'NonNullable Any)
-> Aggregator' 'Semi (Expr a) (Expr a)
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    (PrimExpr -> Field_ 'NonNullable Any
forall (n :: Nullability) b. PrimExpr -> Field_ n b
toColumn (PrimExpr -> Field_ 'NonNullable Any)
-> (Expr a -> PrimExpr) -> Expr a -> Field_ 'NonNullable Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr a -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr)
    (PrimExpr -> Expr a
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr a)
-> (Field_ 'NonNullable Any -> PrimExpr)
-> Field_ 'NonNullable Any
-> Expr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ 'NonNullable Any -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    Fallback 'Semi (Expr a)
forall a. Fallback 'Semi a
Empty
    Aggregator (Field_ 'NonNullable Any) (Field_ 'NonNullable Any)
forall a. Aggregator (Field a) (Field a)
Opaleye.unsafeAvg


-- | Applies 'avg' to the column selected by the given fucntion.
avgOn :: Sql DBSum a => (i -> Expr a) -> Aggregator1 i (Expr a)
avgOn :: forall a i. Sql DBSum a => (i -> Expr a) -> Aggregator1 i (Expr a)
avgOn i -> Expr a
f = (i -> Expr a)
-> Aggregator' 'Semi (Expr a) (Expr a)
-> Aggregator' 'Semi i (Expr a)
forall a b c.
(a -> b) -> Aggregator' 'Semi b c -> Aggregator' 'Semi a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr a
f Aggregator' 'Semi (Expr a) (Expr a)
forall a. Sql DBSum a => Aggregator1 (Expr a) (Expr a)
avg


-- | Corresponds to @string_agg()@.
stringAgg :: (Sql IsString a, Sql DBString a)
  => Expr a -> Aggregator' fold (Expr a) (Expr a)
stringAgg :: forall a (fold :: Fold).
(Sql IsString a, Sql DBString a) =>
Expr a -> Aggregator' fold (Expr a) (Expr a)
stringAgg Expr a
delimiter =
  (Expr a -> Field_ 'NonNullable SqlText)
-> (Field_ 'NonNullable SqlText -> Expr a)
-> Fallback fold (Expr a)
-> Aggregator
     (Field_ 'NonNullable SqlText) (Field_ 'NonNullable SqlText)
-> Aggregator' fold (Expr a) (Expr a)
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    (PrimExpr -> Field_ 'NonNullable SqlText
forall (n :: Nullability) b. PrimExpr -> Field_ n b
toColumn (PrimExpr -> Field_ 'NonNullable SqlText)
-> (Expr a -> PrimExpr) -> Expr a -> Field_ 'NonNullable SqlText
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr a -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr)
    (Expr a -> Expr a
forall a. Sql DBType a => Expr a -> Expr a
castExpr (Expr a -> Expr a)
-> (Field_ 'NonNullable SqlText -> Expr a)
-> Field_ 'NonNullable SqlText
-> Expr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimExpr -> Expr a
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr a)
-> (Field_ 'NonNullable SqlText -> PrimExpr)
-> Field_ 'NonNullable SqlText
-> Expr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ 'NonNullable SqlText -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    (Expr a -> Fallback fold (Expr a)
forall a (fold :: Fold). a -> Fallback fold a
Fallback Expr a
"")
    (Field_ 'NonNullable SqlText
-> Aggregator
     (Field_ 'NonNullable SqlText) (Field_ 'NonNullable SqlText)
Opaleye.stringAgg (PrimExpr -> Field_ 'NonNullable SqlText
forall (n :: Nullability) b. PrimExpr -> Field_ n b
toColumn (Expr a -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr Expr a
delimiter)))


-- | Applies 'stringAgg' to the column selected by the given function.
stringAggOn :: (Sql IsString a, Sql DBString a)
  => Expr a -> (i -> Expr a) -> Aggregator' fold i (Expr a)
stringAggOn :: forall a i (fold :: Fold).
(Sql IsString a, Sql DBString a) =>
Expr a -> (i -> Expr a) -> Aggregator' fold i (Expr a)
stringAggOn Expr a
delimiter i -> Expr a
f = (i -> Expr a)
-> Aggregator' fold (Expr a) (Expr a)
-> Aggregator' fold i (Expr a)
forall a b c.
(a -> b) -> Aggregator' fold b c -> Aggregator' fold a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr a
f (Expr a -> Aggregator' fold (Expr a) (Expr a)
forall a (fold :: Fold).
(Sql IsString a, Sql DBString a) =>
Expr a -> Aggregator' fold (Expr a) (Expr a)
stringAgg Expr a
delimiter)


-- | Corresponds to @mode() WITHIN GROUP (ORDER BY _)@.
mode :: Sql DBOrd a => Aggregator1 (Expr a) (Expr a)
mode :: forall a. Sql DBOrd a => Aggregator1 (Expr a) (Expr a)
mode =
  (Expr a -> Expr a)
-> (Field_ Any Any -> Expr a)
-> Fallback 'Semi (Expr a)
-> Aggregator (Expr a) (Field_ Any Any)
-> Aggregator' 'Semi (Expr a) (Expr a)
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    Expr a -> Expr a
forall a. a -> a
id
    (PrimExpr -> Expr a
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr a)
-> (Field_ Any Any -> PrimExpr) -> Field_ Any Any -> Expr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ Any Any -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    Fallback 'Semi (Expr a)
forall a. Fallback 'Semi a
Empty
    (Order (Expr a)
-> Aggregator (Expr a) (Field_ Any Any)
-> Aggregator (Expr a) (Field_ Any Any)
forall a b. Order a -> Aggregator a b -> Aggregator a b
Opaleye.withinGroup ((\(Order Order (Expr a)
o) -> Order (Expr a)
o) Order (Expr a)
forall a. OrdTable a => Order a
ascTable)
      (Unpackspec (Expr a) ()
-> AggrOp -> Aggregator (Expr a) (Field_ Any Any)
forall a a' (n :: Nullability) b.
Unpackspec a a' -> AggrOp -> Aggregator a (Field_ n b)
Opaleye.makeAggrExplicit (() -> Unpackspec (Expr a) ()
forall a. a -> Unpackspec (Expr a) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()) (String -> AggrOp
Opaleye.AggrOther String
"mode")))


-- | Applies 'mode' to the column selected by the given function.
modeOn :: Sql DBOrd a => (i -> Expr a) -> Aggregator1 i (Expr a)
modeOn :: forall a i. Sql DBOrd a => (i -> Expr a) -> Aggregator1 i (Expr a)
modeOn i -> Expr a
f = (i -> Expr a)
-> Aggregator' 'Semi (Expr a) (Expr a)
-> Aggregator' 'Semi i (Expr a)
forall a b c.
(a -> b) -> Aggregator' 'Semi b c -> Aggregator' 'Semi a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr a
f Aggregator' 'Semi (Expr a) (Expr a)
forall a. Sql DBOrd a => Aggregator1 (Expr a) (Expr a)
mode


-- | Corresponds to @percentile_disc(_) WITHIN GROUP (ORDER BY _)@.
percentile :: Sql DBOrd a => Expr Double -> Aggregator1 (Expr a) (Expr a)
percentile :: forall a.
Sql DBOrd a =>
Expr Double -> Aggregator1 (Expr a) (Expr a)
percentile Expr Double
fraction = 
  (Expr a -> (Expr Double, Expr a))
-> (Field_ Any Any -> Expr a)
-> Fallback 'Semi (Expr a)
-> Aggregator (Expr Double, Expr a) (Field_ Any Any)
-> Aggregator' 'Semi (Expr a) (Expr a)
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    (\Expr a
a -> (Expr Double
fraction, Expr a
a))
    (Expr a -> Expr a
forall a. Sql DBType a => Expr a -> Expr a
castExpr (Expr a -> Expr a)
-> (Field_ Any Any -> Expr a) -> Field_ Any Any -> Expr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimExpr -> Expr a
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr a)
-> (Field_ Any Any -> PrimExpr) -> Field_ Any Any -> Expr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ Any Any -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    Fallback 'Semi (Expr a)
forall a. Fallback 'Semi a
Empty
    (Order (Expr Double, Expr a)
-> Aggregator (Expr Double, Expr a) (Field_ Any Any)
-> Aggregator (Expr Double, Expr a) (Field_ Any Any)
forall a b. Order a -> Aggregator a b -> Aggregator a b
Opaleye.withinGroup ((\(Order Order (Expr Double, Expr a)
o) -> Order (Expr Double, Expr a)
o) ((Expr Double, Expr a) -> Expr a
forall a b. (a, b) -> b
snd ((Expr Double, Expr a) -> Expr a)
-> Order (Expr a) -> Order (Expr Double, Expr a)
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
>$< Order (Expr a)
forall a. OrdTable a => Order a
ascTable))
      (Unpackspec (Expr Double, Expr a) (Expr Double)
-> AggrOp -> Aggregator (Expr Double, Expr a) (Field_ Any Any)
forall a a' (n :: Nullability) b.
Unpackspec a a' -> AggrOp -> Aggregator a (Field_ n b)
Opaleye.makeAggrExplicit
        (((Expr Double, Expr a) -> Expr Double)
-> Unpackspec (Expr Double) (Expr Double)
-> Unpackspec (Expr Double, Expr a) (Expr Double)
forall a b c. (a -> b) -> Unpackspec b c -> Unpackspec a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap (Expr Double, Expr a) -> Expr Double
forall a b. (a, b) -> a
fst Unpackspec (Expr Double) (Expr Double)
forall a. Table Expr a => Unpackspec a a
unpackspec)
        (String -> AggrOp
Opaleye.AggrOther String
"percentile_disc")))


-- | Applies 'percentile' to the column selected by the given function.
percentileOn ::
  Sql DBOrd a =>
  Expr Double ->
  (i -> Expr a) ->
  Aggregator1 i (Expr a)
percentileOn :: forall a i.
Sql DBOrd a =>
Expr Double -> (i -> Expr a) -> Aggregator1 i (Expr a)
percentileOn Expr Double
fraction i -> Expr a
f = (i -> Expr a)
-> Aggregator' 'Semi (Expr a) (Expr a)
-> Aggregator' 'Semi i (Expr a)
forall a b c.
(a -> b) -> Aggregator' 'Semi b c -> Aggregator' 'Semi a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr a
f (Expr Double -> Aggregator' 'Semi (Expr a) (Expr a)
forall a.
Sql DBOrd a =>
Expr Double -> Aggregator1 (Expr a) (Expr a)
percentile Expr Double
fraction)


-- | Corresponds to @percentile_cont(_) WITHIN GROUP (ORDER BY _)@.
percentileContinuous ::
  Sql DBFractional a =>
  Expr Double ->
  Aggregator1 (Expr a) (Expr a)
percentileContinuous :: forall a.
Sql DBFractional a =>
Expr Double -> Aggregator1 (Expr a) (Expr a)
percentileContinuous Expr Double
fraction = 
  (Expr a -> (Expr Double, Expr a))
-> (Field_ Any Any -> Expr a)
-> Fallback 'Semi (Expr a)
-> Aggregator (Expr Double, Expr a) (Field_ Any Any)
-> Aggregator' 'Semi (Expr a) (Expr a)
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    (\Expr a
a -> (Expr Double
fraction, Expr a
a))
    (Expr a -> Expr a
forall a. Sql DBType a => Expr a -> Expr a
castExpr (Expr a -> Expr a)
-> (Field_ Any Any -> Expr a) -> Field_ Any Any -> Expr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimExpr -> Expr a
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr a)
-> (Field_ Any Any -> PrimExpr) -> Field_ Any Any -> Expr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ Any Any -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    Fallback 'Semi (Expr a)
forall a. Fallback 'Semi a
Empty
    (Order (Expr Double, Expr a)
-> Aggregator (Expr Double, Expr a) (Field_ Any Any)
-> Aggregator (Expr Double, Expr a) (Field_ Any Any)
forall a b. Order a -> Aggregator a b -> Aggregator a b
Opaleye.withinGroup ((\(Order Order (Expr Double, Expr a)
o) -> Order (Expr Double, Expr a)
o) (forall b a. Sql DBType b => Expr a -> Expr b
unsafeCastExpr @Double (Expr a -> Expr Double)
-> ((Expr Double, Expr a) -> Expr a)
-> (Expr Double, Expr a)
-> Expr Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Expr Double, Expr a) -> Expr a
forall a b. (a, b) -> b
snd ((Expr Double, Expr a) -> Expr Double)
-> Order (Expr Double) -> Order (Expr Double, Expr a)
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
>$< Order (Expr Double)
forall a. DBOrd a => Order (Expr a)
asc))
      (Unpackspec (Expr Double, Expr a) (Expr Double)
-> AggrOp -> Aggregator (Expr Double, Expr a) (Field_ Any Any)
forall a a' (n :: Nullability) b.
Unpackspec a a' -> AggrOp -> Aggregator a (Field_ n b)
Opaleye.makeAggrExplicit
        (((Expr Double, Expr a) -> Expr Double)
-> Unpackspec (Expr Double) (Expr Double)
-> Unpackspec (Expr Double, Expr a) (Expr Double)
forall a b c. (a -> b) -> Unpackspec b c -> Unpackspec a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap (Expr Double, Expr a) -> Expr Double
forall a b. (a, b) -> a
fst Unpackspec (Expr Double) (Expr Double)
forall a. Table Expr a => Unpackspec a a
unpackspec)
        (String -> AggrOp
Opaleye.AggrOther String
"percentile_disc")))



-- | Applies 'percentileContinuous' to the column selected by the given
-- function.
percentileContinuousOn ::
  Sql DBFractional a =>
  Expr Double ->
  (i -> Expr a) ->
  Aggregator1 i (Expr a)
percentileContinuousOn :: forall a i.
Sql DBFractional a =>
Expr Double -> (i -> Expr a) -> Aggregator1 i (Expr a)
percentileContinuousOn Expr Double
fraction i -> Expr a
f = (i -> Expr a)
-> Aggregator' 'Semi (Expr a) (Expr a)
-> Aggregator' 'Semi i (Expr a)
forall a b c.
(a -> b) -> Aggregator' 'Semi b c -> Aggregator' 'Semi a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr a
f (Expr Double -> Aggregator' 'Semi (Expr a) (Expr a)
forall a.
Sql DBFractional a =>
Expr Double -> Aggregator1 (Expr a) (Expr a)
percentileContinuous Expr Double
fraction)


-- | Corresponds to @rank(_) WITHIN GROUP (ORDER BY _)@.
hypotheticalRank ::
  Order a ->
  a ->
  Aggregator' fold a (Expr Int64)
hypotheticalRank :: forall a (fold :: Fold).
Order a -> a -> Aggregator' fold a (Expr Int64)
hypotheticalRank (Order Order a
order) a
args = 
  (a -> (a, a))
-> (Field_ Any Any -> Expr Int64)
-> Fallback fold (Expr Int64)
-> Aggregator (a, a) (Field_ Any Any)
-> Aggregator' fold a (Expr Int64)
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    (\a
a -> (a
args, a
a))
    (Expr Int64 -> Expr Int64
forall a. Sql DBType a => Expr a -> Expr a
castExpr (Expr Int64 -> Expr Int64)
-> (Field_ Any Any -> Expr Int64) -> Field_ Any Any -> Expr Int64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimExpr -> Expr Int64
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr Int64)
-> (Field_ Any Any -> PrimExpr) -> Field_ Any Any -> Expr Int64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ Any Any -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    (Expr Int64 -> Fallback fold (Expr Int64)
forall a (fold :: Fold). a -> Fallback fold a
Fallback Expr Int64
1)
    (Order (a, a)
-> Aggregator (a, a) (Field_ Any Any)
-> Aggregator (a, a) (Field_ Any Any)
forall a b. Order a -> Aggregator a b -> Aggregator a b
Opaleye.withinGroup ((a, a) -> a
forall a b. (a, b) -> b
snd ((a, a) -> a) -> Order a -> Order (a, a)
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
>$< Order a
order)
      (Unpackspec (a, a) (a, a)
-> AggrOp -> Aggregator (a, a) (Field_ Any Any)
forall a a' (n :: Nullability) b.
Unpackspec a a' -> AggrOp -> Aggregator a (Field_ n b)
Opaleye.makeAggrExplicit
        (Order (a, a) -> Unpackspec (a, a) (a, a)
forall a. Order a -> Unpackspec a a
fromOrder ((a, a) -> a
forall a b. (a, b) -> a
fst ((a, a) -> a) -> Order a -> Order (a, a)
forall (f :: * -> *) a b. Contravariant f => (a -> b) -> f b -> f a
>$< Order a
order))
        (String -> AggrOp
Opaleye.AggrOther String
"rank")))


-- | Corresponds to @dense_rank(_) WITHIN GROUP (ORDER BY _)@.
hypotheticalDenseRank ::
  Order a ->
  a ->
  Aggregator' fold a (Expr Int64)
hypotheticalDenseRank :: forall a (fold :: Fold).
Order a -> a -> Aggregator' fold a (Expr Int64)
hypotheticalDenseRank (Order Order a
order) a
args = 
  (a -> a)
-> (Field_ Any Any -> Expr Int64)
-> Fallback fold (Expr Int64)
-> Aggregator a (Field_ Any Any)
-> Aggregator' fold a (Expr Int64)
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    (a -> a -> a
forall a b. a -> b -> a
const a
args)
    (Expr Int64 -> Expr Int64
forall a. Sql DBType a => Expr a -> Expr a
castExpr (Expr Int64 -> Expr Int64)
-> (Field_ Any Any -> Expr Int64) -> Field_ Any Any -> Expr Int64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimExpr -> Expr Int64
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr Int64)
-> (Field_ Any Any -> PrimExpr) -> Field_ Any Any -> Expr Int64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ Any Any -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    (Expr Int64 -> Fallback fold (Expr Int64)
forall a (fold :: Fold). a -> Fallback fold a
Fallback Expr Int64
1)
    (Order a
-> Aggregator a (Field_ Any Any) -> Aggregator a (Field_ Any Any)
forall a b. Order a -> Aggregator a b -> Aggregator a b
Opaleye.withinGroup Order a
order
      (Unpackspec a a -> AggrOp -> Aggregator a (Field_ Any Any)
forall a a' (n :: Nullability) b.
Unpackspec a a' -> AggrOp -> Aggregator a (Field_ n b)
Opaleye.makeAggrExplicit (Order a -> Unpackspec a a
forall a. Order a -> Unpackspec a a
fromOrder Order a
order)
        (String -> AggrOp
Opaleye.AggrOther String
"dense_rank")))


-- | Corresponds to @percent_rank(_) WITHIN GROUP (ORDER BY _)@.
hypotheticalPercentRank ::
  Order a ->
  a ->
  Aggregator' fold a (Expr Double)
hypotheticalPercentRank :: forall a (fold :: Fold).
Order a -> a -> Aggregator' fold a (Expr Double)
hypotheticalPercentRank (Order Order a
order) a
args = 
  (a -> a)
-> (Field_ Any Any -> Expr Double)
-> Fallback fold (Expr Double)
-> Aggregator a (Field_ Any Any)
-> Aggregator' fold a (Expr Double)
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    (a -> a -> a
forall a b. a -> b -> a
const a
args)
    (Expr Double -> Expr Double
forall a. Sql DBType a => Expr a -> Expr a
castExpr (Expr Double -> Expr Double)
-> (Field_ Any Any -> Expr Double) -> Field_ Any Any -> Expr Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimExpr -> Expr Double
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr Double)
-> (Field_ Any Any -> PrimExpr) -> Field_ Any Any -> Expr Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ Any Any -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    (Expr Double -> Fallback fold (Expr Double)
forall a (fold :: Fold). a -> Fallback fold a
Fallback Expr Double
0)
    (Order a
-> Aggregator a (Field_ Any Any) -> Aggregator a (Field_ Any Any)
forall a b. Order a -> Aggregator a b -> Aggregator a b
Opaleye.withinGroup Order a
order
      (Unpackspec a a -> AggrOp -> Aggregator a (Field_ Any Any)
forall a a' (n :: Nullability) b.
Unpackspec a a' -> AggrOp -> Aggregator a (Field_ n b)
Opaleye.makeAggrExplicit (Order a -> Unpackspec a a
forall a. Order a -> Unpackspec a a
fromOrder Order a
order)
        (String -> AggrOp
Opaleye.AggrOther String
"percent_rank")))


-- | Corresponds to @cume_dist(_) WITHIN GROUP (ORDER BY _)@.
hypotheticalCumeDist ::
  Order a ->
  a ->
  Aggregator' fold a (Expr Double)
hypotheticalCumeDist :: forall a (fold :: Fold).
Order a -> a -> Aggregator' fold a (Expr Double)
hypotheticalCumeDist (Order Order a
order) a
args = 
  (a -> a)
-> (Field_ Any Any -> Expr Double)
-> Fallback fold (Expr Double)
-> Aggregator a (Field_ Any Any)
-> Aggregator' fold a (Expr Double)
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    (a -> a -> a
forall a b. a -> b -> a
const a
args)
    (Expr Double -> Expr Double
forall a. Sql DBType a => Expr a -> Expr a
castExpr (Expr Double -> Expr Double)
-> (Field_ Any Any -> Expr Double) -> Field_ Any Any -> Expr Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimExpr -> Expr Double
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr Double)
-> (Field_ Any Any -> PrimExpr) -> Field_ Any Any -> Expr Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ Any Any -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    (Expr Double -> Fallback fold (Expr Double)
forall a (fold :: Fold). a -> Fallback fold a
Fallback Expr Double
1)
    (Order a
-> Aggregator a (Field_ Any Any) -> Aggregator a (Field_ Any Any)
forall a b. Order a -> Aggregator a b -> Aggregator a b
Opaleye.withinGroup Order a
order
      (Unpackspec a a -> AggrOp -> Aggregator a (Field_ Any Any)
forall a a' (n :: Nullability) b.
Unpackspec a a' -> AggrOp -> Aggregator a (Field_ n b)
Opaleye.makeAggrExplicit (Order a -> Unpackspec a a
forall a. Order a -> Unpackspec a a
fromOrder Order a
order)
        (String -> AggrOp
Opaleye.AggrOther String
"cume_dist")))


-- | Aggregate a value by grouping by it.
groupByExpr :: Sql DBEq a => Aggregator1 (Expr a) (Expr a)
groupByExpr :: forall a. Sql DBEq a => Aggregator1 (Expr a) (Expr a)
groupByExpr =
  (Expr a -> Field_ Any Any)
-> (Field_ Any Any -> Expr a)
-> Fallback 'Semi (Expr a)
-> Aggregator (Field_ Any Any) (Field_ Any Any)
-> Aggregator' 'Semi (Expr a) (Expr a)
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    (PrimExpr -> Field_ Any Any
forall (n :: Nullability) b. PrimExpr -> Field_ n b
toColumn (PrimExpr -> Field_ Any Any)
-> (Expr a -> PrimExpr) -> Expr a -> Field_ Any Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr a -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr)
    (PrimExpr -> Expr a
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr a)
-> (Field_ Any Any -> PrimExpr) -> Field_ Any Any -> Expr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ Any Any -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    Fallback 'Semi (Expr a)
forall a. Fallback 'Semi a
Empty
    Aggregator (Field_ Any Any) (Field_ Any Any)
forall (n :: Nullability) a. Aggregator (Field_ n a) (Field_ n a)
Opaleye.groupBy


-- | Applies 'groupByExpr' to the column selected by the given function.
groupByExprOn :: Sql DBEq a => (i -> Expr a) -> Aggregator1 i (Expr a)
groupByExprOn :: forall a i. Sql DBEq a => (i -> Expr a) -> Aggregator1 i (Expr a)
groupByExprOn i -> Expr a
f = (i -> Expr a)
-> Aggregator' 'Semi (Expr a) (Expr a)
-> Aggregator' 'Semi i (Expr a)
forall a b c.
(a -> b) -> Aggregator' 'Semi b c -> Aggregator' 'Semi a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr a
f Aggregator' 'Semi (Expr a) (Expr a)
forall a. Sql DBEq a => Aggregator1 (Expr a) (Expr a)
groupByExpr


-- | Collect expressions values as a list.
listAggExpr :: Sql DBType a => Aggregator' fold (Expr a) (Expr [a])
listAggExpr :: forall a (fold :: Fold).
Sql DBType a =>
Aggregator' fold (Expr a) (Expr [a])
listAggExpr = TypeInformation (Unnullify' (IsMaybe a) a)
-> Aggregator' fold (Expr a) (Expr [a])
forall a (fold :: Fold).
TypeInformation (Unnullify a)
-> Aggregator' fold (Expr a) (Expr [a])
slistAggExpr TypeInformation (Unnullify' (IsMaybe a) a)
forall a. DBType a => TypeInformation a
typeInformation


-- | Applies 'listAggExpr' to the column selected by the given function.
listAggExprOn :: Sql DBType a => (i -> Expr a) -> Aggregator' fold i (Expr [a])
listAggExprOn :: forall a i (fold :: Fold).
Sql DBType a =>
(i -> Expr a) -> Aggregator' fold i (Expr [a])
listAggExprOn i -> Expr a
f = (i -> Expr a)
-> Aggregator' fold (Expr a) (Expr [a])
-> Aggregator' fold i (Expr [a])
forall a b c.
(a -> b) -> Aggregator' fold b c -> Aggregator' fold a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr a
f Aggregator' fold (Expr a) (Expr [a])
forall a (fold :: Fold).
Sql DBType a =>
Aggregator' fold (Expr a) (Expr [a])
listAggExpr


-- | Collect expressions values as a non-empty list.
nonEmptyAggExpr :: Sql DBType a => Aggregator1 (Expr a) (Expr (NonEmpty a))
nonEmptyAggExpr :: forall a. Sql DBType a => Aggregator1 (Expr a) (Expr (NonEmpty a))
nonEmptyAggExpr = TypeInformation (Unnullify' (IsMaybe a) a)
-> Aggregator1 (Expr a) (Expr (NonEmpty a))
forall a.
TypeInformation (Unnullify a)
-> Aggregator1 (Expr a) (Expr (NonEmpty a))
snonEmptyAggExpr TypeInformation (Unnullify' (IsMaybe a) a)
forall a. DBType a => TypeInformation a
typeInformation


-- | Applies 'nonEmptyAggExpr' to the column selected by the given function.
nonEmptyAggExprOn :: Sql DBType a
  => (i -> Expr a) -> Aggregator1 i (Expr (NonEmpty a))
nonEmptyAggExprOn :: forall a i.
Sql DBType a =>
(i -> Expr a) -> Aggregator1 i (Expr (NonEmpty a))
nonEmptyAggExprOn i -> Expr a
f = (i -> Expr a)
-> Aggregator' 'Semi (Expr a) (Expr (NonEmpty a))
-> Aggregator' 'Semi i (Expr (NonEmpty a))
forall a b c.
(a -> b) -> Aggregator' 'Semi b c -> Aggregator' 'Semi a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr a
f Aggregator' 'Semi (Expr a) (Expr (NonEmpty a))
forall a. Sql DBType a => Aggregator1 (Expr a) (Expr (NonEmpty a))
nonEmptyAggExpr


-- | Concatenate lists into a single list.
listCatExpr :: Sql DBType a => Aggregator' fold (Expr [a]) (Expr [a])
listCatExpr :: forall a (fold :: Fold).
Sql DBType a =>
Aggregator' fold (Expr [a]) (Expr [a])
listCatExpr = TypeInformation (Unnullify' (IsMaybe a) a)
-> Aggregator' fold (Expr [a]) (Expr [a])
forall a (fold :: Fold).
TypeInformation (Unnullify a)
-> Aggregator' fold (Expr [a]) (Expr [a])
slistCatExpr TypeInformation (Unnullify' (IsMaybe a) a)
forall a. DBType a => TypeInformation a
typeInformation


-- | Applies 'listCatExpr' to the column selected by the given function.
listCatExprOn :: Sql DBType a
  => (i -> Expr [a]) -> Aggregator' fold i (Expr [a])
listCatExprOn :: forall a i (fold :: Fold).
Sql DBType a =>
(i -> Expr [a]) -> Aggregator' fold i (Expr [a])
listCatExprOn i -> Expr [a]
f = (i -> Expr [a])
-> Aggregator' fold (Expr [a]) (Expr [a])
-> Aggregator' fold i (Expr [a])
forall a b c.
(a -> b) -> Aggregator' fold b c -> Aggregator' fold a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr [a]
f Aggregator' fold (Expr [a]) (Expr [a])
forall a (fold :: Fold).
Sql DBType a =>
Aggregator' fold (Expr [a]) (Expr [a])
listCatExpr


-- | Concatenate non-empty lists into a single non-empty list.
nonEmptyCatExpr :: Sql DBType a
  => Aggregator1 (Expr (NonEmpty a)) (Expr (NonEmpty a))
nonEmptyCatExpr :: forall a.
Sql DBType a =>
Aggregator1 (Expr (NonEmpty a)) (Expr (NonEmpty a))
nonEmptyCatExpr = TypeInformation (Unnullify' (IsMaybe a) a)
-> Aggregator1 (Expr (NonEmpty a)) (Expr (NonEmpty a))
forall a.
TypeInformation (Unnullify a)
-> Aggregator1 (Expr (NonEmpty a)) (Expr (NonEmpty a))
snonEmptyCatExpr TypeInformation (Unnullify' (IsMaybe a) a)
forall a. DBType a => TypeInformation a
typeInformation


-- | Applies 'nonEmptyCatExpr' to the column selected by the given function.
nonEmptyCatExprOn :: Sql DBType a
  => (i -> Expr (NonEmpty a)) -> Aggregator1 i (Expr (NonEmpty a))
nonEmptyCatExprOn :: forall a i.
Sql DBType a =>
(i -> Expr (NonEmpty a)) -> Aggregator1 i (Expr (NonEmpty a))
nonEmptyCatExprOn i -> Expr (NonEmpty a)
f = (i -> Expr (NonEmpty a))
-> Aggregator' 'Semi (Expr (NonEmpty a)) (Expr (NonEmpty a))
-> Aggregator' 'Semi i (Expr (NonEmpty a))
forall a b c.
(a -> b) -> Aggregator' 'Semi b c -> Aggregator' 'Semi a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap i -> Expr (NonEmpty a)
f Aggregator' 'Semi (Expr (NonEmpty a)) (Expr (NonEmpty a))
forall a.
Sql DBType a =>
Aggregator1 (Expr (NonEmpty a)) (Expr (NonEmpty a))
nonEmptyCatExpr


-- | 'distinctAggregate' modifies an 'Aggregator' to consider only distinct
-- values of each particular column. Note that this "distinction" only happens
-- within each column individually, not across all columns simultaneously.
distinctAggregate :: Aggregator' fold i a -> Aggregator' fold i a
distinctAggregate :: forall (fold :: Fold) i a.
Aggregator' fold i a -> Aggregator' fold i a
distinctAggregate (Aggregator Fallback fold a
fallback Aggregator i a
a) =
  Fallback fold a -> Aggregator i a -> Aggregator' fold i a
forall (fold :: Fold) i a.
Fallback fold a -> Aggregator i a -> Aggregator' fold i a
Aggregator Fallback fold a
fallback (Aggregator i a -> Aggregator i a
forall a b. Aggregator a b -> Aggregator a b
Opaleye.distinctAggregator Aggregator i a
a)


slistAggExpr :: ()
  => TypeInformation (Unnullify a) -> Aggregator' fold (Expr a) (Expr [a])
slistAggExpr :: forall a (fold :: Fold).
TypeInformation (Unnullify a)
-> Aggregator' fold (Expr a) (Expr [a])
slistAggExpr TypeInformation (Unnullify a)
info =
  (Expr a -> Field_ 'NonNullable Any)
-> (Field_ 'NonNullable (SqlArray Any) -> Expr [a])
-> Fallback fold (Expr [a])
-> Aggregator
     (Field_ 'NonNullable Any) (Field_ 'NonNullable (SqlArray Any))
-> Aggregator' fold (Expr a) (Expr [a])
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    (PrimExpr -> Field_ 'NonNullable Any
forall (n :: Nullability) b. PrimExpr -> Field_ n b
toColumn (PrimExpr -> Field_ 'NonNullable Any)
-> (Expr a -> PrimExpr) -> Expr a -> Field_ 'NonNullable Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TypeInformation (Unnullify a) -> PrimExpr -> PrimExpr
forall a. TypeInformation a -> PrimExpr -> PrimExpr
encodeArrayElement TypeInformation (Unnullify a)
info (PrimExpr -> PrimExpr)
-> (Expr a -> PrimExpr) -> Expr a -> PrimExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr a -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr)
    (PrimExpr -> Expr [a]
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr [a])
-> (Field_ 'NonNullable (SqlArray Any) -> PrimExpr)
-> Field_ 'NonNullable (SqlArray Any)
-> Expr [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ 'NonNullable (SqlArray Any) -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    (Expr [a] -> Fallback fold (Expr [a])
forall a (fold :: Fold). a -> Fallback fold a
Fallback (TypeInformation (Unnullify a) -> Expr [a]
forall a. TypeInformation (Unnullify a) -> Expr [a]
sempty TypeInformation (Unnullify a)
info))
    Aggregator
  (Field_ 'NonNullable Any) (Field_ 'NonNullable (SqlArray Any))
forall a. Aggregator (Field a) (Field (SqlArray a))
Opaleye.arrayAgg


snonEmptyAggExpr :: ()
  => TypeInformation (Unnullify a) -> Aggregator1 (Expr a) (Expr (NonEmpty a))
snonEmptyAggExpr :: forall a.
TypeInformation (Unnullify a)
-> Aggregator1 (Expr a) (Expr (NonEmpty a))
snonEmptyAggExpr TypeInformation (Unnullify a)
info =
  (Expr a -> Field_ 'NonNullable Any)
-> (Field_ 'NonNullable (SqlArray Any) -> Expr (NonEmpty a))
-> Fallback 'Semi (Expr (NonEmpty a))
-> Aggregator
     (Field_ 'NonNullable Any) (Field_ 'NonNullable (SqlArray Any))
-> Aggregator' 'Semi (Expr a) (Expr (NonEmpty a))
forall i o (fold :: Fold) i' o'.
(i -> i')
-> (o' -> o)
-> Fallback fold o
-> Aggregator i' o'
-> Aggregator' fold i o
unsafeMakeAggregator
    (PrimExpr -> Field_ 'NonNullable Any
forall (n :: Nullability) b. PrimExpr -> Field_ n b
toColumn (PrimExpr -> Field_ 'NonNullable Any)
-> (Expr a -> PrimExpr) -> Expr a -> Field_ 'NonNullable Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TypeInformation (Unnullify a) -> PrimExpr -> PrimExpr
forall a. TypeInformation a -> PrimExpr -> PrimExpr
encodeArrayElement TypeInformation (Unnullify a)
info (PrimExpr -> PrimExpr)
-> (Expr a -> PrimExpr) -> Expr a -> PrimExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr a -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr)
    (PrimExpr -> Expr (NonEmpty a)
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr (NonEmpty a))
-> (Field_ 'NonNullable (SqlArray Any) -> PrimExpr)
-> Field_ 'NonNullable (SqlArray Any)
-> Expr (NonEmpty a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ 'NonNullable (SqlArray Any) -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
    Fallback 'Semi (Expr (NonEmpty a))
forall a. Fallback 'Semi a
Empty
    Aggregator
  (Field_ 'NonNullable Any) (Field_ 'NonNullable (SqlArray Any))
forall a. Aggregator (Field a) (Field (SqlArray a))
Opaleye.arrayAgg


slistCatExpr :: ()
  => TypeInformation (Unnullify a) -> Aggregator' fold (Expr [a]) (Expr [a])
slistCatExpr :: forall a (fold :: Fold).
TypeInformation (Unnullify a)
-> Aggregator' fold (Expr [a]) (Expr [a])
slistCatExpr TypeInformation (Unnullify a)
info = (Expr [a] -> Expr Text)
-> (Expr Text -> Expr [a])
-> Aggregator' fold (Expr Text) (Expr Text)
-> Aggregator' fold (Expr [a]) (Expr [a])
forall a b c d.
(a -> b)
-> (c -> d) -> Aggregator' fold b c -> Aggregator' fold a d
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap (Expr Text -> Expr Text
unbracket (Expr Text -> Expr Text)
-> (Expr [a] -> Expr Text) -> Expr [a] -> Expr Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr [a] -> Expr Text
forall a. Expr a -> Expr Text
show) (TypeName -> Expr Text -> Expr [a]
forall a. TypeName -> Expr Text -> Expr a
sread TypeName
name (Expr Text -> Expr [a])
-> (Expr Text -> Expr Text) -> Expr Text -> Expr [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr Text -> Expr Text
forall {a}. (Semigroup a, IsString a) => a -> a
bracket) Aggregator' fold (Expr Text) (Expr Text)
forall {fold :: Fold}. Aggregator' fold (Expr Text) (Expr Text)
agg
  where
    bracket :: a -> a
bracket a
a = a
"{" a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
a a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
"}"
    unbracket :: Expr Text -> Expr Text
unbracket Expr Text
a = Expr Text -> Expr Int32 -> Maybe (Expr Int32) -> Expr Text
Text.substr Expr Text
a Expr Int32
2 (Expr Int32 -> Maybe (Expr Int32)
forall a. a -> Maybe a
Just (Expr Text -> Expr Int32
Text.length Expr Text
a Expr Int32 -> Expr Int32 -> Expr Int32
forall a. Num a => a -> a -> a
- Expr Int32
2))
    agg :: Aggregator' fold (Expr Text) (Expr Text)
agg = IfPP (Expr Text) (Expr Text)
-> (Expr Text -> Expr Bool)
-> Aggregator (Expr Text) (Expr Text)
-> Aggregator' fold (Expr Text) (Expr Text)
forall a i (fold :: Fold).
IfPP a a
-> (i -> Expr Bool) -> Aggregator i a -> Aggregator' fold i a
filterWhereExplicit IfPP (Expr Text) (Expr Text)
forall a. IfPP (Expr a) (Expr a)
ifPP (Expr Text -> Expr Text -> Expr Bool
forall a. Sql DBEq a => Expr a -> Expr a -> Expr Bool
/=. Expr Text
"") (Expr Text -> Aggregator (Expr Text) (Expr Text)
forall a (fold :: Fold).
(Sql IsString a, Sql DBString a) =>
Expr a -> Aggregator' fold (Expr a) (Expr a)
stringAgg Expr Text
",")
    name :: TypeName
name = TypeInformation (Unnullify a) -> TypeName
forall a. TypeInformation a -> TypeName
arrayTypeName TypeInformation (Unnullify a)
info


snonEmptyCatExpr :: ()
  => TypeInformation (Unnullify a)
  -> Aggregator1 (Expr (NonEmpty a)) (Expr (NonEmpty a))
snonEmptyCatExpr :: forall a.
TypeInformation (Unnullify a)
-> Aggregator1 (Expr (NonEmpty a)) (Expr (NonEmpty a))
snonEmptyCatExpr TypeInformation (Unnullify a)
info = (Expr (NonEmpty a) -> Expr Text)
-> (Expr Text -> Expr (NonEmpty a))
-> Aggregator' 'Semi (Expr Text) (Expr Text)
-> Aggregator' 'Semi (Expr (NonEmpty a)) (Expr (NonEmpty a))
forall a b c d.
(a -> b)
-> (c -> d) -> Aggregator' 'Semi b c -> Aggregator' 'Semi a d
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap (Expr Text -> Expr Text
unbracket (Expr Text -> Expr Text)
-> (Expr (NonEmpty a) -> Expr Text)
-> Expr (NonEmpty a)
-> Expr Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr (NonEmpty a) -> Expr Text
forall a. Expr a -> Expr Text
show) (TypeName -> Expr Text -> Expr (NonEmpty a)
forall a. TypeName -> Expr Text -> Expr a
sread TypeName
name (Expr Text -> Expr (NonEmpty a))
-> (Expr Text -> Expr Text) -> Expr Text -> Expr (NonEmpty a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr Text -> Expr Text
forall {a}. (Semigroup a, IsString a) => a -> a
bracket) Aggregator' 'Semi (Expr Text) (Expr Text)
forall {fold :: Fold}. Aggregator' fold (Expr Text) (Expr Text)
agg
  where
    bracket :: a -> a
bracket a
a = a
"{" a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
a a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
"}"
    unbracket :: Expr Text -> Expr Text
unbracket Expr Text
a = Expr Text -> Expr Int32 -> Maybe (Expr Int32) -> Expr Text
Text.substr Expr Text
a Expr Int32
2 (Expr Int32 -> Maybe (Expr Int32)
forall a. a -> Maybe a
Just (Expr Text -> Expr Int32
Text.length Expr Text
a Expr Int32 -> Expr Int32 -> Expr Int32
forall a. Num a => a -> a -> a
- Expr Int32
2))
    agg :: Aggregator' fold (Expr Text) (Expr Text)
agg = IfPP (Expr Text) (Expr Text)
-> (Expr Text -> Expr Bool)
-> Aggregator (Expr Text) (Expr Text)
-> Aggregator' fold (Expr Text) (Expr Text)
forall a i (fold :: Fold).
IfPP a a
-> (i -> Expr Bool) -> Aggregator i a -> Aggregator' fold i a
filterWhereExplicit IfPP (Expr Text) (Expr Text)
forall a. IfPP (Expr a) (Expr a)
ifPP (Expr Text -> Expr Text -> Expr Bool
forall a. Sql DBEq a => Expr a -> Expr a -> Expr Bool
/=. Expr Text
"") (Expr Text -> Aggregator (Expr Text) (Expr Text)
forall a (fold :: Fold).
(Sql IsString a, Sql DBString a) =>
Expr a -> Aggregator' fold (Expr a) (Expr a)
stringAgg Expr Text
",")
    name :: TypeName
name = TypeInformation (Unnullify a) -> TypeName
forall a. TypeInformation a -> TypeName
arrayTypeName TypeInformation (Unnullify a)
info


ifPP :: Opaleye.IfPP (Expr a) (Expr a)
ifPP :: forall a. IfPP (Expr a) (Expr a)
ifPP = (Expr a -> Field_ Any Any)
-> (Field_ Any Any -> Expr a)
-> IfPP (Field_ Any Any) (Field_ Any Any)
-> IfPP (Expr a) (Expr a)
forall a b c d. (a -> b) -> (c -> d) -> IfPP b c -> IfPP a d
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap Expr a -> Field_ Any Any
forall {a} {n :: Nullability} {b}. Expr a -> Field_ n b
from Field_ Any Any -> Expr a
forall {n :: Nullability} {b} {a}. Field_ n b -> Expr a
to IfPP (Field_ Any Any) (Field_ Any Any)
forall (n :: Nullability) a. IfPP (Field_ n a) (Field_ n a)
Opaleye.ifPPField
  where
    from :: Expr a -> Field_ n b
from = PrimExpr -> Field_ n b
forall (n :: Nullability) b. PrimExpr -> Field_ n b
toColumn (PrimExpr -> Field_ n b)
-> (Expr a -> PrimExpr) -> Expr a -> Field_ n b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr a -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr
    to :: Field_ n b -> Expr a
to = PrimExpr -> Expr a
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr a)
-> (Field_ n b -> PrimExpr) -> Field_ n b -> Expr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ n b -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn