diff --git a/src/Database/Esqueleto.hs b/src/Database/Esqueleto.hs index 4bae948..33085ec 100644 --- a/src/Database/Esqueleto.hs +++ b/src/Database/Esqueleto.hs @@ -85,6 +85,7 @@ module Database.Esqueleto , update , updateCount , insertSelect + , insertSelectCount , insertSelectDistinct , (<#) , (<&>) diff --git a/src/Database/Esqueleto/Internal/Sql.hs b/src/Database/Esqueleto/Internal/Sql.hs index df29f54..c950d23 100644 --- a/src/Database/Esqueleto/Internal/Sql.hs +++ b/src/Database/Esqueleto/Internal/Sql.hs @@ -28,6 +28,7 @@ module Database.Esqueleto.Internal.Sql , updateCount , insertSelectDistinct , insertSelect + , insertSelectCount -- * The guts , unsafeSqlCase , unsafeSqlBinOp @@ -1741,7 +1742,12 @@ to16 ((a,b),(c,d),(e,f),(g,h),(i,j),(k,l),(m,n),(o,p)) = (a,b,c,d,e,f,g,h,i,j,k, -- | Insert a 'PersistField' for every selected value. insertSelect :: (MonadIO m, PersistEntity a) => SqlQuery (SqlExpr (Insertion a)) -> SqlPersistT m () -insertSelect = liftM (const ()) . rawEsqueleto INSERT_INTO . fmap EInsertFinal +insertSelect = liftM (const ()) . insertSelectCount + +-- | Insert a 'PersistField' for every selected value, return the count afterward +insertSelectCount :: (MonadIO m, PersistEntity a) => + SqlQuery (SqlExpr (Insertion a)) -> SqlPersistT m Int64 +insertSelectCount = rawEsqueleto INSERT_INTO . fmap EInsertFinal -- | Insert a 'PersistField' for every unique selected value. diff --git a/test/Test.hs b/test/Test.hs index aca3741..80c6784 100644 --- a/test/Test.hs +++ b/test/Test.hs @@ -1208,6 +1208,18 @@ main = do ret <- select $ from (\(_::(SqlExpr (Entity BlogPost))) -> return countRows) liftIO $ ret `shouldBe` [Value (3::Int)] + describe "inserts by select, returns count" $ do + it "IN works for insertSelectCount" $ + run $ do + _ <- insert p1 + _ <- insert p2 + _ <- insert p3 + cnt <- insertSelectCount $ from $ \p -> do + return $ BlogPost <# val "FakePost" <&> (p ^. PersonId) + ret <- select $ from (\(_::(SqlExpr (Entity BlogPost))) -> return countRows) + liftIO $ ret `shouldBe` [Value (3::Int)] + liftIO $ cnt `shouldBe` 3 + describe "Math-related functions" $ do it "rand returns result in random order" $ run $ do