From da40706163b628767dcfa4673373398a9b09cde5 Mon Sep 17 00:00:00 2001
From: Philipp Balzarek
Date: Tue, 21 Apr 2015 17:45:44 +0200
Subject: [PATCH 1/3] fix rendering of joins
---
src/Database/Esqueleto/Internal/Sql.hs | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/src/Database/Esqueleto/Internal/Sql.hs b/src/Database/Esqueleto/Internal/Sql.hs
index 4876334..99705e7 100644
--- a/src/Database/Esqueleto/Internal/Sql.hs
+++ b/src/Database/Esqueleto/Internal/Sql.hs
@@ -934,19 +934,20 @@ makeFrom info mode fs = ret
where
ret = case collectOnClauses fs of
Left expr -> throw $ mkExc expr
- Right fs' -> keyword $ uncommas' (map (mk Never mempty) fs')
+ Right fs' -> keyword $ uncommas' (map (mk Never) fs')
keyword = case mode of
UPDATE -> id
_ -> first ("\nFROM " <>)
- mk _ onClause (FromStart i def) = base i def <> onClause
- mk paren onClause (FromJoin lhs kind rhs monClause) =
+ mk _ (FromStart i def) = base i def
+ mk paren (FromJoin lhs kind rhs monClause) =
first (parensM paren) $
- mconcat [ mk Parens onClause lhs
+ mconcat [ mk Never lhs
, (fromKind kind, mempty)
- , mk Never (maybe mempty makeOnClause monClause) rhs
+ , mk Parens rhs
+ , maybe mempty makeOnClause monClause
]
- mk _ _ (OnClause _) = error "Esqueleto/Sql/makeFrom: never here (is collectOnClauses working?)"
+ mk _ (OnClause _) = error "Esqueleto/Sql/makeFrom: never here (is collectOnClauses working?)"
base ident@(I identText) def =
let db@(DBName dbText) = entityDB def
From b0b40a07ffcd3990f1c449c12986a5bf515229a1 Mon Sep 17 00:00:00 2001
From: Philipp Balzarek
Date: Tue, 21 Apr 2015 18:52:26 +0200
Subject: [PATCH 2/3] make join constructors left-associative
---
src/Database/Esqueleto/Internal/Language.hs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/Database/Esqueleto/Internal/Language.hs b/src/Database/Esqueleto/Internal/Language.hs
index 37be821..82c699f 100644
--- a/src/Database/Esqueleto/Internal/Language.hs
+++ b/src/Database/Esqueleto/Internal/Language.hs
@@ -390,7 +390,8 @@ infixl 6 +., -.
infixr 5 ++.
infix 4 ==., >=., >., <=., <., !=.
infixr 3 &&., =., +=., -=., *=., /=.
-infixr 2 ||., `InnerJoin`, `CrossJoin`, `LeftOuterJoin`, `RightOuterJoin`, `FullOuterJoin`, `like`
+infixr 2 ||., `like`
+infixl 2 `InnerJoin`, `CrossJoin`, `LeftOuterJoin`, `RightOuterJoin`, `FullOuterJoin`
-- | Syntax sugar for 'case_'.
--
From 451beb9a559bcfc0c02e13bacbb647511f00b9a3 Mon Sep 17 00:00:00 2001
From: Philipp Balzarek
Date: Tue, 21 Apr 2015 20:04:18 +0200
Subject: [PATCH 3/3] add a test case for #97
---
test/Test.hs | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/test/Test.hs b/test/Test.hs
index 5c8d379..9d355b0 100644
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -439,6 +439,19 @@ main = do
retArt `shouldBe` article
retTag `shouldBe` tag
+ it "respects the associativity of joins" $
+ run $ do
+ insert' p1
+ ps <- select . from $
+ \((p :: SqlExpr (Entity Person))
+ `LeftOuterJoin`
+ (( q :: SqlExpr (Entity Person))
+ `InnerJoin` (r :: SqlExpr (Entity Person)))) -> do
+ on (val False) -- Inner join is empty
+ on (val True)
+ return p
+ liftIO $ (entityVal <$> ps) `shouldBe` [p1]
+
describe "select/where_" $ do
it "works for a simple example with (==.)" $
run $ do