esqueleto 1.3.9 → 1.3.10
raw patch · 5 files changed
+49/−21 lines, 5 filesdep ~conduit
Dependency ranges changed: conduit
Files
- esqueleto.cabal +2/−2
- src/Database/Esqueleto.hs +1/−1
- src/Database/Esqueleto/Internal/Language.hs +5/−0
- src/Database/Esqueleto/Internal/Sql.hs +5/−0
- test/Test.hs +36/−18
esqueleto.cabal view
@@ -1,5 +1,5 @@ name: esqueleto-version: 1.3.9+version: 1.3.10 synopsis: Bare bones, type-safe EDSL for SQL queries on persistent backends. homepage: https://github.com/meteficha/esqueleto license: BSD3@@ -71,7 +71,7 @@ , tagged >= 0.2 , monad-logger- , conduit+ , conduit >= 1.1 , resourcet hs-source-dirs: src/ ghc-options: -Wall
src/Database/Esqueleto.hs view
@@ -38,7 +38,7 @@ -- $gettingstarted -- * @esqueleto@'s Language- Esqueleto( where_, on, groupBy, orderBy, asc, desc, limit, offset, having+ Esqueleto( where_, on, groupBy, orderBy, rand, asc, desc, limit, offset, having , sub_select, sub_selectDistinct, (^.), (?.) , val, isNothing, just, nothing, joinV, countRows, count, not_ , (==.), (>=.), (>.), (<=.), (<.), (!=.), (&&.), (||.)
src/Database/Esqueleto/Internal/Language.hs view
@@ -174,6 +174,11 @@ -- | @OFFSET@. Usually used with 'limit'. offset :: Int64 -> query () + -- | @ORDER BY random()@ clause.+ --+ -- /Since: 1.3.10/+ rand :: expr OrderBy+ -- | @HAVING@. -- -- /Since: 1.2.2/
src/Database/Esqueleto/Internal/Sql.hs view
@@ -256,6 +256,7 @@ -- A 'SqlExpr' accepted only by 'orderBy'. EOrderBy :: OrderByType -> SqlExpr (Value a) -> SqlExpr OrderBy+ EOrderRandom :: SqlExpr OrderBy -- A 'SqlExpr' accepted only by 'set'. ESet :: (SqlExpr (Entity val) -> SqlExpr (Value ())) -> SqlExpr (Update val)@@ -322,6 +323,8 @@ asc = EOrderBy ASC desc = EOrderBy DESC + rand = EOrderRandom+ limit n = Q $ W.tell mempty { sdLimitClause = Limit (Just n) Nothing } offset n = Q $ W.tell mempty { sdLimitClause = Limit Nothing (Just n) } @@ -903,7 +906,9 @@ makeOrderBy _ [] = mempty makeOrderBy info os = first ("\nORDER BY " <>) $ uncommas' (map mk os) where+ mk :: OrderByClause -> (TLB.Builder, [PersistValue]) mk (EOrderBy t (ERaw p f)) = first ((<> orderByType t) . parensM p) (f info)+ mk EOrderRandom = first ((<> "RANDOM()")) mempty orderByType ASC = " ASC" orderByType DESC = " DESC"
test/Test.hs view
@@ -122,8 +122,8 @@ run $ do p1k <- insert p1 p2k <- insert p2- f1k <- insert (Follow p1k p2k)- f2k <- insert (Follow p2k p1k)+ _f1k <- insert (Follow p1k p2k)+ _f2k <- insert (Follow p2k p1k) ret <- select $ from $ \followA -> do let subquery =@@ -138,8 +138,8 @@ run $ do p1k <- insert p1 p2k <- insert p2- f1k <- insert (Follow p1k p2k)- f2k <- insert (Follow p2k p1k)+ _f1k <- insert (Follow p1k p2k)+ _f2k <- insert (Follow p2k p1k) ret <- select $ from $ \followA -> do where_ $ exists $@@ -368,9 +368,9 @@ it "works with random_" $ run $ do #if defined(WITH_POSTGRESQL) || defined(WITH_MYSQL)- ret <- select $ return (random_ :: SqlExpr (Value Double))+ _ <- select $ return (random_ :: SqlExpr (Value Double)) #else- ret <- select $ return (random_ :: SqlExpr (Value Int))+ _ <- select $ return (random_ :: SqlExpr (Value Int)) #endif return () @@ -530,10 +530,10 @@ it "works with asc random_" $ run $ do- p1e <- insert' p1- p2e <- insert' p2- p3e <- insert' p3- p4e <- insert' p4+ _p1e <- insert' p1+ _p2e <- insert' p2+ _p3e <- insert' p3+ _p4e <- insert' p4 rets <- fmap S.fromList $ replicateM 11 $@@ -680,7 +680,7 @@ it "GROUP BY works with HAVING" $ run $ do p1k <- insert p1- p2k <- insert p2+ _p2k <- insert p2 p3k <- insert p3 replicateM_ 3 (insert $ BlogPost "" p1k) replicateM_ 7 (insert $ BlogPost "" p3k)@@ -700,7 +700,7 @@ run $ do p1k <- insert p1 p2k <- insert p2- p3k <- insert p3+ _p3k <- insert p3 ret <- select $ from $ \p -> do where_ (p ^. PersonName `in_` valList (personName <$> [p1, p2]))@@ -710,9 +710,9 @@ it "IN works for valList (null list)" $ run $ do- p1k <- insert p1- p2k <- insert p2- p3k <- insert p3+ _p1k <- insert p1+ _p2k <- insert p2+ _p3k <- insert p3 ret <- select $ from $ \p -> do where_ (p ^. PersonName `in_` valList [])@@ -722,7 +722,7 @@ it "IN works for subList_select" $ run $ do p1k <- insert p1- p2k <- insert p2+ _p2k <- insert p2 p3k <- insert p3 _ <- insert (BlogPost "" p1k) _ <- insert (BlogPost "" p3k)@@ -756,7 +756,7 @@ it "EXISTS works for subList_select" $ run $ do p1k <- insert p1- p2k <- insert p2+ _p2k <- insert p2 p3k <- insert p3 _ <- insert (BlogPost "" p1k) _ <- insert (BlogPost "" p3k)@@ -792,10 +792,25 @@ _ <- insert p3 insertSelect $ from $ \p -> do return $ BlogPost <# val "FakePost" <&> (p ^. PersonId)- ret <- select $ from (\(b::(SqlExpr (Entity BlogPost))) -> return countRows)+ ret <- select $ from (\(_::(SqlExpr (Entity BlogPost))) -> return countRows) liftIO $ ret `shouldBe` [Value (3::Int)] + describe "rand works" $ do+ it "returns result in random order" $+ run $ do+ _ <- insert p1+ _ <- insert p2+ _ <- insert p3+ _ <- insert p4+ ret1 <- fmap (map unValue) $ select $ from $ \p -> do+ orderBy [rand]+ return (p ^. PersonId)+ ret2 <- fmap (map unValue) $ select $ from $ \p -> do+ orderBy [rand]+ return (p ^. PersonId) + liftIO $ (ret1 == ret2) `shouldBe` False+ ---------------------------------------------------------------------- @@ -859,3 +874,6 @@ #else (runMigrationSilent migrateAll >>) $ act #endif++unValue :: Value a -> a+unValue (Value a) = a