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