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 op :: SetOp
op = BinOp -> SubQuery -> SubQuery -> SubQuery
Bin (BinOp -> SubQuery -> SubQuery -> SubQuery)
-> (Duplication -> BinOp)
-> Duplication
-> SubQuery
-> SubQuery
-> SubQuery
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SetOp, Duplication) -> BinOp
BinOp ((SetOp, Duplication) -> BinOp)
-> (Duplication -> (SetOp, Duplication)) -> Duplication -> 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 :: String -> [(Record c a, Record c b)] -> Record c b -> WhenClauses
whenClauses eTag :: String
eTag ws0 :: [(Record c a, Record c b)]
ws0 e :: Record c b
e = [(Record c a, Record c b)] -> WhenClauses
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 [] = String -> WhenClauses
forall a. HasCallStack => String -> a
error (String -> WhenClauses) -> String -> WhenClauses
forall a b. (a -> b) -> a -> b
$ String
eTag String -> String -> String
forall a. [a] -> [a] -> [a]
++ ": Empty when clauses!"
d ws :: [(Record c t, Record c t)]
ws@(_:_) =
[(Tuple, Tuple)] -> Tuple -> WhenClauses
WhenClauses [ (Record c t -> Tuple
forall c t. Record c t -> Tuple
untypeRecord Record c t
p, Record c t -> Tuple
forall c t. Record c t -> Tuple
untypeRecord Record c t
r) | (p :: Record c t
p, r :: Record c t
r) <- [(Record c t, Record c t)]
ws ]
(Tuple -> WhenClauses) -> Tuple -> WhenClauses
forall a b. (a -> b) -> a -> b
$ Record c b -> Tuple
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 :: [(Predicate c, Record c a)] -> Record c a -> Record c a
caseSearch ws :: [(Predicate c, Record c a)]
ws e :: Record c a
e =
Tuple -> Record c a
forall c t. Tuple -> Record c t
record [ CaseClause -> Int -> Column
Case CaseClause
c Int
i | Int
i <- [0 .. Record c a -> Int
forall c r. Record c r -> Int
recordWidth Record c a
e Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1] ]
where
c :: CaseClause
c = WhenClauses -> CaseClause
CaseSearch (WhenClauses -> CaseClause) -> WhenClauses -> CaseClause
forall a b. (a -> b) -> a -> b
$ String -> [(Predicate c, Record c a)] -> Record c a -> WhenClauses
forall c a b.
String -> [(Record c a, Record c b)] -> Record c b -> WhenClauses
whenClauses "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' :: Record c a
-> [(Record c a, Record c b)] -> Record c b -> Record c b
case' v :: Record c a
v ws :: [(Record c a, Record c b)]
ws e :: Record c b
e =
Tuple -> Record c b
forall c t. Tuple -> Record c t
record [ CaseClause -> Int -> Column
Case CaseClause
c Int
i | Int
i <- [0 .. Record c b -> Int
forall c r. Record c r -> Int
recordWidth Record c b
e Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1] ]
where
c :: CaseClause
c = Tuple -> WhenClauses -> CaseClause
CaseSimple (Record c a -> Tuple
forall c t. Record c t -> Tuple
untypeRecord Record c a
v) (WhenClauses -> CaseClause) -> WhenClauses -> CaseClause
forall a b. (a -> b) -> a -> b
$ String -> [(Record c a, Record c b)] -> Record c b -> WhenClauses
forall c a b.
String -> [(Record c a, Record c b)] -> Record c b -> WhenClauses
whenClauses "case'" [(Record c a, Record c b)]
ws Record c b
e