Allow ON clauses on sub-JOINs.

This commit is contained in:
Felipe Lessa 2012-09-05 16:47:15 -03:00
parent eda13692cf
commit 8973d650a4

View File

@ -10,7 +10,7 @@ module Database.Esqueleto.Internal.Sql
import Control.Applicative (Applicative(..), (<$>)) import Control.Applicative (Applicative(..), (<$>))
import Control.Arrow ((***), first) import Control.Arrow ((***), first)
import Control.Exception (throw, throwIO) import Control.Exception (throw, throwIO)
import Control.Monad (ap) import Control.Monad (ap, MonadPlus(..))
import Control.Monad.IO.Class (MonadIO(..)) import Control.Monad.IO.Class (MonadIO(..))
import Control.Monad.Logger (MonadLogger) import Control.Monad.Logger (MonadLogger)
import Control.Monad.Trans.Resource (MonadResourceBase) import Control.Monad.Trans.Resource (MonadResourceBase)
@ -79,10 +79,18 @@ collectOnClauses = go []
go acc (f:fs) = go (f:acc) fs go acc (f:fs) = go (f:acc) fs
go acc [] = return $ reverse acc go acc [] = return $ reverse acc
findMatching (FromJoin l k r Nothing : acc) expr = findMatching (f : acc) expr =
return (FromJoin l k r (Just expr) : acc) case tryMatch expr f of
findMatching (f : acc) expr = (f:) <$> findMatching acc expr Just f' -> return (f' : acc)
findMatching [] expr = Left expr Nothing -> (f:) <$> findMatching acc expr
findMatching [] expr = Left expr
tryMatch expr (FromJoin l k r Nothing) =
return (FromJoin l k r (Just expr))
tryMatch expr (FromJoin l k r j@(Just _)) =
((\r' -> FromJoin l k r' j) <$> tryMatch expr r) `mplus`
((\l' -> FromJoin l' k r j) <$> tryMatch expr l)
tryMatch _ _ = mzero
-- | A complete @WHERE@ clause. -- | A complete @WHERE@ clause.