{-# LANGUAGE LambdaCase #-}
module Opaleye.Internal.PrimQuery where
import Prelude hiding (product)
import qualified Data.List.NonEmpty as NEL
import Data.Semigroup (Semigroup, (<>))
import qualified Opaleye.Internal.HaskellDB.Sql as HSql
import qualified Opaleye.Internal.HaskellDB.PrimQuery as HPQ
import Opaleye.Internal.HaskellDB.PrimQuery (Symbol)
data LimitOp = LimitOp Int | OffsetOp Int | LimitOffsetOp Int Int
deriving Int -> LimitOp -> ShowS
[LimitOp] -> ShowS
LimitOp -> String
(Int -> LimitOp -> ShowS)
-> (LimitOp -> String) -> ([LimitOp] -> ShowS) -> Show LimitOp
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [LimitOp] -> ShowS
$cshowList :: [LimitOp] -> ShowS
show :: LimitOp -> String
$cshow :: LimitOp -> String
showsPrec :: Int -> LimitOp -> ShowS
$cshowsPrec :: Int -> LimitOp -> ShowS
Show
data BinOp = Except
| ExceptAll
| Union
| UnionAll
| Intersect
| IntersectAll
deriving Int -> BinOp -> ShowS
[BinOp] -> ShowS
BinOp -> String
(Int -> BinOp -> ShowS)
-> (BinOp -> String) -> ([BinOp] -> ShowS) -> Show BinOp
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [BinOp] -> ShowS
$cshowList :: [BinOp] -> ShowS
show :: BinOp -> String
$cshow :: BinOp -> String
showsPrec :: Int -> BinOp -> ShowS
$cshowsPrec :: Int -> BinOp -> ShowS
Show
data JoinType = LeftJoin | RightJoin | FullJoin deriving Int -> JoinType -> ShowS
[JoinType] -> ShowS
JoinType -> String
(Int -> JoinType -> ShowS)
-> (JoinType -> String) -> ([JoinType] -> ShowS) -> Show JoinType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [JoinType] -> ShowS
$cshowList :: [JoinType] -> ShowS
show :: JoinType -> String
$cshow :: JoinType -> String
showsPrec :: Int -> JoinType -> ShowS
$cshowsPrec :: Int -> JoinType -> ShowS
Show
data SemijoinType = Semi | Anti deriving Int -> SemijoinType -> ShowS
[SemijoinType] -> ShowS
SemijoinType -> String
(Int -> SemijoinType -> ShowS)
-> (SemijoinType -> String)
-> ([SemijoinType] -> ShowS)
-> Show SemijoinType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SemijoinType] -> ShowS
$cshowList :: [SemijoinType] -> ShowS
show :: SemijoinType -> String
$cshow :: SemijoinType -> String
showsPrec :: Int -> SemijoinType -> ShowS
$cshowsPrec :: Int -> SemijoinType -> ShowS
Show
data TableIdentifier = TableIdentifier
{ TableIdentifier -> Maybe String
tiSchemaName :: Maybe String
, TableIdentifier -> String
tiTableName :: String
} deriving Int -> TableIdentifier -> ShowS
[TableIdentifier] -> ShowS
TableIdentifier -> String
(Int -> TableIdentifier -> ShowS)
-> (TableIdentifier -> String)
-> ([TableIdentifier] -> ShowS)
-> Show TableIdentifier
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TableIdentifier] -> ShowS
$cshowList :: [TableIdentifier] -> ShowS
show :: TableIdentifier -> String
$cshow :: TableIdentifier -> String
showsPrec :: Int -> TableIdentifier -> ShowS
$cshowsPrec :: Int -> TableIdentifier -> ShowS
Show
tiToSqlTable :: TableIdentifier -> HSql.SqlTable
tiToSqlTable :: TableIdentifier -> SqlTable
tiToSqlTable TableIdentifier
ti = SqlTable :: Maybe String -> String -> SqlTable
HSql.SqlTable { sqlTableSchemaName :: Maybe String
HSql.sqlTableSchemaName = TableIdentifier -> Maybe String
tiSchemaName TableIdentifier
ti
, sqlTableName :: String
HSql.sqlTableName = TableIdentifier -> String
tiTableName TableIdentifier
ti }
type Bindings a = [(Symbol, a)]
data Lateral = NonLateral | Lateral
deriving Int -> Lateral -> ShowS
[Lateral] -> ShowS
Lateral -> String
(Int -> Lateral -> ShowS)
-> (Lateral -> String) -> ([Lateral] -> ShowS) -> Show Lateral
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Lateral] -> ShowS
$cshowList :: [Lateral] -> ShowS
show :: Lateral -> String
$cshow :: Lateral -> String
showsPrec :: Int -> Lateral -> ShowS
$cshowsPrec :: Int -> Lateral -> ShowS
Show
instance Semigroup Lateral where
Lateral
NonLateral <> :: Lateral -> Lateral -> Lateral
<> Lateral
NonLateral = Lateral
NonLateral
Lateral
_ <> Lateral
_ = Lateral
Lateral
instance Monoid Lateral where
mappend :: Lateral -> Lateral -> Lateral
mappend = Lateral -> Lateral -> Lateral
forall a. Semigroup a => a -> a -> a
(<>)
mempty :: Lateral
mempty = Lateral
NonLateral
data Recursive = NonRecursive | Recursive
deriving Int -> Recursive -> ShowS
[Recursive] -> ShowS
Recursive -> String
(Int -> Recursive -> ShowS)
-> (Recursive -> String)
-> ([Recursive] -> ShowS)
-> Show Recursive
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Recursive] -> ShowS
$cshowList :: [Recursive] -> ShowS
show :: Recursive -> String
$cshow :: Recursive -> String
showsPrec :: Int -> Recursive -> ShowS
$cshowsPrec :: Int -> Recursive -> ShowS
Show
aLeftJoin :: HPQ.PrimExpr -> PrimQuery -> PrimQueryArr
aLeftJoin :: PrimExpr -> PrimQuery -> PrimQueryArr
aLeftJoin PrimExpr
cond PrimQuery
primQuery' = (Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr
PrimQueryArr ((Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr)
-> (Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr
forall a b. (a -> b) -> a -> b
$ \Lateral
lat PrimQuery
primQueryL ->
JoinType
-> PrimExpr
-> (Lateral, PrimQuery)
-> (Lateral, PrimQuery)
-> PrimQuery
forall a.
JoinType
-> PrimExpr
-> (Lateral, PrimQuery' a)
-> (Lateral, PrimQuery' a)
-> PrimQuery' a
Join JoinType
LeftJoin PrimExpr
cond (Lateral
NonLateral, PrimQuery
primQueryL) (Lateral
lat, PrimQuery
primQuery')
aProduct :: PrimQuery -> PrimQueryArr
aProduct :: PrimQuery -> PrimQueryArr
aProduct PrimQuery
pq = (Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr
PrimQueryArr (\Lateral
lat PrimQuery
primQuery -> Lateral -> PrimQuery -> PrimQuery -> PrimQuery
times Lateral
lat PrimQuery
primQuery PrimQuery
pq)
aSemijoin :: SemijoinType -> PrimQuery -> PrimQueryArr
aSemijoin :: SemijoinType -> PrimQuery -> PrimQueryArr
aSemijoin SemijoinType
joint PrimQuery
existsQ = (Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr
PrimQueryArr ((Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr)
-> (Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr
forall a b. (a -> b) -> a -> b
$ \Lateral
_ PrimQuery
primQ -> SemijoinType -> PrimQuery -> PrimQuery -> PrimQuery
forall a.
SemijoinType -> PrimQuery' a -> PrimQuery' a -> PrimQuery' a
Semijoin SemijoinType
joint PrimQuery
primQ PrimQuery
existsQ
aRebind :: Bindings HPQ.PrimExpr -> PrimQueryArr
aRebind :: Bindings PrimExpr -> PrimQueryArr
aRebind Bindings PrimExpr
bindings = (Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr
PrimQueryArr ((Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr)
-> (Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr
forall a b. (a -> b) -> a -> b
$ \Lateral
_ -> Bool -> Bindings PrimExpr -> PrimQuery -> PrimQuery
forall a. Bool -> Bindings PrimExpr -> PrimQuery' a -> PrimQuery' a
Rebind Bool
True Bindings PrimExpr
bindings
aRestrict :: HPQ.PrimExpr -> PrimQueryArr
aRestrict :: PrimExpr -> PrimQueryArr
aRestrict PrimExpr
predicate = (Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr
PrimQueryArr ((Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr)
-> (Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr
forall a b. (a -> b) -> a -> b
$ \Lateral
_ -> PrimExpr -> PrimQuery -> PrimQuery
restrict PrimExpr
predicate
aLabel :: String -> PrimQueryArr
aLabel :: String -> PrimQueryArr
aLabel String
l = (Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr
PrimQueryArr ((Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr)
-> (Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr
forall a b. (a -> b) -> a -> b
$ \Lateral
_ PrimQuery
primQ -> String -> PrimQuery -> PrimQuery
forall a. String -> PrimQuery' a -> PrimQuery' a
Label String
l PrimQuery
primQ
newtype PrimQueryArr =
PrimQueryArr { PrimQueryArr -> Lateral -> PrimQuery -> PrimQuery
runPrimQueryArr :: Lateral -> PrimQuery -> PrimQuery }
instance Semigroup PrimQueryArr where
PrimQueryArr Lateral -> PrimQuery -> PrimQuery
f1 <> :: PrimQueryArr -> PrimQueryArr -> PrimQueryArr
<> PrimQueryArr Lateral -> PrimQuery -> PrimQuery
f2 = (Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr
PrimQueryArr (\Lateral
lat -> Lateral -> PrimQuery -> PrimQuery
f2 Lateral
lat (PrimQuery -> PrimQuery)
-> (PrimQuery -> PrimQuery) -> PrimQuery -> PrimQuery
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Lateral -> PrimQuery -> PrimQuery
f1 Lateral
lat)
instance Monoid PrimQueryArr where
mappend :: PrimQueryArr -> PrimQueryArr -> PrimQueryArr
mappend = PrimQueryArr -> PrimQueryArr -> PrimQueryArr
forall a. Semigroup a => a -> a -> a
(<>)
mempty :: PrimQueryArr
mempty = (Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr
PrimQueryArr (\Lateral
_ -> PrimQuery -> PrimQuery
forall a. a -> a
id)
lateral :: PrimQueryArr -> PrimQueryArr
lateral :: PrimQueryArr -> PrimQueryArr
lateral (PrimQueryArr Lateral -> PrimQuery -> PrimQuery
pq) = (Lateral -> PrimQuery -> PrimQuery) -> PrimQueryArr
PrimQueryArr (\Lateral
_ -> Lateral -> PrimQuery -> PrimQuery
pq Lateral
Lateral)
toPrimQuery :: PrimQueryArr -> PrimQuery
toPrimQuery :: PrimQueryArr -> PrimQuery
toPrimQuery (PrimQueryArr Lateral -> PrimQuery -> PrimQuery
f) = Lateral -> PrimQuery -> PrimQuery
f Lateral
NonLateral PrimQuery
forall a. PrimQuery' a
Unit
data PrimQuery' a = Unit
| Empty a
| BaseTable TableIdentifier (Bindings HPQ.PrimExpr)
| Product (NEL.NonEmpty (Lateral, PrimQuery' a)) [HPQ.PrimExpr]
| Aggregate (Bindings (Maybe (HPQ.AggrOp,
[HPQ.OrderExpr],
HPQ.AggrDistinct),
HPQ.Symbol))
(PrimQuery' a)
| DistinctOnOrderBy (Maybe (NEL.NonEmpty HPQ.PrimExpr))
[HPQ.OrderExpr]
(PrimQuery' a)
| Limit LimitOp (PrimQuery' a)
| Join JoinType
HPQ.PrimExpr
(Lateral, PrimQuery' a)
(Lateral, PrimQuery' a)
| Semijoin SemijoinType (PrimQuery' a) (PrimQuery' a)
| Exists Symbol (PrimQuery' a)
| Values [Symbol] (NEL.NonEmpty [HPQ.PrimExpr])
| Binary BinOp
(PrimQuery' a, PrimQuery' a)
| Label String (PrimQuery' a)
| RelExpr HPQ.PrimExpr (Bindings HPQ.PrimExpr)
| Rebind Bool
(Bindings HPQ.PrimExpr)
(PrimQuery' a)
| ForUpdate (PrimQuery' a)
| With Recursive Symbol [Symbol] (PrimQuery' a) (PrimQuery' a)
deriving Int -> PrimQuery' a -> ShowS
[PrimQuery' a] -> ShowS
PrimQuery' a -> String
(Int -> PrimQuery' a -> ShowS)
-> (PrimQuery' a -> String)
-> ([PrimQuery' a] -> ShowS)
-> Show (PrimQuery' a)
forall a. Show a => Int -> PrimQuery' a -> ShowS
forall a. Show a => [PrimQuery' a] -> ShowS
forall a. Show a => PrimQuery' a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PrimQuery' a] -> ShowS
$cshowList :: forall a. Show a => [PrimQuery' a] -> ShowS
show :: PrimQuery' a -> String
$cshow :: forall a. Show a => PrimQuery' a -> String
showsPrec :: Int -> PrimQuery' a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> PrimQuery' a -> ShowS
Show
type PrimQuery = PrimQuery' ()
type PrimQueryFold p = PrimQueryFold' () p
type PrimQueryFold' a p = PrimQueryFoldP a p p
data PrimQueryFoldP a p p' = PrimQueryFold
{ PrimQueryFoldP a p p' -> p'
unit :: p'
, PrimQueryFoldP a p p' -> a -> p'
empty :: a -> p'
, PrimQueryFoldP a p p' -> TableIdentifier -> Bindings PrimExpr -> p'
baseTable :: TableIdentifier -> Bindings HPQ.PrimExpr -> p'
, PrimQueryFoldP a p p' -> NonEmpty (Lateral, p) -> [PrimExpr] -> p'
product :: NEL.NonEmpty (Lateral, p) -> [HPQ.PrimExpr] -> p'
, PrimQueryFoldP a p p'
-> Bindings (Maybe (AggrOp, [OrderExpr], AggrDistinct), Symbol)
-> p
-> p'
aggregate :: Bindings (Maybe
(HPQ.AggrOp, [HPQ.OrderExpr], HPQ.AggrDistinct),
HPQ.Symbol)
-> p
-> p'
, PrimQueryFoldP a p p'
-> Maybe (NonEmpty PrimExpr) -> [OrderExpr] -> p -> p'
distinctOnOrderBy :: Maybe (NEL.NonEmpty HPQ.PrimExpr)
-> [HPQ.OrderExpr]
-> p
-> p'
, PrimQueryFoldP a p p' -> LimitOp -> p -> p'
limit :: LimitOp -> p -> p'
, PrimQueryFoldP a p p'
-> JoinType -> PrimExpr -> (Lateral, p) -> (Lateral, p) -> p'
join :: JoinType
-> HPQ.PrimExpr
-> (Lateral, p)
-> (Lateral, p)
-> p'
, PrimQueryFoldP a p p' -> SemijoinType -> p -> p -> p'
semijoin :: SemijoinType -> p -> p -> p'
, PrimQueryFoldP a p p' -> Symbol -> p -> p'
exists :: Symbol -> p -> p'
, PrimQueryFoldP a p p' -> [Symbol] -> NonEmpty [PrimExpr] -> p'
values :: [Symbol] -> NEL.NonEmpty [HPQ.PrimExpr] -> p'
, PrimQueryFoldP a p p' -> BinOp -> (p, p) -> p'
binary :: BinOp
-> (p, p)
-> p'
, PrimQueryFoldP a p p' -> String -> p -> p'
label :: String -> p -> p'
, PrimQueryFoldP a p p' -> PrimExpr -> Bindings PrimExpr -> p'
relExpr :: HPQ.PrimExpr -> Bindings HPQ.PrimExpr -> p'
, PrimQueryFoldP a p p' -> Bool -> Bindings PrimExpr -> p -> p'
rebind :: Bool -> Bindings HPQ.PrimExpr -> p -> p'
, PrimQueryFoldP a p p' -> p -> p'
forUpdate :: p -> p'
, PrimQueryFoldP a p p'
-> Recursive -> Symbol -> [Symbol] -> p -> p -> p'
with :: Recursive -> Symbol -> [Symbol] -> p -> p -> p'
}
primQueryFoldDefault :: PrimQueryFold' a (PrimQuery' a)
primQueryFoldDefault :: PrimQueryFold' a (PrimQuery' a)
primQueryFoldDefault = PrimQueryFold :: forall a p p'.
p'
-> (a -> p')
-> (TableIdentifier -> Bindings PrimExpr -> p')
-> (NonEmpty (Lateral, p) -> [PrimExpr] -> p')
-> (Bindings (Maybe (AggrOp, [OrderExpr], AggrDistinct), Symbol)
-> p -> p')
-> (Maybe (NonEmpty PrimExpr) -> [OrderExpr] -> p -> p')
-> (LimitOp -> p -> p')
-> (JoinType -> PrimExpr -> (Lateral, p) -> (Lateral, p) -> p')
-> (SemijoinType -> p -> p -> p')
-> (Symbol -> p -> p')
-> ([Symbol] -> NonEmpty [PrimExpr] -> p')
-> (BinOp -> (p, p) -> p')
-> (String -> p -> p')
-> (PrimExpr -> Bindings PrimExpr -> p')
-> (Bool -> Bindings PrimExpr -> p -> p')
-> (p -> p')
-> (Recursive -> Symbol -> [Symbol] -> p -> p -> p')
-> PrimQueryFoldP a p p'
PrimQueryFold
{ unit :: PrimQuery' a
unit = PrimQuery' a
forall a. PrimQuery' a
Unit
, empty :: a -> PrimQuery' a
empty = a -> PrimQuery' a
forall a. a -> PrimQuery' a
Empty
, baseTable :: TableIdentifier -> Bindings PrimExpr -> PrimQuery' a
baseTable = TableIdentifier -> Bindings PrimExpr -> PrimQuery' a
forall a. TableIdentifier -> Bindings PrimExpr -> PrimQuery' a
BaseTable
, product :: NonEmpty (Lateral, PrimQuery' a) -> [PrimExpr] -> PrimQuery' a
product = NonEmpty (Lateral, PrimQuery' a) -> [PrimExpr] -> PrimQuery' a
forall a.
NonEmpty (Lateral, PrimQuery' a) -> [PrimExpr] -> PrimQuery' a
Product
, aggregate :: Bindings (Maybe (AggrOp, [OrderExpr], AggrDistinct), Symbol)
-> PrimQuery' a -> PrimQuery' a
aggregate = Bindings (Maybe (AggrOp, [OrderExpr], AggrDistinct), Symbol)
-> PrimQuery' a -> PrimQuery' a
forall a.
Bindings (Maybe (AggrOp, [OrderExpr], AggrDistinct), Symbol)
-> PrimQuery' a -> PrimQuery' a
Aggregate
, distinctOnOrderBy :: Maybe (NonEmpty PrimExpr)
-> [OrderExpr] -> PrimQuery' a -> PrimQuery' a
distinctOnOrderBy = Maybe (NonEmpty PrimExpr)
-> [OrderExpr] -> PrimQuery' a -> PrimQuery' a
forall a.
Maybe (NonEmpty PrimExpr)
-> [OrderExpr] -> PrimQuery' a -> PrimQuery' a
DistinctOnOrderBy
, limit :: LimitOp -> PrimQuery' a -> PrimQuery' a
limit = LimitOp -> PrimQuery' a -> PrimQuery' a
forall a. LimitOp -> PrimQuery' a -> PrimQuery' a
Limit
, join :: JoinType
-> PrimExpr
-> (Lateral, PrimQuery' a)
-> (Lateral, PrimQuery' a)
-> PrimQuery' a
join = JoinType
-> PrimExpr
-> (Lateral, PrimQuery' a)
-> (Lateral, PrimQuery' a)
-> PrimQuery' a
forall a.
JoinType
-> PrimExpr
-> (Lateral, PrimQuery' a)
-> (Lateral, PrimQuery' a)
-> PrimQuery' a
Join
, semijoin :: SemijoinType -> PrimQuery' a -> PrimQuery' a -> PrimQuery' a
semijoin = SemijoinType -> PrimQuery' a -> PrimQuery' a -> PrimQuery' a
forall a.
SemijoinType -> PrimQuery' a -> PrimQuery' a -> PrimQuery' a
Semijoin
, values :: [Symbol] -> NonEmpty [PrimExpr] -> PrimQuery' a
values = [Symbol] -> NonEmpty [PrimExpr] -> PrimQuery' a
forall a. [Symbol] -> NonEmpty [PrimExpr] -> PrimQuery' a
Values
, binary :: BinOp -> (PrimQuery' a, PrimQuery' a) -> PrimQuery' a
binary = BinOp -> (PrimQuery' a, PrimQuery' a) -> PrimQuery' a
forall a. BinOp -> (PrimQuery' a, PrimQuery' a) -> PrimQuery' a
Binary
, label :: String -> PrimQuery' a -> PrimQuery' a
label = String -> PrimQuery' a -> PrimQuery' a
forall a. String -> PrimQuery' a -> PrimQuery' a
Label
, relExpr :: PrimExpr -> Bindings PrimExpr -> PrimQuery' a
relExpr = PrimExpr -> Bindings PrimExpr -> PrimQuery' a
forall a. PrimExpr -> Bindings PrimExpr -> PrimQuery' a
RelExpr
, exists :: Symbol -> PrimQuery' a -> PrimQuery' a
exists = Symbol -> PrimQuery' a -> PrimQuery' a
forall a. Symbol -> PrimQuery' a -> PrimQuery' a
Exists
, rebind :: Bool -> Bindings PrimExpr -> PrimQuery' a -> PrimQuery' a
rebind = Bool -> Bindings PrimExpr -> PrimQuery' a -> PrimQuery' a
forall a. Bool -> Bindings PrimExpr -> PrimQuery' a -> PrimQuery' a
Rebind
, forUpdate :: PrimQuery' a -> PrimQuery' a
forUpdate = PrimQuery' a -> PrimQuery' a
forall a. PrimQuery' a -> PrimQuery' a
ForUpdate
, with :: Recursive
-> Symbol
-> [Symbol]
-> PrimQuery' a
-> PrimQuery' a
-> PrimQuery' a
with = Recursive
-> Symbol
-> [Symbol]
-> PrimQuery' a
-> PrimQuery' a
-> PrimQuery' a
forall a.
Recursive
-> Symbol
-> [Symbol]
-> PrimQuery' a
-> PrimQuery' a
-> PrimQuery' a
With
}
dimapPrimQueryFold :: (q -> p)
-> (p' -> q')
-> PrimQueryFoldP a p p'
-> PrimQueryFoldP a q q'
dimapPrimQueryFold :: (q -> p)
-> (p' -> q') -> PrimQueryFoldP a p p' -> PrimQueryFoldP a q q'
dimapPrimQueryFold q -> p
self p' -> q'
g PrimQueryFoldP a p p'
f = PrimQueryFold :: forall a p p'.
p'
-> (a -> p')
-> (TableIdentifier -> Bindings PrimExpr -> p')
-> (NonEmpty (Lateral, p) -> [PrimExpr] -> p')
-> (Bindings (Maybe (AggrOp, [OrderExpr], AggrDistinct), Symbol)
-> p -> p')
-> (Maybe (NonEmpty PrimExpr) -> [OrderExpr] -> p -> p')
-> (LimitOp -> p -> p')
-> (JoinType -> PrimExpr -> (Lateral, p) -> (Lateral, p) -> p')
-> (SemijoinType -> p -> p -> p')
-> (Symbol -> p -> p')
-> ([Symbol] -> NonEmpty [PrimExpr] -> p')
-> (BinOp -> (p, p) -> p')
-> (String -> p -> p')
-> (PrimExpr -> Bindings PrimExpr -> p')
-> (Bool -> Bindings PrimExpr -> p -> p')
-> (p -> p')
-> (Recursive -> Symbol -> [Symbol] -> p -> p -> p')
-> PrimQueryFoldP a p p'
PrimQueryFold
{ unit :: q'
unit = p' -> q'
g (PrimQueryFoldP a p p' -> p'
forall a p p'. PrimQueryFoldP a p p' -> p'
unit PrimQueryFoldP a p p'
f)
, empty :: a -> q'
empty = p' -> q'
g (p' -> q') -> (a -> p') -> a -> q'
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimQueryFoldP a p p' -> a -> p'
forall a p p'. PrimQueryFoldP a p p' -> a -> p'
empty PrimQueryFoldP a p p'
f
, baseTable :: TableIdentifier -> Bindings PrimExpr -> q'
baseTable = \TableIdentifier
ti Bindings PrimExpr
bs -> p' -> q'
g (PrimQueryFoldP a p p' -> TableIdentifier -> Bindings PrimExpr -> p'
forall a p p'.
PrimQueryFoldP a p p' -> TableIdentifier -> Bindings PrimExpr -> p'
baseTable PrimQueryFoldP a p p'
f TableIdentifier
ti Bindings PrimExpr
bs)
, product :: NonEmpty (Lateral, q) -> [PrimExpr] -> q'
product = \NonEmpty (Lateral, q)
ps [PrimExpr]
conds -> p' -> q'
g (PrimQueryFoldP a p p' -> NonEmpty (Lateral, p) -> [PrimExpr] -> p'
forall a p p'.
PrimQueryFoldP a p p' -> NonEmpty (Lateral, p) -> [PrimExpr] -> p'
product PrimQueryFoldP a p p'
f ((((Lateral, q) -> (Lateral, p))
-> NonEmpty (Lateral, q) -> NonEmpty (Lateral, p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (((Lateral, q) -> (Lateral, p))
-> NonEmpty (Lateral, q) -> NonEmpty (Lateral, p))
-> ((q -> p) -> (Lateral, q) -> (Lateral, p))
-> (q -> p)
-> NonEmpty (Lateral, q)
-> NonEmpty (Lateral, p)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (q -> p) -> (Lateral, q) -> (Lateral, p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap) q -> p
self NonEmpty (Lateral, q)
ps) [PrimExpr]
conds)
, aggregate :: Bindings (Maybe (AggrOp, [OrderExpr], AggrDistinct), Symbol)
-> q -> q'
aggregate = \Bindings (Maybe (AggrOp, [OrderExpr], AggrDistinct), Symbol)
b q
p -> p' -> q'
g (PrimQueryFoldP a p p'
-> Bindings (Maybe (AggrOp, [OrderExpr], AggrDistinct), Symbol)
-> p
-> p'
forall a p p'.
PrimQueryFoldP a p p'
-> Bindings (Maybe (AggrOp, [OrderExpr], AggrDistinct), Symbol)
-> p
-> p'
aggregate PrimQueryFoldP a p p'
f Bindings (Maybe (AggrOp, [OrderExpr], AggrDistinct), Symbol)
b (q -> p
self q
p))
, distinctOnOrderBy :: Maybe (NonEmpty PrimExpr) -> [OrderExpr] -> q -> q'
distinctOnOrderBy = \Maybe (NonEmpty PrimExpr)
m [OrderExpr]
os q
p -> p' -> q'
g (PrimQueryFoldP a p p'
-> Maybe (NonEmpty PrimExpr) -> [OrderExpr] -> p -> p'
forall a p p'.
PrimQueryFoldP a p p'
-> Maybe (NonEmpty PrimExpr) -> [OrderExpr] -> p -> p'
distinctOnOrderBy PrimQueryFoldP a p p'
f Maybe (NonEmpty PrimExpr)
m [OrderExpr]
os (q -> p
self q
p))
, limit :: LimitOp -> q -> q'
limit = \LimitOp
l q
p -> p' -> q'
g (PrimQueryFoldP a p p' -> LimitOp -> p -> p'
forall a p p'. PrimQueryFoldP a p p' -> LimitOp -> p -> p'
limit PrimQueryFoldP a p p'
f LimitOp
l (q -> p
self q
p))
, join :: JoinType -> PrimExpr -> (Lateral, q) -> (Lateral, q) -> q'
join = \JoinType
j PrimExpr
pe (Lateral, q)
lp (Lateral, q)
lp' -> p' -> q'
g (PrimQueryFoldP a p p'
-> JoinType -> PrimExpr -> (Lateral, p) -> (Lateral, p) -> p'
forall a p p'.
PrimQueryFoldP a p p'
-> JoinType -> PrimExpr -> (Lateral, p) -> (Lateral, p) -> p'
join PrimQueryFoldP a p p'
f JoinType
j PrimExpr
pe ((q -> p) -> (Lateral, q) -> (Lateral, p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap q -> p
self (Lateral, q)
lp) ((q -> p) -> (Lateral, q) -> (Lateral, p)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap q -> p
self (Lateral, q)
lp'))
, semijoin :: SemijoinType -> q -> q -> q'
semijoin = \SemijoinType
j q
p1 q
p2 -> p' -> q'
g (PrimQueryFoldP a p p' -> SemijoinType -> p -> p -> p'
forall a p p'.
PrimQueryFoldP a p p' -> SemijoinType -> p -> p -> p'
semijoin PrimQueryFoldP a p p'
f SemijoinType
j (q -> p
self q
p1) (q -> p
self q
p2))
, exists :: Symbol -> q -> q'
exists = \Symbol
s q
p -> p' -> q'
g (PrimQueryFoldP a p p' -> Symbol -> p -> p'
forall a p p'. PrimQueryFoldP a p p' -> Symbol -> p -> p'
exists PrimQueryFoldP a p p'
f Symbol
s (q -> p
self q
p))
, values :: [Symbol] -> NonEmpty [PrimExpr] -> q'
values = \[Symbol]
ss NonEmpty [PrimExpr]
nel -> p' -> q'
g (PrimQueryFoldP a p p' -> [Symbol] -> NonEmpty [PrimExpr] -> p'
forall a p p'.
PrimQueryFoldP a p p' -> [Symbol] -> NonEmpty [PrimExpr] -> p'
values PrimQueryFoldP a p p'
f [Symbol]
ss NonEmpty [PrimExpr]
nel)
, binary :: BinOp -> (q, q) -> q'
binary = \BinOp
bo (q
p1, q
p2) -> p' -> q'
g (PrimQueryFoldP a p p' -> BinOp -> (p, p) -> p'
forall a p p'. PrimQueryFoldP a p p' -> BinOp -> (p, p) -> p'
binary PrimQueryFoldP a p p'
f BinOp
bo (q -> p
self q
p1, q -> p
self q
p2))
, label :: String -> q -> q'
label = \String
l q
p -> p' -> q'
g (PrimQueryFoldP a p p' -> String -> p -> p'
forall a p p'. PrimQueryFoldP a p p' -> String -> p -> p'
label PrimQueryFoldP a p p'
f String
l (q -> p
self q
p))
, relExpr :: PrimExpr -> Bindings PrimExpr -> q'
relExpr = \PrimExpr
pe Bindings PrimExpr
bs -> p' -> q'
g (PrimQueryFoldP a p p' -> PrimExpr -> Bindings PrimExpr -> p'
forall a p p'.
PrimQueryFoldP a p p' -> PrimExpr -> Bindings PrimExpr -> p'
relExpr PrimQueryFoldP a p p'
f PrimExpr
pe Bindings PrimExpr
bs)
, rebind :: Bool -> Bindings PrimExpr -> q -> q'
rebind = \Bool
s Bindings PrimExpr
bs q
p -> p' -> q'
g (PrimQueryFoldP a p p' -> Bool -> Bindings PrimExpr -> p -> p'
forall a p p'.
PrimQueryFoldP a p p' -> Bool -> Bindings PrimExpr -> p -> p'
rebind PrimQueryFoldP a p p'
f Bool
s Bindings PrimExpr
bs (q -> p
self q
p))
, forUpdate :: q -> q'
forUpdate = \q
p -> p' -> q'
g (PrimQueryFoldP a p p' -> p -> p'
forall a p p'. PrimQueryFoldP a p p' -> p -> p'
forUpdate PrimQueryFoldP a p p'
f (q -> p
self q
p))
, with :: Recursive -> Symbol -> [Symbol] -> q -> q -> q'
with = \Recursive
r Symbol
s [Symbol]
ss q
p1 q
p2 -> p' -> q'
g (PrimQueryFoldP a p p'
-> Recursive -> Symbol -> [Symbol] -> p -> p -> p'
forall a p p'.
PrimQueryFoldP a p p'
-> Recursive -> Symbol -> [Symbol] -> p -> p -> p'
with PrimQueryFoldP a p p'
f Recursive
r Symbol
s [Symbol]
ss (q -> p
self q
p1) (q -> p
self q
p2))
}
applyPrimQueryFoldF ::
PrimQueryFoldP a (PrimQuery' a) p -> PrimQuery' a -> p
applyPrimQueryFoldF :: PrimQueryFoldP a (PrimQuery' a) p -> PrimQuery' a -> p
applyPrimQueryFoldF PrimQueryFoldP a (PrimQuery' a) p
f = \case
PrimQuery' a
Unit -> PrimQueryFoldP a (PrimQuery' a) p -> p
forall a p p'. PrimQueryFoldP a p p' -> p'
unit PrimQueryFoldP a (PrimQuery' a) p
f
Empty a
a -> PrimQueryFoldP a (PrimQuery' a) p -> a -> p
forall a p p'. PrimQueryFoldP a p p' -> a -> p'
empty PrimQueryFoldP a (PrimQuery' a) p
f a
a
BaseTable TableIdentifier
ti Bindings PrimExpr
syms -> PrimQueryFoldP a (PrimQuery' a) p
-> TableIdentifier -> Bindings PrimExpr -> p
forall a p p'.
PrimQueryFoldP a p p' -> TableIdentifier -> Bindings PrimExpr -> p'
baseTable PrimQueryFoldP a (PrimQuery' a) p
f TableIdentifier
ti Bindings PrimExpr
syms
Product NonEmpty (Lateral, PrimQuery' a)
qs [PrimExpr]
pes -> PrimQueryFoldP a (PrimQuery' a) p
-> NonEmpty (Lateral, PrimQuery' a) -> [PrimExpr] -> p
forall a p p'.
PrimQueryFoldP a p p' -> NonEmpty (Lateral, p) -> [PrimExpr] -> p'
product PrimQueryFoldP a (PrimQuery' a) p
f NonEmpty (Lateral, PrimQuery' a)
qs [PrimExpr]
pes
Aggregate Bindings (Maybe (AggrOp, [OrderExpr], AggrDistinct), Symbol)
aggrs PrimQuery' a
q -> PrimQueryFoldP a (PrimQuery' a) p
-> Bindings (Maybe (AggrOp, [OrderExpr], AggrDistinct), Symbol)
-> PrimQuery' a
-> p
forall a p p'.
PrimQueryFoldP a p p'
-> Bindings (Maybe (AggrOp, [OrderExpr], AggrDistinct), Symbol)
-> p
-> p'
aggregate PrimQueryFoldP a (PrimQuery' a) p
f Bindings (Maybe (AggrOp, [OrderExpr], AggrDistinct), Symbol)
aggrs PrimQuery' a
q
DistinctOnOrderBy Maybe (NonEmpty PrimExpr)
dxs [OrderExpr]
oxs PrimQuery' a
q -> PrimQueryFoldP a (PrimQuery' a) p
-> Maybe (NonEmpty PrimExpr) -> [OrderExpr] -> PrimQuery' a -> p
forall a p p'.
PrimQueryFoldP a p p'
-> Maybe (NonEmpty PrimExpr) -> [OrderExpr] -> p -> p'
distinctOnOrderBy PrimQueryFoldP a (PrimQuery' a) p
f Maybe (NonEmpty PrimExpr)
dxs [OrderExpr]
oxs PrimQuery' a
q
Limit LimitOp
op PrimQuery' a
q -> PrimQueryFoldP a (PrimQuery' a) p -> LimitOp -> PrimQuery' a -> p
forall a p p'. PrimQueryFoldP a p p' -> LimitOp -> p -> p'
limit PrimQueryFoldP a (PrimQuery' a) p
f LimitOp
op PrimQuery' a
q
Join JoinType
j PrimExpr
cond (Lateral, PrimQuery' a)
q1 (Lateral, PrimQuery' a)
q2 -> PrimQueryFoldP a (PrimQuery' a) p
-> JoinType
-> PrimExpr
-> (Lateral, PrimQuery' a)
-> (Lateral, PrimQuery' a)
-> p
forall a p p'.
PrimQueryFoldP a p p'
-> JoinType -> PrimExpr -> (Lateral, p) -> (Lateral, p) -> p'
join PrimQueryFoldP a (PrimQuery' a) p
f JoinType
j PrimExpr
cond (Lateral, PrimQuery' a)
q1 (Lateral, PrimQuery' a)
q2
Semijoin SemijoinType
j PrimQuery' a
q1 PrimQuery' a
q2 -> PrimQueryFoldP a (PrimQuery' a) p
-> SemijoinType -> PrimQuery' a -> PrimQuery' a -> p
forall a p p'.
PrimQueryFoldP a p p' -> SemijoinType -> p -> p -> p'
semijoin PrimQueryFoldP a (PrimQuery' a) p
f SemijoinType
j PrimQuery' a
q1 PrimQuery' a
q2
Values [Symbol]
ss NonEmpty [PrimExpr]
pes -> PrimQueryFoldP a (PrimQuery' a) p
-> [Symbol] -> NonEmpty [PrimExpr] -> p
forall a p p'.
PrimQueryFoldP a p p' -> [Symbol] -> NonEmpty [PrimExpr] -> p'
values PrimQueryFoldP a (PrimQuery' a) p
f [Symbol]
ss NonEmpty [PrimExpr]
pes
Binary BinOp
binop (PrimQuery' a
q1, PrimQuery' a
q2) -> PrimQueryFoldP a (PrimQuery' a) p
-> BinOp -> (PrimQuery' a, PrimQuery' a) -> p
forall a p p'. PrimQueryFoldP a p p' -> BinOp -> (p, p) -> p'
binary PrimQueryFoldP a (PrimQuery' a) p
f BinOp
binop (PrimQuery' a
q1, PrimQuery' a
q2)
Label String
l PrimQuery' a
pq -> PrimQueryFoldP a (PrimQuery' a) p -> String -> PrimQuery' a -> p
forall a p p'. PrimQueryFoldP a p p' -> String -> p -> p'
label PrimQueryFoldP a (PrimQuery' a) p
f String
l PrimQuery' a
pq
RelExpr PrimExpr
pe Bindings PrimExpr
syms -> PrimQueryFoldP a (PrimQuery' a) p
-> PrimExpr -> Bindings PrimExpr -> p
forall a p p'.
PrimQueryFoldP a p p' -> PrimExpr -> Bindings PrimExpr -> p'
relExpr PrimQueryFoldP a (PrimQuery' a) p
f PrimExpr
pe Bindings PrimExpr
syms
Exists Symbol
s PrimQuery' a
q -> PrimQueryFoldP a (PrimQuery' a) p -> Symbol -> PrimQuery' a -> p
forall a p p'. PrimQueryFoldP a p p' -> Symbol -> p -> p'
exists PrimQueryFoldP a (PrimQuery' a) p
f Symbol
s PrimQuery' a
q
Rebind Bool
star Bindings PrimExpr
pes PrimQuery' a
q -> PrimQueryFoldP a (PrimQuery' a) p
-> Bool -> Bindings PrimExpr -> PrimQuery' a -> p
forall a p p'.
PrimQueryFoldP a p p' -> Bool -> Bindings PrimExpr -> p -> p'
rebind PrimQueryFoldP a (PrimQuery' a) p
f Bool
star Bindings PrimExpr
pes PrimQuery' a
q
ForUpdate PrimQuery' a
q -> PrimQueryFoldP a (PrimQuery' a) p -> PrimQuery' a -> p
forall a p p'. PrimQueryFoldP a p p' -> p -> p'
forUpdate PrimQueryFoldP a (PrimQuery' a) p
f PrimQuery' a
q
With Recursive
recursive Symbol
name [Symbol]
cols PrimQuery' a
a PrimQuery' a
b -> PrimQueryFoldP a (PrimQuery' a) p
-> Recursive
-> Symbol
-> [Symbol]
-> PrimQuery' a
-> PrimQuery' a
-> p
forall a p p'.
PrimQueryFoldP a p p'
-> Recursive -> Symbol -> [Symbol] -> p -> p -> p'
with PrimQueryFoldP a (PrimQuery' a) p
f Recursive
recursive Symbol
name [Symbol]
cols PrimQuery' a
a PrimQuery' a
b
primQueryFoldF ::
PrimQueryFoldP a p p' -> (PrimQuery' a -> p) -> PrimQuery' a -> p'
primQueryFoldF :: PrimQueryFoldP a p p' -> (PrimQuery' a -> p) -> PrimQuery' a -> p'
primQueryFoldF PrimQueryFoldP a p p'
g PrimQuery' a -> p
self = PrimQueryFoldP a (PrimQuery' a) p' -> PrimQuery' a -> p'
forall a p. PrimQueryFoldP a (PrimQuery' a) p -> PrimQuery' a -> p
applyPrimQueryFoldF ((PrimQuery' a -> p)
-> (p' -> p')
-> PrimQueryFoldP a p p'
-> PrimQueryFoldP a (PrimQuery' a) p'
forall q p p' q' a.
(q -> p)
-> (p' -> q') -> PrimQueryFoldP a p p' -> PrimQueryFoldP a q q'
dimapPrimQueryFold PrimQuery' a -> p
self p' -> p'
forall a. a -> a
id PrimQueryFoldP a p p'
g)
foldPrimQuery :: PrimQueryFold' a p -> PrimQuery' a -> p
foldPrimQuery :: PrimQueryFold' a p -> PrimQuery' a -> p
foldPrimQuery PrimQueryFold' a p
f = ((PrimQuery' a -> p) -> PrimQuery' a -> p) -> PrimQuery' a -> p
forall t. (t -> t) -> t
fix (PrimQueryFold' a p -> (PrimQuery' a -> p) -> PrimQuery' a -> p
forall a p p'.
PrimQueryFoldP a p p' -> (PrimQuery' a -> p) -> PrimQuery' a -> p'
primQueryFoldF PrimQueryFold' a p
f)
where fix :: (t -> t) -> t
fix t -> t
g = let x :: t
x = t -> t
g t
x in t
x
composePrimQueryFold ::
PrimQueryFoldP a (PrimQuery' a) q ->
PrimQueryFoldP a p (PrimQuery' a) ->
PrimQueryFoldP a p q
composePrimQueryFold :: PrimQueryFoldP a (PrimQuery' a) q
-> PrimQueryFoldP a p (PrimQuery' a) -> PrimQueryFoldP a p q
composePrimQueryFold = (PrimQuery' a -> q)
-> PrimQueryFoldP a p (PrimQuery' a) -> PrimQueryFoldP a p q
forall p' q' a p.
(p' -> q') -> PrimQueryFoldP a p p' -> PrimQueryFoldP a p q'
fmapPrimQueryFold ((PrimQuery' a -> q)
-> PrimQueryFoldP a p (PrimQuery' a) -> PrimQueryFoldP a p q)
-> (PrimQueryFoldP a (PrimQuery' a) q -> PrimQuery' a -> q)
-> PrimQueryFoldP a (PrimQuery' a) q
-> PrimQueryFoldP a p (PrimQuery' a)
-> PrimQueryFoldP a p q
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimQueryFoldP a (PrimQuery' a) q -> PrimQuery' a -> q
forall a p. PrimQueryFoldP a (PrimQuery' a) p -> PrimQuery' a -> p
applyPrimQueryFoldF
where fmapPrimQueryFold :: (p' -> q') -> PrimQueryFoldP a p p' -> PrimQueryFoldP a p q'
fmapPrimQueryFold = (p -> p)
-> (p' -> q') -> PrimQueryFoldP a p p' -> PrimQueryFoldP a p q'
forall q p p' q' a.
(q -> p)
-> (p' -> q') -> PrimQueryFoldP a p p' -> PrimQueryFoldP a q q'
dimapPrimQueryFold p -> p
forall a. a -> a
id
times :: Lateral -> PrimQuery -> PrimQuery -> PrimQuery
times :: Lateral -> PrimQuery -> PrimQuery -> PrimQuery
times Lateral
lat PrimQuery
q PrimQuery
q' = NonEmpty (Lateral, PrimQuery) -> [PrimExpr] -> PrimQuery
forall a.
NonEmpty (Lateral, PrimQuery' a) -> [PrimExpr] -> PrimQuery' a
Product (PrimQuery -> (Lateral, PrimQuery)
forall (f :: * -> *) a. Applicative f => a -> f a
pure PrimQuery
q (Lateral, PrimQuery)
-> [(Lateral, PrimQuery)] -> NonEmpty (Lateral, PrimQuery)
forall a. a -> [a] -> NonEmpty a
NEL.:| [(Lateral
lat, PrimQuery
q')]) []
restrict :: HPQ.PrimExpr -> PrimQuery -> PrimQuery
restrict :: PrimExpr -> PrimQuery -> PrimQuery
restrict PrimExpr
cond PrimQuery
primQ = NonEmpty (Lateral, PrimQuery) -> [PrimExpr] -> PrimQuery
forall a.
NonEmpty (Lateral, PrimQuery' a) -> [PrimExpr] -> PrimQuery' a
Product ((Lateral, PrimQuery) -> NonEmpty (Lateral, PrimQuery)
forall (m :: * -> *) a. Monad m => a -> m a
return (PrimQuery -> (Lateral, PrimQuery)
forall (f :: * -> *) a. Applicative f => a -> f a
pure PrimQuery
primQ)) [PrimExpr
cond]
isUnit :: PrimQuery' a -> Bool
isUnit :: PrimQuery' a -> Bool
isUnit PrimQuery' a
Unit = Bool
True
isUnit PrimQuery' a
_ = Bool
False