From 6847f8cbc9b397b7fa0d8289737eabf5eede4e75 Mon Sep 17 00:00:00 2001 From: Esteban Ibarra Date: Fri, 21 Dec 2018 16:37:28 -0500 Subject: [PATCH 1/3] Add between function --- src/Database/Esqueleto.hs | 2 +- src/Database/Esqueleto/Internal/Language.hs | 2 ++ src/Database/Esqueleto/Internal/Sql.hs | 6 ++++++ test/Common/Test.hs | 10 ++++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/Database/Esqueleto.hs b/src/Database/Esqueleto.hs index f33c882..9a546f0 100644 --- a/src/Database/Esqueleto.hs +++ b/src/Database/Esqueleto.hs @@ -44,7 +44,7 @@ module Database.Esqueleto , val, isNothing, just, nothing, joinV, withNonNull , countRows, count, countDistinct , not_, (==.), (>=.), (>.), (<=.), (<.), (!=.), (&&.), (||.) - , (+.), (-.), (/.), (*.) + , between, (+.), (-.), (/.), (*.) , random_, round_, ceiling_, floor_ , min_, max_, sum_, avg_, castNum, castNumM , coalesce, coalesceDefault diff --git a/src/Database/Esqueleto/Internal/Language.hs b/src/Database/Esqueleto/Internal/Language.hs index ac992e1..c86ceee 100644 --- a/src/Database/Esqueleto/Internal/Language.hs +++ b/src/Database/Esqueleto/Internal/Language.hs @@ -352,6 +352,8 @@ class (Functor query, Applicative query, Monad query) => (/.) :: PersistField a => expr (Value a) -> expr (Value a) -> expr (Value a) (*.) :: PersistField a => expr (Value a) -> expr (Value a) -> expr (Value a) + between :: PersistField typ => expr (Value typ) -> expr (Value typ) -> expr (Value typ) -> expr (Value Bool) + random_ :: (PersistField a, Num a) => expr (Value a) round_ :: (PersistField a, Num a, PersistField b, Num b) => expr (Value a) -> expr (Value b) diff --git a/src/Database/Esqueleto/Internal/Sql.hs b/src/Database/Esqueleto/Internal/Sql.hs index 16a24e9..aca54ed 100644 --- a/src/Database/Esqueleto/Internal/Sql.hs +++ b/src/Database/Esqueleto/Internal/Sql.hs @@ -533,6 +533,12 @@ instance Esqueleto SqlQuery SqlExpr SqlBackend where (/.) = unsafeSqlBinOp " / " (*.) = unsafeSqlBinOp " * " + between a@(ERaw _ _) (ERaw _ f) (ERaw _ g) = unsafeSqlBinOp " BETWEEN " a $ ERaw Never $ \x -> + let (_, fv) = f x + (_, gv) = g x + in (" ? AND ? ", fv ++ gv) + between _ _ _ = throw (CompositeKeyErr NotError) + random_ = unsafeSqlValue "RANDOM()" round_ = unsafeSqlFunction "ROUND" ceiling_ = unsafeSqlFunction "CEILING" diff --git a/test/Common/Test.hs b/test/Common/Test.hs index 34c9c87..08533e5 100644 --- a/test/Common/Test.hs +++ b/test/Common/Test.hs @@ -630,6 +630,16 @@ testSelectWhere run = do return p liftIO $ ret `shouldBe` [ p3e ] + it "works for a simple example with between and [uses just . val]" $ + run $ do + p1e <- insert' p1 + _ <- insert' p2 + _ <- insert' p3 + ret <- select $ + from $ \p -> do + where_ (between (p ^. PersonAge) (just $ val 20) (just $ val 40)) + return p + liftIO $ ret `shouldBe` [ p1e ] it "works with avg_" $ run $ do _ <- insert' p1 From 86e4f557d68f4c41a1c0cfe0be23df1db1a36d86 Mon Sep 17 00:00:00 2001 From: Esteban Ibarra Date: Wed, 2 Jan 2019 08:35:31 -0500 Subject: [PATCH 2/3] Add haddock --- src/Database/Esqueleto/Internal/Language.hs | 5 ++++- src/Database/Esqueleto/Internal/Sql.hs | 5 +++-- test/Common/Test.hs | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Database/Esqueleto/Internal/Language.hs b/src/Database/Esqueleto/Internal/Language.hs index c86ceee..c6d38c7 100644 --- a/src/Database/Esqueleto/Internal/Language.hs +++ b/src/Database/Esqueleto/Internal/Language.hs @@ -352,7 +352,10 @@ class (Functor query, Applicative query, Monad query) => (/.) :: PersistField a => expr (Value a) -> expr (Value a) -> expr (Value a) (*.) :: PersistField a => expr (Value a) -> expr (Value a) -> expr (Value a) - between :: PersistField typ => expr (Value typ) -> expr (Value typ) -> expr (Value typ) -> expr (Value Bool) + -- | @BETWEEN@ operator + -- + -- /Since: 2.6.0/ + between :: PersistField typ => expr (Value typ) -> (expr (Value typ), expr (Value typ)) -> expr (Value Bool) random_ :: (PersistField a, Num a) => expr (Value a) diff --git a/src/Database/Esqueleto/Internal/Sql.hs b/src/Database/Esqueleto/Internal/Sql.hs index aca54ed..1b9d16a 100644 --- a/src/Database/Esqueleto/Internal/Sql.hs +++ b/src/Database/Esqueleto/Internal/Sql.hs @@ -97,6 +97,7 @@ instance Exception EsqueletoError data CompositeKeyError = NotError + | BetweenError | ToInsertionError | CombineInsertionError | FoldHelpError @@ -533,11 +534,11 @@ instance Esqueleto SqlQuery SqlExpr SqlBackend where (/.) = unsafeSqlBinOp " / " (*.) = unsafeSqlBinOp " * " - between a@(ERaw _ _) (ERaw _ f) (ERaw _ g) = unsafeSqlBinOp " BETWEEN " a $ ERaw Never $ \x -> + a `between` (ERaw _ f, ERaw _ g) = unsafeSqlBinOp " BETWEEN " a $ ERaw Never $ \x -> let (_, fv) = f x (_, gv) = g x in (" ? AND ? ", fv ++ gv) - between _ _ _ = throw (CompositeKeyErr NotError) + _ `between` _ = throw $ CompositeKeyErr BetweenError random_ = unsafeSqlValue "RANDOM()" round_ = unsafeSqlFunction "ROUND" diff --git a/test/Common/Test.hs b/test/Common/Test.hs index 08533e5..a615097 100644 --- a/test/Common/Test.hs +++ b/test/Common/Test.hs @@ -637,7 +637,7 @@ testSelectWhere run = do _ <- insert' p3 ret <- select $ from $ \p -> do - where_ (between (p ^. PersonAge) (just $ val 20) (just $ val 40)) + where_ ((p ^. PersonAge) `between` (just $ val 20, just $ val 40)) return p liftIO $ ret `shouldBe` [ p1e ] it "works with avg_" $ From c8eaa24e2a92f3554eb99c3d06975137feb873f0 Mon Sep 17 00:00:00 2001 From: Matt Parsons Date: Thu, 18 Apr 2019 15:03:36 -0500 Subject: [PATCH 3/3] Update src/Database/Esqueleto/Internal/Language.hs Update release version to 2.8.0 Co-Authored-By: ibarrae --- src/Database/Esqueleto/Internal/Language.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Database/Esqueleto/Internal/Language.hs b/src/Database/Esqueleto/Internal/Language.hs index c6d38c7..a1efb70 100644 --- a/src/Database/Esqueleto/Internal/Language.hs +++ b/src/Database/Esqueleto/Internal/Language.hs @@ -354,7 +354,7 @@ class (Functor query, Applicative query, Monad query) => -- | @BETWEEN@ operator -- - -- /Since: 2.6.0/ + -- /Since: 2.8.0/ between :: PersistField typ => expr (Value typ) -> (expr (Value typ), expr (Value typ)) -> expr (Value Bool)