1{-# language FlexibleContexts #-}
5 , keepHereTable, loseHereTable
6 , keepThereTable, loseThereTable
7 , keepThisTable, loseThisTable
8 , keepThatTable, loseThatTable
9 , keepThoseTable, loseThoseTable
11 , bitraverseTheseTable
16import Data.Bifunctor ( bimap )
20import qualified Opaleye.Internal.Join as Opaleye
21import qualified Opaleye.Internal.PrimQuery as Opaleye
24import Rel8.Expr ( Expr )
25import Rel8.Expr.Bool ( (&&.), boolExpr, not_ )
26import Rel8.Expr.Opaleye ( toColumn, toPrimExpr )
27import Rel8.Expr.Serialize ( litExpr )
28import Rel8.Query ( Query )
29import Rel8.Query.Filter ( where_ )
30import Rel8.Query.Maybe ( traverseMaybeTable )
31import Rel8.Query.Opaleye ( zipOpaleyeWith )
32import Rel8.Table ( Table )
33import Rel8.Table.Either ( EitherTable( EitherTable ) )
34import Rel8.Table.Maybe ( MaybeTable( MaybeTable ), isJustTable )
35import Rel8.Table.Opaleye ( unpackspec )
36import Rel8.Table.These
37 ( TheseTable( TheseTable )
38 , isThisTable, isThatTable, isThoseTable
40import Rel8.Type.Tag ( EitherTag( IsLeft, IsRight ) )
43-- | Corresponds to a @FULL OUTER JOIN@ between two queries.
44alignBy :: (Table Expr a, Table Expr b)
45 => (a -> b -> Expr Bool)
46 -> Query a -> Query b -> Query (TheseTable a b)
47alignBy condition as bs =
48 uncurry TheseTable <$> zipOpaleyeWith fullOuterJoin as bs
51 Opaleye.joinExplicit unpackspec unpackspec pure pure full a b on
53 full = Opaleye.FullJoin
54 on = toColumn . toPrimExpr . uncurry condition
57keepHereTable :: TheseTable a b -> Query (a, MaybeTable b)
58keepHereTable = loseThatTable
61loseHereTable :: TheseTable a b -> Query b
62loseHereTable = keepThatTable
65keepThereTable :: TheseTable a b -> Query (MaybeTable a, b)
66keepThereTable = loseThisTable
69loseThereTable :: TheseTable a b -> Query a
70loseThereTable = keepThisTable
73keepThisTable :: TheseTable a b -> Query a
74keepThisTable t@(TheseTable (MaybeTable _ a) _) = do
75 where_ $ isThisTable t
79loseThisTable :: TheseTable a b -> Query (MaybeTable a, b)
80loseThisTable t@(TheseTable ma (MaybeTable _ b)) = do
81 where_ $ not_ $ isThisTable t
85keepThatTable :: TheseTable a b -> Query b
86keepThatTable t@(TheseTable _ (MaybeTable _ b)) = do
87 where_ $ isThatTable t
91loseThatTable :: TheseTable a b -> Query (a, MaybeTable b)
92loseThatTable t@(TheseTable (MaybeTable _ a) mb) = do
93 where_ $ not_ $ isThatTable t
97keepThoseTable :: TheseTable a b -> Query (a, b)
98keepThoseTable t@(TheseTable (MaybeTable _ a) (MaybeTable _ b)) = do
99 where_ $ isThoseTable t
103loseThoseTable :: TheseTable a b -> Query (EitherTable a b)
104loseThoseTable t@(TheseTable (MaybeTable _ a) (MaybeTable _ b)) = do
105 where_ $ not_ $ isThoseTable t
106 pure $ EitherTable tag a b
108 tag = boolExpr (litExpr IsLeft) (litExpr IsRight) (isThatTable t)
111bindTheseTable :: (Table Expr a, Semigroup a, Monad m)
112 => (i -> m (TheseTable a b)) -> TheseTable a i -> m (TheseTable a b)
113bindTheseTable query (TheseTable here (MaybeTable input i)) = do
114 TheseTable here' (MaybeTable output b) <- query i
115 pure $ TheseTable (here <> here') (MaybeTable (input <> output) b)
118bitraverseTheseTable :: (Table Expr c, Table Expr d)
122 -> Query (TheseTable c d)
123bitraverseTheseTable f g (TheseTable here there) =
124 bimap fromJustTable fromJustTable <$>
125 alignBy (\l r -> isJustTable l &&. isJustTable r)
126 (traverseMaybeTable f here)
127 (traverseMaybeTable g there)
129 fromJustTable (MaybeTable _ a) = a
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list