module Database.Relational.ProjectableExtended (
ProjectableFlattenMaybe (flatten),
flattenPiMaybe,
(!), (?!), (?!?), (!??),
unsafeAggregateOp,
count,
sum', sumMaybe, avg, avgMaybe,
max', maxMaybe, min', minMaybe,
every, any', some',
) where
import Prelude hiding (pi)
import qualified Language.SQL.Keyword as SQL
import Database.Record (PersistableWidth)
import Database.Relational.Internal.ContextType (Flat, Aggregated, OverWindow)
import Database.Relational.SqlSyntax (Predicate, Record, )
import qualified Database.Relational.Record as Record
import Database.Relational.Projectable
(unsafeUniOp, ProjectableMaybe (flattenMaybe), SqlContext)
import Database.Relational.Pi (Pi)
class AggregatedContext ac
instance AggregatedContext Aggregated
instance AggregatedContext OverWindow
unsafeAggregateOp :: (AggregatedContext ac, SqlContext ac)
=> SQL.Keyword -> Record Flat a -> Record ac b
unsafeAggregateOp op = unsafeUniOp ((op SQL.<++>) . SQL.paren)
count :: (Integral b, AggregatedContext ac, SqlContext ac)
=> Record Flat a -> Record ac b
count = unsafeAggregateOp SQL.COUNT
sumMaybe :: (Num a, AggregatedContext ac, SqlContext ac)
=> Record Flat (Maybe a) -> Record ac (Maybe a)
sumMaybe = unsafeAggregateOp SQL.SUM
sum' :: (Num a, AggregatedContext ac, SqlContext ac)
=> Record Flat a -> Record ac (Maybe a)
sum' = sumMaybe . Record.just
avgMaybe :: (Num a, Fractional b, AggregatedContext ac, SqlContext ac)
=> Record Flat (Maybe a) -> Record ac (Maybe b)
avgMaybe = unsafeAggregateOp SQL.AVG
avg :: (Num a, Fractional b, AggregatedContext ac, SqlContext ac)
=> Record Flat a -> Record ac (Maybe b)
avg = avgMaybe . Record.just
maxMaybe :: (Ord a, AggregatedContext ac, SqlContext ac)
=> Record Flat (Maybe a) -> Record ac (Maybe a)
maxMaybe = unsafeAggregateOp SQL.MAX
max' :: (Ord a, AggregatedContext ac, SqlContext ac)
=> Record Flat a -> Record ac (Maybe a)
max' = maxMaybe . Record.just
minMaybe :: (Ord a, AggregatedContext ac, SqlContext ac)
=> Record Flat (Maybe a) -> Record ac (Maybe a)
minMaybe = unsafeAggregateOp SQL.MIN
min' :: (Ord a, AggregatedContext ac, SqlContext ac)
=> Record Flat a -> Record ac (Maybe a)
min' = minMaybe . Record.just
every :: (AggregatedContext ac, SqlContext ac)
=> Predicate Flat -> Record ac (Maybe Bool)
every = unsafeAggregateOp SQL.EVERY
any' :: (AggregatedContext ac, SqlContext ac)
=> Predicate Flat -> Record ac (Maybe Bool)
any' = unsafeAggregateOp SQL.ANY
some' :: (AggregatedContext ac, SqlContext ac)
=> Predicate Flat -> Record ac (Maybe Bool)
some' = unsafeAggregateOp SQL.SOME
(!) :: PersistableWidth a
=> Record c a
-> Pi a b
-> Record c b
(!) = Record.pi
(?!) :: PersistableWidth a
=> Record c (Maybe a)
-> Pi a b
-> Record c (Maybe b)
(?!) = Record.piMaybe
(?!?) :: PersistableWidth a
=> Record c (Maybe a)
-> Pi a (Maybe b)
-> Record c (Maybe b)
(?!?) = Record.piMaybe'
class ProjectableFlattenMaybe a b where
flatten :: ProjectableMaybe p => p a -> p b
instance ProjectableFlattenMaybe (Maybe a) b
=> ProjectableFlattenMaybe (Maybe (Maybe a)) b where
flatten = flatten . flattenMaybe
instance ProjectableFlattenMaybe (Maybe a) (Maybe a) where
flatten = id
flattenPiMaybe :: (PersistableWidth a, ProjectableMaybe (Record cont), ProjectableFlattenMaybe (Maybe b) c)
=> Record cont (Maybe a)
-> Pi a b
-> Record cont c
flattenPiMaybe p = flatten . Record.piMaybe p
(!??) :: (PersistableWidth a, ProjectableMaybe (Record cont), ProjectableFlattenMaybe (Maybe b) c)
=> Record cont (Maybe a)
-> Pi a b
-> Record cont c
(!??) = flattenPiMaybe
infixl 8 !, ?!, ?!?, !??