relational-query 0.2.1.0 → 0.3.0.0
raw patch · 16 files changed
+137/−88 lines, 16 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Database.Relational.Query.Monad.Class: restrictContext :: MonadRestrict c m => Expr c (Maybe Bool) -> m ()
- Database.Relational.Query.Projectable: addPlaceHolders :: Functor f => f a -> f (PlaceHolders p, a)
- Database.Relational.Query.Type: restrictedDelete :: Table r -> RestrictionContext p r -> Delete p
- Database.Relational.Query.Type: targetUpdate :: Table r -> UpdateTargetContext p r -> Update p
- Database.Relational.Query.Type: targetUpdateTable :: TableDerivable r => Relation () r -> UpdateTargetContext p r -> Update p
- Database.Relational.Query.Type: typedUpdateTable :: TableDerivable r => Relation () r -> UpdateTarget p r -> Update p
+ Database.Relational.Query.Effect: instance TableDerivable r => Show (UpdateTarget p r)
+ Database.Relational.Query.Monad.Assign: instance MonadQualify ConfigureQuery (Assign r)
+ Database.Relational.Query.Monad.Restrict: instance MonadQualify ConfigureQuery Restrict
+ Database.Relational.Query.Projectable: unsafeAddPlaceHolders :: Functor f => f a -> f (PlaceHolders p, a)
+ Database.Relational.Query.Projection: predicateProjectionFromExpr :: Expr c (Maybe Bool) -> Projection c (Maybe Bool)
+ Database.Relational.Query.Type: derivedDelete :: TableDerivable r => RestrictionContext p r -> Delete p
+ Database.Relational.Query.Type: derivedDelete' :: TableDerivable r => Config -> RestrictionContext p r -> Delete p
+ Database.Relational.Query.Type: derivedUpdate :: TableDerivable r => UpdateTargetContext p r -> Update p
+ Database.Relational.Query.Type: derivedUpdate' :: TableDerivable r => Config -> UpdateTargetContext p r -> Update p
+ Database.Relational.Query.Type: typedDelete' :: Config -> Table r -> Restriction p r -> Delete p
+ Database.Relational.Query.Type: typedUpdate' :: Config -> Table r -> UpdateTarget p r -> Update p
- Database.Relational.Query.Effect: sqlFromUpdateTarget :: Table r -> UpdateTarget p r -> StringSQL
+ Database.Relational.Query.Effect: sqlFromUpdateTarget :: Config -> Table r -> UpdateTarget p r -> StringSQL
- Database.Relational.Query.Effect: sqlWhereFromRestriction :: Table r -> Restriction p r -> StringSQL
+ Database.Relational.Query.Effect: sqlWhereFromRestriction :: Config -> Table r -> Restriction p r -> StringSQL
- Database.Relational.Query.Monad.Assign: extract :: Assign r a -> ((a, Table r -> Assignments), QueryRestriction Flat)
+ Database.Relational.Query.Monad.Assign: extract :: Assign r a -> Config -> ((a, Table r -> Assignments), QueryRestriction Flat)
- Database.Relational.Query.Monad.Class: class (Functor q, Monad q, MonadQuery m) => MonadQualify q m
+ Database.Relational.Query.Monad.Class: class (Functor q, Monad q, Functor m, Monad m) => MonadQualify q m
- Database.Relational.Query.Monad.Class: restrictJoin :: MonadQuery m => Expr Flat (Maybe Bool) -> m ()
+ Database.Relational.Query.Monad.Class: restrictJoin :: MonadQuery m => Projection Flat (Maybe Bool) -> m ()
- Database.Relational.Query.Monad.Restrict: extract :: Restrict a -> (a, QueryRestriction Flat)
+ Database.Relational.Query.Monad.Restrict: extract :: Restrict a -> Config -> (a, QueryRestriction Flat)
- Database.Relational.Query.Monad.Restrict: type Restrict = Restrictings Flat Identity
+ Database.Relational.Query.Monad.Restrict: type Restrict = Restrictings Flat ConfigureQuery
- Database.Relational.Query.Relation: query :: MonadQualify ConfigureQuery m => Relation () r -> m (Projection Flat r)
+ Database.Relational.Query.Relation: query :: (MonadQualify ConfigureQuery m, MonadQuery m) => Relation () r -> m (Projection Flat r)
- Database.Relational.Query.Relation: query' :: MonadQualify ConfigureQuery m => Relation p r -> m (PlaceHolders p, Projection Flat r)
+ Database.Relational.Query.Relation: query' :: (MonadQualify ConfigureQuery m, MonadQuery m) => Relation p r -> m (PlaceHolders p, Projection Flat r)
- Database.Relational.Query.Relation: queryMaybe :: MonadQualify ConfigureQuery m => Relation () r -> m (Projection Flat (Maybe r))
+ Database.Relational.Query.Relation: queryMaybe :: (MonadQualify ConfigureQuery m, MonadQuery m) => Relation () r -> m (Projection Flat (Maybe r))
- Database.Relational.Query.Relation: queryMaybe' :: MonadQualify ConfigureQuery m => Relation p r -> m (PlaceHolders p, Projection Flat (Maybe r))
+ Database.Relational.Query.Relation: queryMaybe' :: (MonadQualify ConfigureQuery m, MonadQuery m) => Relation p r -> m (PlaceHolders p, Projection Flat (Maybe r))
- Database.Relational.Query.Type: deleteSQL :: Table r -> Restriction p r -> String
+ Database.Relational.Query.Type: deleteSQL :: Config -> Table r -> Restriction p r -> String
- Database.Relational.Query.Type: updateSQL :: Table r -> UpdateTarget p r -> String
+ Database.Relational.Query.Type: updateSQL :: Config -> Table r -> UpdateTarget p r -> String
Files
- relational-query.cabal +1/−1
- src/Database/Relational/Query/Effect.hs +14/−11
- src/Database/Relational/Query/Monad/Aggregate.hs +1/−1
- src/Database/Relational/Query/Monad/Assign.hs +14/−2
- src/Database/Relational/Query/Monad/Class.hs +12/−16
- src/Database/Relational/Query/Monad/Restrict.hs +16/−7
- src/Database/Relational/Query/Monad/Trans/Aggregating.hs +1/−1
- src/Database/Relational/Query/Monad/Trans/Assigning.hs +1/−1
- src/Database/Relational/Query/Monad/Trans/Join.hs +2/−1
- src/Database/Relational/Query/Monad/Trans/Ordering.hs +1/−1
- src/Database/Relational/Query/Monad/Trans/Restricting.hs +2/−1
- src/Database/Relational/Query/Monad/Unique.hs +1/−1
- src/Database/Relational/Query/Projectable.hs +3/−3
- src/Database/Relational/Query/Projection.hs +9/−2
- src/Database/Relational/Query/Relation.hs +20/−10
- src/Database/Relational/Query/Type.hs +39/−29
relational-query.cabal view
@@ -1,5 +1,5 @@ name: relational-query-version: 0.2.1.0+version: 0.3.0.0 synopsis: Typeful, Modular, Relational, algebraic query engine description: This package contiains typeful relation structure and relational-algebraic query building DSL which can
src/Database/Relational/Query/Effect.hs view
@@ -32,11 +32,11 @@ import Database.Relational.Query.Context (Flat) import Database.Relational.Query.Pi (id') import Database.Relational.Query.Table (Table, TableDerivable, derivedTable)-import Database.Relational.Query.Component (composeWhere, composeSets)+import Database.Relational.Query.Component (Config, defaultConfig, composeWhere, composeSets) import Database.Relational.Query.Projection (Projection) import qualified Database.Relational.Query.Projection as Projection import Database.Relational.Query.Projectable- (PlaceHolders, placeholder, addPlaceHolders, (><), rightId)+ (PlaceHolders, placeholder, unsafeAddPlaceHolders, (><), rightId) import Database.Relational.Query.Monad.Trans.Assigning (assignings, (<-#)) import Database.Relational.Query.Monad.Restrict (Restrict, RestrictedStatement)@@ -62,16 +62,16 @@ runRestriction :: Restriction p r -> RestrictedStatement r (PlaceHolders p) runRestriction (Restriction qf) =- fmap fst . addPlaceHolders . qf+ fmap fst . unsafeAddPlaceHolders . qf -- | SQL WHERE clause 'StringSQL' string from 'Restriction'.-sqlWhereFromRestriction :: Table r -> Restriction p r -> StringSQL-sqlWhereFromRestriction tbl (Restriction q) = composeWhere rs- where (_ph, rs) = Restrict.extract (q $ Projection.unsafeFromTable tbl)+sqlWhereFromRestriction :: Config -> Table r -> Restriction p r -> StringSQL+sqlWhereFromRestriction config tbl (Restriction q) = composeWhere rs+ where (_ph, rs) = Restrict.extract (q $ Projection.unsafeFromTable tbl) config -- | Show where clause. instance TableDerivable r => Show (Restriction p r) where- show = showStringSQL . sqlWhereFromRestriction derivedTable+ show = showStringSQL . sqlWhereFromRestriction defaultConfig derivedTable -- | UpdateTarget type with place-holder parameter 'p' and projection record type 'r'. newtype UpdateTarget p r = UpdateTarget (AssignStatement r ())@@ -92,7 +92,7 @@ _runUpdateTarget :: UpdateTarget p r -> AssignStatement r (PlaceHolders p) _runUpdateTarget (UpdateTarget qf) =- fmap fst . addPlaceHolders . qf+ fmap fst . unsafeAddPlaceHolders . qf updateAllColumn :: PersistableWidth r => Restriction p r@@ -128,6 +128,9 @@ -- | SQL SET clause and WHERE clause 'StringSQL' string from 'UpdateTarget'-sqlFromUpdateTarget :: Table r -> UpdateTarget p r -> StringSQL-sqlFromUpdateTarget tbl (UpdateTarget q) = composeSets (asR tbl) <> composeWhere rs- where ((_ph, asR), rs) = Assign.extract (q (Projection.unsafeFromTable tbl))+sqlFromUpdateTarget :: Config -> Table r -> UpdateTarget p r -> StringSQL+sqlFromUpdateTarget config tbl (UpdateTarget q) = composeSets (asR tbl) <> composeWhere rs+ where ((_ph, asR), rs) = Assign.extract (q (Projection.unsafeFromTable tbl)) config++instance TableDerivable r => Show (UpdateTarget p r) where+ show = showStringSQL . sqlFromUpdateTarget defaultConfig derivedTable
src/Database/Relational/Query/Monad/Aggregate.hs view
@@ -65,7 +65,7 @@ -- | Restricted 'MonadRestrict' instance. instance MonadRestrict Flat q => MonadRestrict Flat (Restrictings Aggregated q) where- restrictContext = restrictings . restrictContext+ restrict = restrictings . restrict -- | Instance to lift from qualified table forms into 'QueryAggregate'. instance MonadQualify ConfigureQuery QueryAggregate where
src/Database/Relational/Query/Monad/Assign.hs view
@@ -1,3 +1,7 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+ -- | -- Module : Database.Relational.Query.Monad.Assign -- Copyright : 2013 Kei Hibino@@ -15,13 +19,17 @@ extract, ) where -import Database.Relational.Query.Component (QueryRestriction, Assignments)+import Control.Monad.Trans.Class (lift)++import Database.Relational.Query.Component (Config, QueryRestriction, Assignments) import Database.Relational.Query.Context (Flat) import Database.Relational.Query.Table (Table) import Database.Relational.Query.Projection (Projection)+import Database.Relational.Query.Monad.Class (MonadQualify(..)) import Database.Relational.Query.Monad.Restrict (Restrict) import qualified Database.Relational.Query.Monad.Restrict as Restrict import Database.Relational.Query.Monad.Trans.Assigning (Assignings, extractAssignments)+import Database.Relational.Query.Monad.Type (ConfigureQuery) -- | Target update monad type used from update statement and merge statement. type Assign r = Assignings r Restrict@@ -32,10 +40,14 @@ -- the same as 'Target' type parameter 'r'. type AssignStatement r a = Projection Flat r -> Assign r a +-- | Instance to lift from qualified table forms into 'Restrict'.+instance MonadQualify ConfigureQuery (Assign r) where+ liftQualify = lift . liftQualify+ -- -- | 'return' of 'Update' -- updateStatement :: a -> Assignings r (Restrictings Identity) a -- updateStatement = assignings . restrictings . Identity -- | Run 'Assign'.-extract :: Assign r a -> ((a, Table r -> Assignments), QueryRestriction Flat)+extract :: Assign r a -> Config -> ((a, Table r -> Assignments), QueryRestriction Flat) extract = Restrict.extract . extractAssignments
src/Database/Relational/Query/Monad/Class.hs view
@@ -16,7 +16,7 @@ MonadQualify (..), MonadQualifyUnique(..), MonadRestrict (..), MonadQuery (..), MonadAggregate (..), MonadPartition (..), - all', distinct, restrict,+ all', distinct, onE, on, wheresE, wheres, groupBy, havingE, having@@ -26,9 +26,8 @@ import Database.Relational.Query.Expr (Expr) import Database.Relational.Query.Component (Duplication (..), AggregateElem, AggregateColumnRef, aggregateColumnRef)-import Database.Relational.Query.Projection (Projection)+import Database.Relational.Query.Projection (Projection, predicateProjectionFromExpr) import qualified Database.Relational.Query.Projection as Projection-import Database.Relational.Query.Projectable (expr) import Database.Relational.Query.Sub (SubQuery, Qualified) import Database.Relational.Query.Internal.Product (NodeAttr)@@ -36,27 +35,28 @@ -- | Restrict context interface class (Functor m, Monad m) => MonadRestrict c m where -- | Add restriction to this context.- restrictContext :: Expr c (Maybe Bool) -- ^ 'Expr' 'Projection' which represent restriction- -> m () -- ^ Restricted query context+ restrict :: Projection c (Maybe Bool) -- ^ 'Projection' which represent restriction+ -> m () -- ^ Restricted query context -- | Query building interface. class (Functor m, Monad m) => MonadQuery m where -- | Specify duplication. setDuplication :: Duplication -> m () -- | Add restriction to last join.- restrictJoin :: Expr Flat (Maybe Bool) -- ^ 'Expr' 'Projection' which represent restriction- -> m () -- ^ Restricted query context+ restrictJoin :: Projection Flat (Maybe Bool) -- ^ 'Projection' which represent restriction+ -> m () -- ^ Restricted query context -- | Unsafely join subquery with this query. unsafeSubQuery :: NodeAttr -- ^ Attribute maybe or just -> Qualified SubQuery -- ^ 'SubQuery' to join -> m (Projection Flat r) -- ^ Result joined context and 'SubQuery' result projection. -- | Lift interface from base qualify monad.-class (Functor q, Monad q, MonadQuery m) => MonadQualify q m where+class (Functor q, Monad q, Functor m, Monad m) => MonadQualify q m where -- | Lift from qualify monad 'q' into 'MonadQuery' m. -- Qualify monad qualifies table form 'SubQuery'. liftQualify :: q a -> m a +-- The only method to lift to QueryUnique. -- | Lift interface from base qualify monad. Another constraint to support unique query. class (Functor q, Monad q, MonadQuery m) => MonadQualifyUnique q m where -- | Lift from qualify monad 'q' into 'MonadQuery' m.@@ -84,19 +84,15 @@ -- | Add restriction to last join. onE :: MonadQuery m => Expr Flat (Maybe Bool) -> m ()-onE = restrictJoin+onE = restrictJoin . predicateProjectionFromExpr -- | Add restriction to last join. Projection type version. on :: MonadQuery m => Projection Flat (Maybe Bool) -> m ()-on = restrictJoin . expr---- | Add restriction to this query.-restrict :: MonadRestrict c m => Projection c (Maybe Bool) -> m ()-restrict = restrictContext . expr+on = restrictJoin -- | Add restriction to this query. Expr type version. wheresE :: MonadRestrict Flat m => Expr Flat (Maybe Bool) -> m ()-wheresE = restrictContext+wheresE = restrict . predicateProjectionFromExpr -- | Add restriction to this not aggregated query. wheres :: MonadRestrict Flat m => Projection Flat (Maybe Bool) -> m ()@@ -112,7 +108,7 @@ -- | Add restriction to this aggregated query. Expr type version. havingE :: MonadRestrict Aggregated m => Expr Aggregated (Maybe Bool) -> m ()-havingE = restrictContext+havingE = restrict . predicateProjectionFromExpr -- | Add restriction to this aggregated query. Aggregated Projection type version. having :: MonadRestrict Aggregated m => Projection Aggregated (Maybe Bool) -> m ()
src/Database/Relational/Query/Monad/Restrict.hs view
@@ -1,3 +1,7 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+ -- | -- Module : Database.Relational.Query.Monad.Restrict -- Copyright : 2013 Kei Hibino@@ -16,26 +20,31 @@ extract ) where -import Data.Functor.Identity (Identity (..), runIdentity)--import Database.Relational.Query.Component (QueryRestriction)+import Database.Relational.Query.Component (Config, QueryRestriction) import Database.Relational.Query.Context (Flat) import Database.Relational.Query.Projection (Projection)-import Database.Relational.Query.Monad.Trans.Restricting (Restrictings, extractRestrict)+import Database.Relational.Query.Monad.Class (MonadQualify(..))+import Database.Relational.Query.Monad.Trans.Restricting+ (Restrictings, restrictings, extractRestrict)+import Database.Relational.Query.Monad.Type (ConfigureQuery, configureQuery) -- | Restrict only monad type used from update statement and delete statement.-type Restrict = Restrictings Flat Identity+type Restrict = Restrictings Flat ConfigureQuery -- | RestrictedStatement type synonym. -- Projection record type 'r' must be -- the same as 'Restrictings' type parameter 'r'. type RestrictedStatement r a = Projection Flat r -> Restrict a +-- | Instance to lift from qualified table forms into 'Restrict'.+instance MonadQualify ConfigureQuery Restrict where+ liftQualify = restrictings+ -- -- | 'return' of 'Restrict' -- restricted :: a -> Restrict a -- restricted = restrict . Identity -- | Run 'Restrict' to get 'QueryRestriction'.-extract :: Restrict a -> (a, QueryRestriction Flat)-extract = runIdentity . extractRestrict+extract :: Restrict a -> Config -> (a, QueryRestriction Flat)+extract = configureQuery . extractRestrict
src/Database/Relational/Query/Monad/Trans/Aggregating.hs view
@@ -77,7 +77,7 @@ -- | Aggregated 'MonadRestrict'. instance MonadRestrict c m => MonadRestrict c (AggregatingSetT m) where- restrictContext = aggregatings . restrictContext+ restrict = aggregatings . restrict -- | Aggregated 'MonadQuery'. instance MonadQuery m => MonadQuery (AggregatingSetT m) where
src/Database/Relational/Query/Monad/Trans/Assigning.hs view
@@ -53,7 +53,7 @@ -- | 'MonadRestrict' with ordering. instance MonadRestrict c m => MonadRestrict c (Assignings r m) where- restrictContext = assignings . restrictContext+ restrict = assignings . restrict -- | Target of assignment. type AssignTarget r v = Pi r v
src/Database/Relational/Query/Monad/Trans/Join.hs view
@@ -36,6 +36,7 @@ import Database.Relational.Query.Expr (Expr, fromJust) import Database.Relational.Query.Component (Duplication (All)) import Database.Relational.Query.Sub (SubQuery, Qualified, JoinProduct)+import Database.Relational.Query.Projectable (expr) import Database.Relational.Query.Monad.Class (MonadQuery (..)) @@ -62,7 +63,7 @@ -- | Joinable query instance. instance (Monad q, Functor q) => MonadQuery (QueryJoin q) where setDuplication = QueryJoin . lift . tell . Last . Just- restrictJoin = updateJoinRestriction+ restrictJoin = updateJoinRestriction . expr unsafeSubQuery = unsafeSubQueryWithAttr -- | Unsafely join subquery with this query.
src/Database/Relational/Query/Monad/Trans/Ordering.hs view
@@ -52,7 +52,7 @@ -- | 'MonadRestrict' with ordering. instance MonadRestrict rc m => MonadRestrict rc (Orderings c m) where- restrictContext = orderings . restrictContext+ restrict = orderings . restrict -- | 'MonadQuery' with ordering. instance MonadQuery m => MonadQuery (Orderings c m) where
src/Database/Relational/Query/Monad/Trans/Restricting.hs view
@@ -28,6 +28,7 @@ import Database.Relational.Query.Expr (Expr, fromJust) import Database.Relational.Query.Component (QueryRestriction)+import Database.Relational.Query.Projectable (expr) import Database.Relational.Query.Monad.Class (MonadRestrict(..), MonadQuery (..), MonadAggregate(..)) @@ -49,7 +50,7 @@ -- | 'MonadRestrict' instance. instance (Monad q, Functor q) => MonadRestrict c (Restrictings c q) where- restrictContext = updateRestriction+ restrict = updateRestriction . expr -- | Restricted 'MonadQuery' instance. instance MonadQuery q => MonadQuery (Restrictings c q) where
src/Database/Relational/Query/Monad/Unique.hs view
@@ -41,7 +41,7 @@ queryUnique :: ConfigureQuery a -> QueryUnique a queryUnique = QueryUnique . restrictings . join' --- | Instance to lift from qualified table forms into 'QuerySimple'.+-- | Instance to lift from qualified table forms into 'QueryUnique'. instance MonadQualifyUnique ConfigureQuery QueryUnique where liftQualifyUnique = queryUnique
src/Database/Relational/Query/Projectable.hs view
@@ -26,7 +26,7 @@ unsafeValueNull, -- * Placeholders- PlaceHolders, addPlaceHolders, unsafePlaceHolders,+ PlaceHolders, unsafeAddPlaceHolders, unsafePlaceHolders, placeholder', placeholder, unitPlaceHolder, -- * Projectable into SQL strings@@ -493,8 +493,8 @@ data PlaceHolders p = PlaceHolders -- | Unsafely add placeholder parameter to queries.-addPlaceHolders :: Functor f => f a -> f (PlaceHolders p, a)-addPlaceHolders = fmap ((,) PlaceHolders)+unsafeAddPlaceHolders :: Functor f => f a -> f (PlaceHolders p, a)+unsafeAddPlaceHolders = fmap ((,) PlaceHolders) -- | Unsafely get placeholder parameter unsafePlaceHolders :: PlaceHolders p
src/Database/Relational/Query/Projection.hs view
@@ -22,6 +22,7 @@ unsafeFromQualifiedSubQuery, unsafeFromScalarSubQuery, unsafeFromTable,+ predicateProjectionFromExpr, -- * Projections pi, piMaybe, piMaybe',@@ -47,15 +48,16 @@ import Database.Relational.Query.Internal.SQL (rowListStringString) import Database.Relational.Query.Context (Aggregated, Flat)-import Database.Relational.Query.Component (ColumnSQL)+import Database.Relational.Query.Component (ColumnSQL, columnSQL') import Database.Relational.Query.Table (Table) import qualified Database.Relational.Query.Table as Table import Database.Relational.Query.Pure (ProductConstructor (..))+import Database.Relational.Query.Expr.Unsafe (Expr, sqlExpr) import Database.Relational.Query.Pi (Pi) import qualified Database.Relational.Query.Pi.Unsafe as UnsafePi import Database.Relational.Query.Sub (SubQuery, Qualified,- UntypedProjection, widthOfUntypedProjection, columnsOfUntypedProjection,+ UntypedProjection, widthOfUntypedProjection, columnsOfUntypedProjection, untypedProjectionFromColumns, untypedProjectionFromColumns, untypedProjectionFromJoinedSubQuery, untypedProjectionFromScalarSubQuery) import qualified Database.Relational.Query.Sub as SubQuery @@ -97,6 +99,11 @@ unsafeFromTable :: Table r -> Projection c r unsafeFromTable = unsafeFromColumns . Table.columns++-- | Lift 'Expr' to 'Projection' to use as restrict predicate.+predicateProjectionFromExpr :: Expr c (Maybe Bool) -> Projection c (Maybe Bool)+predicateProjectionFromExpr =+ typedProjection . untypedProjectionFromColumns . (:[]) . columnSQL' . sqlExpr -- | Unsafely trace projection path.
src/Database/Relational/Query/Relation.hs view
@@ -73,7 +73,7 @@ (Projection, ListProjection, unsafeListProjectionFromSubQuery) import qualified Database.Relational.Query.Projection as Projection import Database.Relational.Query.Projectable- (PlaceHolders, unitPlaceHolder, addPlaceHolders, unsafePlaceHolders, projectZip)+ (PlaceHolders, unitPlaceHolder, unsafeAddPlaceHolders, unsafePlaceHolders, projectZip) import Database.Relational.Query.ProjectableExtended ((!)) @@ -106,9 +106,11 @@ -- subQueryFromRelation = configureQuery . subQueryQualifyFromRelation -- | Basic monadic join operation using 'MonadQuery'.-queryWithAttr :: MonadQualify ConfigureQuery m- => NodeAttr -> Relation p r -> m (PlaceHolders p, Projection Flat r)-queryWithAttr attr = addPlaceHolders . run where+queryWithAttr :: (MonadQualify ConfigureQuery m, MonadQuery m)+ => NodeAttr+ -> Relation p r+ -> m (PlaceHolders p, Projection Flat r)+queryWithAttr attr = unsafeAddPlaceHolders . run where run rel = do q <- liftQualify $ do sq <- subQueryQualifyFromRelation rel@@ -117,21 +119,29 @@ -- d (Relation q) = unsafeMergeAnotherQuery attr q -- | Join subquery with place-holder parameter 'p'. query result is not 'Maybe'.-query' :: MonadQualify ConfigureQuery m => Relation p r -> m (PlaceHolders p, Projection Flat r)+query' :: (MonadQualify ConfigureQuery m, MonadQuery m)+ => Relation p r+ -> m (PlaceHolders p, Projection Flat r) query' = queryWithAttr Just' -- | Join subquery. Query result is not 'Maybe'.-query :: MonadQualify ConfigureQuery m => Relation () r -> m (Projection Flat r)+query :: (MonadQualify ConfigureQuery m, MonadQuery m)+ => Relation () r+ -> m (Projection Flat r) query = fmap snd . query' -- | Join subquery with place-holder parameter 'p'. Query result is 'Maybe'.-queryMaybe' :: MonadQualify ConfigureQuery m => Relation p r -> m (PlaceHolders p, Projection Flat (Maybe r))+queryMaybe' :: (MonadQualify ConfigureQuery m, MonadQuery m)+ => Relation p r+ -> m (PlaceHolders p, Projection Flat (Maybe r)) queryMaybe' pr = do (ph, pj) <- queryWithAttr Maybe pr return (ph, Projection.just pj) -- | Join subquery. Query result is 'Maybe'.-queryMaybe :: MonadQualify ConfigureQuery m => Relation () r -> m (Projection Flat (Maybe r))+queryMaybe :: (MonadQualify ConfigureQuery m, MonadQuery m)+ => Relation () r+ -> m (Projection Flat (Maybe r)) queryMaybe = fmap snd . queryMaybe' queryList0 :: MonadQualify ConfigureQuery m => Relation p r -> m (ListProjection (Projection c) r)@@ -393,7 +403,7 @@ => NodeAttr -> UniqueRelation p c r -> m (PlaceHolders p, Projection c r)-uniqueQueryWithAttr attr = addPlaceHolders . run where+uniqueQueryWithAttr attr = unsafeAddPlaceHolders . run where run rel = do q <- liftQualifyUnique $ do sq <- subQueryQualifyFromRelation (unUnique rel)@@ -432,7 +442,7 @@ => UniqueRelation p c r -> m (PlaceHolders p, Projection c (Maybe r)) queryScalar' ur =- addPlaceHolders . liftQualify $+ unsafeAddPlaceHolders . liftQualify $ Projection.unsafeFromScalarSubQuery <$> subQueryQualifyFromRelation (unUnique ur) -- | Scalar subQuery.
src/Database/Relational/Query/Type.hs view
@@ -18,7 +18,7 @@ -- * Typed update statement KeyUpdate (..), unsafeTypedKeyUpdate, typedKeyUpdate, typedKeyUpdateTable,- Update (..), unsafeTypedUpdate, typedUpdate, typedUpdateTable, targetUpdate, targetUpdateTable,+ Update (..), unsafeTypedUpdate, typedUpdate', typedUpdate, derivedUpdate', derivedUpdate, typedUpdateAllColumn, restrictedUpdateAllColumn, restrictedUpdateTableAllColumn, updateSQL,@@ -30,7 +30,7 @@ insertQuerySQL, -- * Typed delete statement- Delete (..), unsafeTypedDelete, typedDelete, restrictedDelete,+ Delete (..), unsafeTypedDelete, typedDelete', typedDelete, derivedDelete', derivedDelete, deleteSQL, @@ -113,31 +113,31 @@ unsafeTypedUpdate :: String -> Update p unsafeTypedUpdate = Update --- | Make untyped update SQL string from 'Table' and 'Restriction'.-updateSQL :: Table r -> UpdateTarget p r -> String-updateSQL tbl ut = showStringSQL $ updatePrefixSQL tbl <> sqlFromUpdateTarget tbl ut+-- | Make untyped update SQL string from 'Table' and 'UpdateTarget'.+updateSQL :: Config -> Table r -> UpdateTarget p r -> String+updateSQL config tbl ut = showStringSQL $ updatePrefixSQL tbl <> sqlFromUpdateTarget config tbl ut --- | Make typed 'Update' from 'Table' and 'Restriction'.+-- | Make typed 'Update' from 'Config', 'Table' and 'UpdateTarget'.+typedUpdate' :: Config -> Table r -> UpdateTarget p r -> Update p+typedUpdate' config tbl ut = unsafeTypedUpdate $ updateSQL config tbl ut++-- | Make typed 'Update' using 'defaultConfig', 'Table' and 'UpdateTarget'. typedUpdate :: Table r -> UpdateTarget p r -> Update p-typedUpdate tbl ut = unsafeTypedUpdate $ updateSQL tbl ut+typedUpdate = typedUpdate' defaultConfig --- | Make typed 'Update' object using derived info specified by 'Relation' type.-typedUpdateTable :: TableDerivable r => Relation () r -> UpdateTarget p r -> Update p-typedUpdateTable = typedUpdate . tableOf+targetTable :: TableDerivable r => UpdateTarget p r -> Table r+targetTable = const derivedTable --- | Directly make typed 'Update' from 'Table' and 'Target' monad context.-targetUpdate :: Table r- -> UpdateTargetContext p r -- ^ 'Target' monad context- -> Update p-targetUpdate tbl = typedUpdate tbl . updateTarget'+-- | Make typed 'Update' from 'Config', derived table and 'UpdateTargetContext'+derivedUpdate' :: TableDerivable r => Config -> UpdateTargetContext p r -> Update p+derivedUpdate' config utc = typedUpdate' config (targetTable ut) ut where+ ut = updateTarget' utc --- | Directly make typed 'Update' from 'Relation' and 'Target' monad context.-targetUpdateTable :: TableDerivable r- => Relation () r- -> UpdateTargetContext p r -- ^ 'Target' monad context- -> Update p-targetUpdateTable = targetUpdate . tableOf+-- | Make typed 'Update' from 'defaultConfig', derived table and 'UpdateTargetContext'+derivedUpdate :: TableDerivable r => UpdateTargetContext p r -> Update p+derivedUpdate = derivedUpdate' defaultConfig + -- | Make typed 'Update' from 'Table' and 'Restriction'. -- Update target is all column. typedUpdateAllColumn :: PersistableWidth r@@ -232,18 +232,28 @@ unsafeTypedDelete = Delete -- | Make untyped delete SQL string from 'Table' and 'Restriction'.-deleteSQL :: Table r -> Restriction p r -> String-deleteSQL tbl r = showStringSQL $ deletePrefixSQL tbl <> sqlWhereFromRestriction tbl r+deleteSQL :: Config -> Table r -> Restriction p r -> String+deleteSQL config tbl r = showStringSQL $ deletePrefixSQL tbl <> sqlWhereFromRestriction config tbl r +-- | Make typed 'Delete' from 'Config', 'Table' and 'Restriction'.+typedDelete' :: Config -> Table r -> Restriction p r -> Delete p+typedDelete' config tbl r = unsafeTypedDelete $ deleteSQL config tbl r+ -- | Make typed 'Delete' from 'Table' and 'Restriction'. typedDelete :: Table r -> Restriction p r -> Delete p-typedDelete tbl r = unsafeTypedDelete $ deleteSQL tbl r+typedDelete = typedDelete' defaultConfig --- | Directly make typed 'Delete' from 'Table' and 'Restrict' monad context.-restrictedDelete :: Table r- -> RestrictionContext p r -- ^ 'Restrict' monad context.- -> Delete p-restrictedDelete tbl = typedDelete tbl . restriction'+restrictedTable :: TableDerivable r => Restriction p r -> Table r+restrictedTable = const derivedTable++-- | Make typed 'Delete' from 'Config', derived table and 'RestrictContext'+derivedDelete' :: TableDerivable r => Config -> RestrictionContext p r -> Delete p+derivedDelete' config rc = typedDelete' config (restrictedTable rs) rs where+ rs = restriction' rc++-- | Make typed 'Delete' from 'defaultConfig', derived table and 'RestrictContext'+derivedDelete :: TableDerivable r => RestrictionContext p r -> Delete p+derivedDelete = derivedDelete' defaultConfig -- | Show delete SQL string instance Show (Delete p) where