@@ -47,34 +47,6 @@ optional = mapOpaleye $ Opaleye.QueryArr . go
47-- This operation can be used to "undo" the effect of 'optional', which
47-- This operation can be used to "undo" the effect of 'optional', which
48-- operationally is like turning a @LEFT JOIN@ back into a full @JOIN@. You
48-- operationally is like turning a @LEFT JOIN@ back into a full @JOIN@. You
49-- can think of this as analogous to 'Data.Maybe.catMaybes'.
49-- can think of this as analogous to 'Data.Maybe.catMaybes'.
51−-- To see this in action, first consider the following 'optional' query:
55−-- author <- each authorSchema
56−-- maybeRel8 <- optional $
58−-- >>= filter (\p -> projectAuthorId p ==. authorId author)
59−-- >>= filter (\p -> projectName p ==. "rel8")
60−-- return (authorName author, projectName <$> maybeRel8)
62−-- [("Ollie",Just "rel8"),("Bryan O'Sullivan",Nothing),("Emily Pillmore",Nothing)]
64−-- Here @optional@ is acting as a @LEFT JOIN@. We can turn this into a proper
65−-- join by using @catMaybeTable@ to filter out rows where the join failed:
69−-- author <- each authorSchema
70−-- maybeRel8 <- optional $
72−-- >>= filter (\p -> projectAuthorId p ==. authorId author)
73−-- >>= filter (\p -> projectName p ==. "rel8")
74−-- rel8 <- catMaybeTable maybeRel8
75−-- return (authorName author, projectName rel8)
78catMaybeTable :: MaybeTable a -> Query a
50catMaybeTable :: MaybeTable a -> Query a
79catMaybeTable ma@(MaybeTable _ a) = do
51catMaybeTable ma@(MaybeTable _ a) = do
80 where_ $ isJustTable ma
52 where_ $ isJustTable ma
@@ -87,15 +59,6 @@ catMaybeTable ma@(MaybeTable _ a) = do
88-- This is similar to 'traverseMaybeTable', followed by a @join@ on the
60-- This is similar to 'traverseMaybeTable', followed by a @join@ on the
89-- resulting @MaybeTable@s.
61-- resulting @MaybeTable@s.
91−-- >>> select c $ bindMaybeTable (optional . values . pure . not_) =<< optional (values [lit True])
94−-- >>> select c $ bindMaybeTable (\_ -> return (noTable :: MaybeTable (Expr Bool))) =<< optional (values [lit True])
97−-- >>> select c $ bindMaybeTable (optional . values . pure . not_) =<< return (noTable :: MaybeTable (Expr Bool))
99bindMaybeTable :: Monad m
62bindMaybeTable :: Monad m
100 => (a -> m (MaybeTable b)) -> MaybeTable a -> m (MaybeTable b)
63 => (a -> m (MaybeTable b)) -> MaybeTable a -> m (MaybeTable b)
101bindMaybeTable query (MaybeTable input a) = do
64bindMaybeTable query (MaybeTable input a) = do
@@ -107,30 +70,10 @@ bindMaybeTable query (MaybeTable input a) = do
107-- to step through multiple @LEFT JOINs@.
70-- to step through multiple @LEFT JOINs@.
109-- Note that @traverseMaybeTable@ takes a @a -> Query b@ function, which means
72-- Note that @traverseMaybeTable@ takes a @a -> Query b@ function, which means
110−-- you also have the ability to "expand" one row into multiple rows.
73+-- you also have the ability to "expand" one row into multiple rows. If the
113−-- duplicate :: Expr Bool -> Query (Expr Bool)
114−-- duplicate x = unionAll (return x) (return x)
117−-- >>> select c $ traverseMaybeTable duplicate =<< optional (values [lit True])
118−-- [Just True,Just True]
120−-- Note that if the @a -> Query b@ function returns no rows, then the resulting
74+-- @a -> Query b@ function returns no rows, then the resulting query will also
121−-- query will also have no rows:
123−-- >>> select c $ traverseMaybeTable (limit 0 . pure) =<< optional (values [lit True])
126−-- However, regardless of the given @a -> Query b@ function, if the input is
75+-- have no rows. However, regardless of the given @a -> Query b@ function, if
127−-- @noTable@, you will always get exactly one @noTable@ back:
76+-- the input is @noTable@, you will always get exactly one @noTable@ back.
129−-- >>> select c $ traverseMaybeTable duplicate (noTable :: MaybeTable (Expr Bool))
132−-- >>> select c $ traverseMaybeTable (limit 0 . pure) (noTable :: MaybeTable (Expr Bool))
134traverseMaybeTable :: (a -> Query b) -> MaybeTable a -> Query (MaybeTable b)
77traverseMaybeTable :: (a -> Query b) -> MaybeTable a -> Query (MaybeTable b)
135traverseMaybeTable query ma@(MaybeTable input _) = do
78traverseMaybeTable query ma@(MaybeTable input _) = do
136 MaybeTable output b <- optional (query =<< catMaybeTable ma)
79 MaybeTable output b <- optional (query =<< catMaybeTable ma)