module Database.Relational.SqlSyntax.Query (
flatSubQuery, aggregatedSubQuery,
union, except, intersect,
caseSearch, case',
) where
import Database.Relational.Internal.Config (Config)
import Database.Relational.Internal.ContextType (Flat, Aggregated)
import Database.Relational.SqlSyntax.Types
(Duplication (..), SetOp (..), BinOp (..),
OrderingTerm, AggregateElem,
JoinProduct, Predicate, WhenClauses (..), CaseClause (..), SubQuery (..),
Column (..), Tuple, Record, record, untypeRecord, recordWidth, )
flatSubQuery :: Config
-> Tuple
-> Duplication
-> JoinProduct
-> [Predicate Flat]
-> [OrderingTerm]
-> SubQuery
flatSubQuery :: Config
-> Tuple
-> Duplication
-> JoinProduct
-> [Predicate Flat]
-> [OrderingTerm]
-> SubQuery
flatSubQuery = Config
-> Tuple
-> Duplication
-> JoinProduct
-> [Predicate Flat]
-> [OrderingTerm]
-> SubQuery
Flat
aggregatedSubQuery :: Config
-> Tuple
-> Duplication
-> JoinProduct
-> [Predicate Flat]
-> [AggregateElem]
-> [Predicate Aggregated]
-> [OrderingTerm]
-> SubQuery
aggregatedSubQuery :: Config
-> Tuple
-> Duplication
-> JoinProduct
-> [Predicate Flat]
-> [AggregateElem]
-> [Predicate Aggregated]
-> [OrderingTerm]
-> SubQuery
aggregatedSubQuery = Config
-> Tuple
-> Duplication
-> JoinProduct
-> [Predicate Flat]
-> [AggregateElem]
-> [Predicate Aggregated]
-> [OrderingTerm]
-> SubQuery
Aggregated
setBin :: SetOp -> Duplication -> SubQuery -> SubQuery -> SubQuery
setBin :: SetOp -> Duplication -> SubQuery -> SubQuery -> SubQuery
setBin SetOp
op = BinOp -> SubQuery -> SubQuery -> SubQuery
Bin forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SetOp, Duplication) -> BinOp
BinOp forall b c a. (b -> c) -> (a -> b) -> a -> c
. (,) SetOp
op
union :: Duplication -> SubQuery -> SubQuery -> SubQuery
union :: Duplication -> SubQuery -> SubQuery -> SubQuery
union = SetOp -> Duplication -> SubQuery -> SubQuery -> SubQuery
setBin SetOp
Union
except :: Duplication -> SubQuery -> SubQuery -> SubQuery
except :: Duplication -> SubQuery -> SubQuery -> SubQuery
except = SetOp -> Duplication -> SubQuery -> SubQuery -> SubQuery
setBin SetOp
Except
intersect :: Duplication -> SubQuery -> SubQuery -> SubQuery
intersect :: Duplication -> SubQuery -> SubQuery -> SubQuery
intersect = SetOp -> Duplication -> SubQuery -> SubQuery -> SubQuery
setBin SetOp
Intersect
whenClauses :: String
-> [(Record c a, Record c b)]
-> Record c b
-> WhenClauses
whenClauses :: forall c a b.
String -> [(Record c a, Record c b)] -> Record c b -> WhenClauses
whenClauses String
eTag [(Record c a, Record c b)]
ws0 Record c b
e = forall {c} {t} {c} {t}. [(Record c t, Record c t)] -> WhenClauses
d [(Record c a, Record c b)]
ws0
where
d :: [(Record c t, Record c t)] -> WhenClauses
d [] = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
eTag forall a. [a] -> [a] -> [a]
++ String
": Empty when clauses!"
d ws :: [(Record c t, Record c t)]
ws@((Record c t, Record c t)
_:[(Record c t, Record c t)]
_) =
[(Tuple, Tuple)] -> Tuple -> WhenClauses
WhenClauses [ (forall c t. Record c t -> Tuple
untypeRecord Record c t
p, forall c t. Record c t -> Tuple
untypeRecord Record c t
r) | (Record c t
p, Record c t
r) <- [(Record c t, Record c t)]
ws ]
forall a b. (a -> b) -> a -> b
$ forall c t. Record c t -> Tuple
untypeRecord Record c b
e
caseSearch :: [(Predicate c, Record c a)]
-> Record c a
-> Record c a
caseSearch :: forall c a. [(Predicate c, Record c a)] -> Record c a -> Record c a
caseSearch [(Predicate c, Record c a)]
ws Record c a
e =
forall c t. Tuple -> Record c t
record [ CaseClause -> Int -> Column
Case CaseClause
c Int
i | Int
i <- [Int
0 .. forall c r. Record c r -> Int
recordWidth Record c a
e forall a. Num a => a -> a -> a
- Int
1] ]
where
c :: CaseClause
c = WhenClauses -> CaseClause
CaseSearch forall a b. (a -> b) -> a -> b
$ forall c a b.
String -> [(Record c a, Record c b)] -> Record c b -> WhenClauses
whenClauses String
"caseSearch" [(Predicate c, Record c a)]
ws Record c a
e
case' :: Record c a
-> [(Record c a, Record c b)]
-> Record c b
-> Record c b
case' :: forall c a b.
Record c a
-> [(Record c a, Record c b)] -> Record c b -> Record c b
case' Record c a
v [(Record c a, Record c b)]
ws Record c b
e =
forall c t. Tuple -> Record c t
record [ CaseClause -> Int -> Column
Case CaseClause
c Int
i | Int
i <- [Int
0 .. forall c r. Record c r -> Int
recordWidth Record c b
e forall a. Num a => a -> a -> a
- Int
1] ]
where
c :: CaseClause
c = Tuple -> WhenClauses -> CaseClause
CaseSimple (forall c t. Record c t -> Tuple
untypeRecord Record c a
v) forall a b. (a -> b) -> a -> b
$ forall c a b.
String -> [(Record c a, Record c b)] -> Record c b -> WhenClauses
whenClauses String
"case'" [(Record c a, Record c b)]
ws Record c b
e