@@ -15,26 +15,26 @@ where
15import Prelude
15import Prelude
18−import qualified Opaleye.Internal.Join as Opaleye
18+import qualified Opaleye.Internal.PackMap as Opaleye
19import qualified Opaleye.Internal.PrimQuery as Opaleye
19import qualified Opaleye.Internal.PrimQuery as Opaleye
20+import qualified Opaleye.Internal.QueryArr as Opaleye
21+import qualified Opaleye.Internal.Tag as Opaleye
22import Rel8.Expr ( Expr )
24import Rel8.Expr ( Expr )
23import Rel8.Expr.Bool ( boolExpr, not_ )
25import Rel8.Expr.Bool ( boolExpr, not_ )
24import Rel8.Expr.Eq ( (==.) )
26import Rel8.Expr.Eq ( (==.) )
25−import Rel8.Expr.Opaleye ( toColumn, toPrimExpr )
27+import Rel8.Expr.Opaleye ( toPrimExpr, traversePrimExpr )
26import Rel8.Expr.Serialize ( litExpr )
28import Rel8.Expr.Serialize ( litExpr )
27import Rel8.Query ( Query )
29import Rel8.Query ( Query )
28import Rel8.Query.Filter ( where_ )
30import Rel8.Query.Filter ( where_ )
29import Rel8.Query.Maybe ( optional )
31import Rel8.Query.Maybe ( optional )
30import Rel8.Query.Opaleye ( zipOpaleyeWith )
32import Rel8.Query.Opaleye ( zipOpaleyeWith )
31−import Rel8.Table ( Table )
32import Rel8.Table.Either ( EitherTable( EitherTable ) )
33import Rel8.Table.Either ( EitherTable( EitherTable ) )
33import Rel8.Table.Maybe ( MaybeTable( MaybeTable ), isJustTable )
34import Rel8.Table.Maybe ( MaybeTable( MaybeTable ), isJustTable )
34−import Rel8.Table.Opaleye ( unpackspec )
35+import Rel8.Table.Tag ( Tag(..), fromExpr )
35−import Rel8.Table.Tag ( Tag(..) )
36import Rel8.Table.These
36import Rel8.Table.These
37− ( TheseTable( TheseTable )
37+ ( TheseTable( TheseTable, here, there )
38 , hasHereTable, hasThereTable
38 , hasHereTable, hasThereTable
39 , isThisTable, isThatTable, isThoseTable
39 , isThisTable, isThatTable, isThoseTable
@@ -42,17 +42,28 @@ import Rel8.Type.Tag ( EitherTag( IsLeft, IsRight ) )
44-- | Corresponds to a @FULL OUTER JOIN@ between two queries.
44-- | Corresponds to a @FULL OUTER JOIN@ between two queries.
45−alignBy :: (Table Expr a, Table Expr b)
45+alignBy :: ()
46 => (a -> b -> Expr Bool)
46 => (a -> b -> Expr Bool)
47 -> Query a -> Query b -> Query (TheseTable a b)
47 -> Query a -> Query b -> Query (TheseTable a b)
48−alignBy condition as bs =
48+alignBy condition = zipOpaleyeWith $ \left right -> Opaleye.QueryArr $ \i -> case i of
49− uncurry TheseTable <$> zipOpaleyeWith fullOuterJoin as bs
49+ (_, input, tag) -> (tab, join', tag''')
51− fullOuterJoin a b =
51+ (ma, left', tag') = Opaleye.runSimpleQueryArr (pure <$> left) ((), tag)
52− Opaleye.joinExplicit unpackspec unpackspec pure pure full a b on
52+ (mb, right', tag'') = Opaleye.runSimpleQueryArr (pure <$> right) ((), tag')
53− where
53+ MaybeTable Tag {expr = hasHere} a = ma
54− full = Opaleye.FullJoin
54+ MaybeTable Tag {expr = hasThere} b = mb
55+ (hasHere', lbindings) = Opaleye.run $ do
56+ traversePrimExpr (Opaleye.extractAttr "hasHere" tag'') hasHere
57+ (hasThere', rbindings) = Opaleye.run $ do
58+ traversePrimExpr (Opaleye.extractAttr "hasThere" tag'') hasThere
59+ tag''' = Opaleye.next tag''
60+ join = Opaleye.Join Opaleye.FullJoin on lbindings rbindings left' right'
55− on = toColumn . toPrimExpr . uncurry condition
62+ on = toPrimExpr $ condition a b
63+ ma' = MaybeTable (fromExpr hasHere') a
64+ mb' = MaybeTable (fromExpr hasThere') b
65+ tab = TheseTable {here = ma', there = mb'}
66+ join' = Opaleye.times input join
58-- | Filter 'TheseTable's, keeping only 'thisTable's and 'thoseTable's.
69-- | Filter 'TheseTable's, keeping only 'thisTable's and 'thoseTable's.