beam-core 0.10.5.0 → 0.11.0.0
raw patch · 9 files changed
+139/−55 lines, 9 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Database.Beam.Backend.SQL.AST: ExtractFieldDateTimeWeek :: ExtractField
+ Database.Beam.Backend.SQL.BeamExtensions: runDeleteReturningListWith :: (MonadBeamDeleteReturning be m, Beamable table, Projectible be a, FromBackendRow be (QExprToIdentity a)) => SqlDelete be table -> (table (QExpr be ()) -> a) -> m [QExprToIdentity a]
+ Database.Beam.Backend.SQL.BeamExtensions: runInsertReturningListWith :: (MonadBeamInsertReturning be m, Beamable table, Projectible be a, FromBackendRow be (QExprToIdentity a)) => SqlInsert be table -> (table (QExpr be ()) -> a) -> m [QExprToIdentity a]
+ Database.Beam.Backend.SQL.BeamExtensions: runUpdateReturningListWith :: (MonadBeamUpdateReturning be m, Beamable table, Projectible be a, FromBackendRow be (QExprToIdentity a)) => SqlUpdate be table -> (table (QExpr be ()) -> a) -> m [QExprToIdentity a]
+ Database.Beam.Backend.SQL.SQL92: weekField :: IsSql92ExtractFieldSyntax extractField => extractField
+ Database.Beam.Query: week_ :: (BeamSqlBackend be, HasSqlDate tgt) => ExtractField be tgt Double
- Database.Beam.Query: lag1_ :: (BeamSqlBackend be, BeamSqlT615Backend be) => QExpr be s a -> QAgg be s a
+ Database.Beam.Query: lag1_ :: (BeamSqlBackend be, BeamSqlT615Backend be) => QExpr be s a -> QAgg be s (Maybe a)
- Database.Beam.Query: lag_ :: (BeamSqlBackend be, BeamSqlT615Backend be, Integral n) => QExpr be s a -> QExpr be s n -> QAgg be s a
+ Database.Beam.Query: lag_ :: (BeamSqlBackend be, BeamSqlT615Backend be, Integral n) => QExpr be s a -> QExpr be s n -> QAgg be s (Maybe a)
- Database.Beam.Query: lead1_ :: (BeamSqlBackend be, BeamSqlT615Backend be) => QExpr be s a -> QAgg be s a
+ Database.Beam.Query: lead1_ :: (BeamSqlBackend be, BeamSqlT615Backend be) => QExpr be s a -> QAgg be s (Maybe a)
- Database.Beam.Query: lead_ :: (BeamSqlBackend be, BeamSqlT615Backend be, Integral n) => QExpr be s a -> QExpr be s n -> QAgg be s a
+ Database.Beam.Query: lead_ :: (BeamSqlBackend be, BeamSqlT615Backend be, Integral n) => QExpr be s a -> QExpr be s n -> QAgg be s (Maybe a)
- Database.Beam.Query: values_ :: forall be (db :: (Type -> Type) -> Type) s a. (Projectible be a, BeamSqlBackend be) => [a] -> Q be db s a
+ Database.Beam.Query: values_ :: forall be (db :: (Type -> Type) -> Type) s a. (Projectible be a, BeamSqlBackend be) => NonEmpty a -> Q be db s a
Files
- ChangeLog.md +15/−0
- Database/Beam/Backend/SQL/AST.hs +2/−0
- Database/Beam/Backend/SQL/BeamExtensions.hs +102/−46
- Database/Beam/Backend/SQL/Builder.hs +1/−0
- Database/Beam/Backend/SQL/SQL92.hs +1/−0
- Database/Beam/Query/Combinators.hs +12/−4
- Database/Beam/Query/Extensions.hs +2/−2
- Database/Beam/Query/Extract.hs +3/−2
- beam-core.cabal +1/−1
ChangeLog.md view
@@ -1,3 +1,17 @@++# 0.11.0.0++## New features++* Add projection methods to `MonadBeamInsertReturning`/`MonadBeamUpdateReturning`/`MonadBeamDeleteReturning` (#801).+* Made `genericSerial` be generic over `Integral` rathern than only `Int` (#534).+* Added the `week_` combinator to extract the week of a timestamp (#599).++## Bug fixes++* Changed the type of `values_` to `NonEmpty` rather than a list, preventing runtime exceptions (#742).+* Fixed an issue where `lead1_`, `lag1_`, `lead_`, and `lag_` did not have the appropriate type, leading to runtime exceptions (#745).+ # 0.10.5.0 ## Updated dependencies@@ -18,6 +32,7 @@ * Added a `Generic` instance to `SqlNull`, `SqlBitString`, and `SqlSerial` (#736). * Added a note to `default_` to specify that it has more restrictions than its type may indicate (#744). * Added `limitMaybe_` and `offsetMaybe_` (#633).+ ## Updated dependencies
Database/Beam/Backend/SQL/AST.hs view
@@ -156,6 +156,7 @@ | ExtractFieldDateTimeYear | ExtractFieldDateTimeMonth+ | ExtractFieldDateTimeWeek | ExtractFieldDateTimeDay | ExtractFieldDateTimeHour | ExtractFieldDateTimeMinute@@ -291,6 +292,7 @@ minutesField = ExtractFieldDateTimeMinute hourField = ExtractFieldDateTimeHour dayField = ExtractFieldDateTimeDay+ weekField = ExtractFieldDateTimeWeek monthField = ExtractFieldDateTimeMonth yearField = ExtractFieldDateTimeYear
Database/Beam/Backend/SQL/BeamExtensions.hs view
@@ -9,8 +9,11 @@ -- emulated on others. module Database.Beam.Backend.SQL.BeamExtensions ( MonadBeamInsertReturning(..)+ , runInsertReturningList , MonadBeamUpdateReturning(..)+ , runUpdateReturningList , MonadBeamDeleteReturning(..)+ , runDeleteReturningList , BeamHasInsertOnConflict(..) , SqlSerial(..)@@ -41,108 +44,161 @@ --import GHC.Generics --- | 'MonadBeam's that support returning the newly created rows of an @INSERT@ statement.--- Useful for discovering the real value of a defaulted value.+-- | 'MonadBeam's that support returning data from the newly created rows of an+-- @INSERT@ statement. Useful for discovering the real value of a defaulted+-- field (such as a serial primary key). class MonadBeam be m => MonadBeamInsertReturning be m | m -> be where- runInsertReturningList+ -- | Execute an @INSERT@ statement and return a list of values projected from+ -- the inserted rows. The projection function selects which columns are+ -- returned: pass 'id' to return the full row, or supply a custom+ -- projection to return a subset.+ runInsertReturningListWith :: ( Beamable table- , Projectible be (table (QExpr be ()))- , FromBackendRow be (table Identity) )+ , Projectible be a+ , FromBackendRow be (QExprToIdentity a) ) => SqlInsert be table- -> m [table Identity]+ -> (table (QExpr be ()) -> a)+ -> m [QExprToIdentity a] +-- | Execute an @INSERT@ statement and return the inserted rows in full.+-- A convenience around 'runInsertReturningListWith' that uses 'id' as the+-- projection.+runInsertReturningList+ :: ( MonadBeamInsertReturning be m+ , Beamable table+ , Projectible be (table (QExpr be ()))+ , FromBackendRow be (table Identity) )+ => SqlInsert be table+ -> m [table Identity]+runInsertReturningList sql = runInsertReturningListWith sql id+ instance MonadBeamInsertReturning be m => MonadBeamInsertReturning be (ExceptT e m) where- runInsertReturningList = lift . runInsertReturningList+ runInsertReturningListWith sql proj = lift $ runInsertReturningListWith sql proj instance MonadBeamInsertReturning be m => MonadBeamInsertReturning be (ContT r m) where- runInsertReturningList = lift . runInsertReturningList+ runInsertReturningListWith sql proj = lift $ runInsertReturningListWith sql proj instance MonadBeamInsertReturning be m => MonadBeamInsertReturning be (ReaderT r m) where- runInsertReturningList = lift . runInsertReturningList+ runInsertReturningListWith sql proj = lift $ runInsertReturningListWith sql proj instance MonadBeamInsertReturning be m => MonadBeamInsertReturning be (Lazy.StateT r m) where- runInsertReturningList = lift . runInsertReturningList+ runInsertReturningListWith sql proj = lift $ runInsertReturningListWith sql proj instance MonadBeamInsertReturning be m => MonadBeamInsertReturning be (Strict.StateT r m) where- runInsertReturningList = lift . runInsertReturningList+ runInsertReturningListWith sql proj = lift $ runInsertReturningListWith sql proj instance (MonadBeamInsertReturning be m, Monoid r) => MonadBeamInsertReturning be (Lazy.WriterT r m) where- runInsertReturningList = lift . runInsertReturningList+ runInsertReturningListWith sql proj = lift $ runInsertReturningListWith sql proj instance (MonadBeamInsertReturning be m, Monoid r) => MonadBeamInsertReturning be (Strict.WriterT r m) where- runInsertReturningList = lift . runInsertReturningList+ runInsertReturningListWith sql proj = lift $ runInsertReturningListWith sql proj instance (MonadBeamInsertReturning be m, Monoid w) => MonadBeamInsertReturning be (Lazy.RWST r w s m) where- runInsertReturningList = lift . runInsertReturningList+ runInsertReturningListWith sql proj = lift $ runInsertReturningListWith sql proj instance (MonadBeamInsertReturning be m, Monoid w) => MonadBeamInsertReturning be (Strict.RWST r w s m) where- runInsertReturningList = lift . runInsertReturningList+ runInsertReturningListWith sql proj = lift $ runInsertReturningListWith sql proj --- | 'MonadBeam's that support returning the updated rows of an @UPDATE@ statement.--- Useful for discovering the new values of the updated rows.+-- | 'MonadBeam's that support returning data from the updated rows of an+-- @UPDATE@ statement. Useful for observing the post-update values of the+-- affected rows. class MonadBeam be m => MonadBeamUpdateReturning be m | m -> be where- runUpdateReturningList+ -- | Execute an @UPDATE@ statement and return a list of values projected from+ -- the updated rows. The projection function selects which columns are+ -- returned: pass 'id' to return the full row, or supply a custom+ -- projection to return a subset.+ runUpdateReturningListWith :: ( Beamable table- , Projectible be (table (QExpr be ()))- , FromBackendRow be (table Identity) )+ , Projectible be a+ , FromBackendRow be (QExprToIdentity a) ) => SqlUpdate be table- -> m [table Identity]+ -> (table (QExpr be ()) -> a)+ -> m [QExprToIdentity a] +-- | Execute an @UPDATE@ statement and return the updated rows in full.+-- A convenience around 'runUpdateReturningListWith' that uses 'id' as the+-- projection.+runUpdateReturningList+ :: ( MonadBeamUpdateReturning be m+ , Beamable table+ , Projectible be (table (QExpr be ()))+ , FromBackendRow be (table Identity) )+ => SqlUpdate be table+ -> m [table Identity]+runUpdateReturningList sql = runUpdateReturningListWith sql id+ instance MonadBeamUpdateReturning be m => MonadBeamUpdateReturning be (ExceptT e m) where- runUpdateReturningList = lift . runUpdateReturningList+ runUpdateReturningListWith sql proj = lift $ runUpdateReturningListWith sql proj instance MonadBeamUpdateReturning be m => MonadBeamUpdateReturning be (ContT r m) where- runUpdateReturningList = lift . runUpdateReturningList+ runUpdateReturningListWith sql proj = lift $ runUpdateReturningListWith sql proj instance MonadBeamUpdateReturning be m => MonadBeamUpdateReturning be (ReaderT r m) where- runUpdateReturningList = lift . runUpdateReturningList+ runUpdateReturningListWith sql proj = lift $ runUpdateReturningListWith sql proj instance MonadBeamUpdateReturning be m => MonadBeamUpdateReturning be (Lazy.StateT r m) where- runUpdateReturningList = lift . runUpdateReturningList+ runUpdateReturningListWith sql proj = lift $ runUpdateReturningListWith sql proj instance MonadBeamUpdateReturning be m => MonadBeamUpdateReturning be (Strict.StateT r m) where- runUpdateReturningList = lift . runUpdateReturningList+ runUpdateReturningListWith sql proj = lift $ runUpdateReturningListWith sql proj instance (MonadBeamUpdateReturning be m, Monoid r) => MonadBeamUpdateReturning be (Lazy.WriterT r m) where- runUpdateReturningList = lift . runUpdateReturningList+ runUpdateReturningListWith sql proj = lift $ runUpdateReturningListWith sql proj instance (MonadBeamUpdateReturning be m, Monoid r) => MonadBeamUpdateReturning be (Strict.WriterT r m) where- runUpdateReturningList = lift . runUpdateReturningList+ runUpdateReturningListWith sql proj = lift $ runUpdateReturningListWith sql proj instance (MonadBeamUpdateReturning be m, Monoid w) => MonadBeamUpdateReturning be (Lazy.RWST r w s m) where- runUpdateReturningList = lift . runUpdateReturningList+ runUpdateReturningListWith sql proj = lift $ runUpdateReturningListWith sql proj instance (MonadBeamUpdateReturning be m, Monoid w) => MonadBeamUpdateReturning be (Strict.RWST r w s m) where- runUpdateReturningList = lift . runUpdateReturningList+ runUpdateReturningListWith sql proj = lift $ runUpdateReturningListWith sql proj --- | 'MonadBeam's that suppert returning rows that will be deleted by the given--- @DELETE@ statement. Useful for deallocating resources based on the value of--- deleted rows.+-- | 'MonadBeam's that support returning data from rows that will be deleted by+-- the given @DELETE@ statement. Useful for deallocating resources based on+-- the value of deleted rows. class MonadBeam be m => MonadBeamDeleteReturning be m | m -> be where- runDeleteReturningList+ -- | Execute a @DELETE@ statement and return a list of values projected from+ -- the deleted rows. The projection function selects which columns are+ -- returned: pass 'id' to return the full row, or supply a custom+ -- projection to return a subset.+ runDeleteReturningListWith :: ( Beamable table- , Projectible be (table (QExpr be ()))- , FromBackendRow be (table Identity) )+ , Projectible be a+ , FromBackendRow be (QExprToIdentity a) ) => SqlDelete be table- -> m [table Identity]+ -> (table (QExpr be ()) -> a)+ -> m [QExprToIdentity a] +-- | Execute a @DELETE@ statement and return the deleted rows in full.+-- A convenience around 'runDeleteReturningListWith' that uses 'id' as the+-- projection.+runDeleteReturningList+ :: ( MonadBeamDeleteReturning be m+ , Beamable table+ , Projectible be (table (QExpr be ()))+ , FromBackendRow be (table Identity) )+ => SqlDelete be table+ -> m [table Identity]+runDeleteReturningList sql = runDeleteReturningListWith sql id+ instance MonadBeamDeleteReturning be m => MonadBeamDeleteReturning be (ExceptT e m) where- runDeleteReturningList = lift . runDeleteReturningList+ runDeleteReturningListWith sql proj = lift $ runDeleteReturningListWith sql proj instance MonadBeamDeleteReturning be m => MonadBeamDeleteReturning be (ContT r m) where- runDeleteReturningList = lift . runDeleteReturningList+ runDeleteReturningListWith sql proj = lift $ runDeleteReturningListWith sql proj instance MonadBeamDeleteReturning be m => MonadBeamDeleteReturning be (ReaderT r m) where- runDeleteReturningList = lift . runDeleteReturningList+ runDeleteReturningListWith sql proj = lift $ runDeleteReturningListWith sql proj instance MonadBeamDeleteReturning be m => MonadBeamDeleteReturning be (Lazy.StateT r m) where- runDeleteReturningList = lift . runDeleteReturningList+ runDeleteReturningListWith sql proj = lift $ runDeleteReturningListWith sql proj instance MonadBeamDeleteReturning be m => MonadBeamDeleteReturning be (Strict.StateT r m) where- runDeleteReturningList = lift . runDeleteReturningList+ runDeleteReturningListWith sql proj = lift $ runDeleteReturningListWith sql proj instance (MonadBeamDeleteReturning be m, Monoid r) => MonadBeamDeleteReturning be (Lazy.WriterT r m) where- runDeleteReturningList = lift . runDeleteReturningList+ runDeleteReturningListWith sql proj = lift $ runDeleteReturningListWith sql proj instance (MonadBeamDeleteReturning be m, Monoid r) => MonadBeamDeleteReturning be (Strict.WriterT r m) where- runDeleteReturningList = lift . runDeleteReturningList+ runDeleteReturningListWith sql proj = lift $ runDeleteReturningListWith sql proj instance (MonadBeamDeleteReturning be m, Monoid w) => MonadBeamDeleteReturning be (Lazy.RWST r w s m) where- runDeleteReturningList = lift . runDeleteReturningList+ runDeleteReturningListWith sql proj = lift $ runDeleteReturningListWith sql proj instance (MonadBeamDeleteReturning be m, Monoid w) => MonadBeamDeleteReturning be (Strict.RWST r w s m) where- runDeleteReturningList = lift . runDeleteReturningList+ runDeleteReturningListWith sql proj = lift $ runDeleteReturningListWith sql proj class BeamSqlBackend be => BeamHasInsertOnConflict be where -- | Specifies the kind of constraint that must be violated for the action to occur
Database/Beam/Backend/SQL/Builder.hs view
@@ -191,6 +191,7 @@ minutesField = SqlSyntaxBuilder (byteString "MINUTE") hourField = SqlSyntaxBuilder (byteString "HOUR") dayField = SqlSyntaxBuilder (byteString "DAY")+ weekField = SqlSyntaxBuilder (byteString "WEEK") monthField = SqlSyntaxBuilder (byteString "MONTH") yearField = SqlSyntaxBuilder (byteString "YEAR")
Database/Beam/Backend/SQL/SQL92.hs view
@@ -206,6 +206,7 @@ minutesField :: extractField hourField :: extractField dayField :: extractField+ weekField :: extractField monthField :: extractField yearField :: extractField
Database/Beam/Query/Combinators.hs view
@@ -80,6 +80,8 @@ import Control.Monad.Free import Control.Applicative +import Data.List.NonEmpty (NonEmpty)+import qualified Data.List.NonEmpty as NonEmpty import Data.Maybe import Data.Proxy import Data.Time (LocalTime)@@ -105,16 +107,22 @@ (tableFieldsToExpressions (dbViewSettings vw)) (\_ -> Nothing) snd) --- | SQL @VALUES@ clause. Introduce the elements of the given list as+-- | SQL @VALUES@ clause. Introduce the elements of the given non-empty list as -- rows in a joined table. values_ :: forall be db s a . ( Projectible be a , BeamSqlBackend be )- => [ a ] -> Q be db s a+ => NonEmpty a+ -> Q be db s a values_ rows =- Q $ liftF (QAll (\tblPfx -> fromTable (tableFromValues (map (\row -> project (Proxy @be) row tblPfx) rows)) . Just . (,Just fieldNames))+ Q $ liftF (QAll (\tblPfx -> + fromTable + (tableFromValues (NonEmpty.toList (NonEmpty.map (\row -> project (Proxy @be) row tblPfx) rows))) + . Just + . (,Just fieldNames)) (\tblNm' -> fst $ mkFieldNames (qualifiedField tblNm'))- (\_ -> Nothing) snd)+ (\_ -> Nothing) snd+ ) where fieldNames = snd $ mkFieldNames @be @a unqualifiedField
Database/Beam/Query/Extensions.hs view
@@ -47,13 +47,13 @@ lead1_, lag1_ :: (BeamSqlBackend be, BeamSqlT615Backend be)- => QExpr be s a -> QAgg be s a+ => QExpr be s a -> QAgg be s (Maybe a) lead1_ (QExpr a) = QExpr (leadE <$> a <*> pure Nothing <*> pure Nothing) lag1_ (QExpr a) = QExpr (lagE <$> a <*> pure Nothing <*> pure Nothing) lead_, lag_ :: (BeamSqlBackend be, BeamSqlT615Backend be, Integral n)- => QExpr be s a -> QExpr be s n -> QAgg be s a+ => QExpr be s a -> QExpr be s n -> QAgg be s (Maybe a) lead_ (QExpr a) (QExpr n) = QExpr (leadE <$> a <*> (Just <$> n) <*> pure Nothing) lag_ (QExpr a) (QExpr n) = QExpr (lagE <$> a <*> (Just <$> n) <*> pure Nothing)
Database/Beam/Query/Extract.hs view
@@ -7,7 +7,7 @@ -- ** SQL92 fields hour_, minutes_, seconds_,- year_, month_, day_,+ year_, month_, week_, day_, HasSqlTime, HasSqlDate ) where@@ -53,9 +53,10 @@ instance HasSqlDate UTCTime instance HasSqlDate Day -year_, month_, day_+year_, month_, week_, day_ :: ( BeamSqlBackend be, HasSqlDate tgt ) => ExtractField be tgt Double year_ = ExtractField yearField month_ = ExtractField monthField day_ = ExtractField dayField+week_ = ExtractField weekField
beam-core.cabal view
@@ -1,5 +1,5 @@ name: beam-core-version: 0.10.5.0+version: 0.11.0.0 synopsis: Type-safe, feature-complete SQL query and manipulation interface for Haskell description: Beam is a Haskell library for type-safe querying and manipulation of SQL databases. Beam is modular and supports various backends. In order to use beam, you will need to use