-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Type-safe EDSL for SQL queries on persistent backends. -- @package esqueleto @version 2.2.2 -- | This is an internal module, anything exported by this module may -- change without a major version bump. Please use only -- Database.Esqueleto if possible. module Database.Esqueleto.Internal.Language -- | Finally tagless representation of esqueleto's EDSL. class (Functor query, Applicative query, Monad query) => Esqueleto query expr backend | query -> expr backend, expr -> query backend fromStart :: (Esqueleto query expr backend, PersistEntity a, PersistEntityBackend a ~ backend) => query (expr (PreprocessedFrom (expr (Entity a)))) fromStartMaybe :: (Esqueleto query expr backend, PersistEntity a, PersistEntityBackend a ~ backend) => query (expr (PreprocessedFrom (expr (Maybe (Entity a))))) fromJoin :: (Esqueleto query expr backend, IsJoinKind join) => expr (PreprocessedFrom a) -> expr (PreprocessedFrom b) -> query (expr (PreprocessedFrom (join a b))) fromFinish :: Esqueleto query expr backend => expr (PreprocessedFrom a) -> query a where_ :: Esqueleto query expr backend => expr (Value Bool) -> query () on :: Esqueleto query expr backend => expr (Value Bool) -> query () groupBy :: (Esqueleto query expr backend, ToSomeValues expr a) => a -> query () orderBy :: Esqueleto query expr backend => [expr OrderBy] -> query () asc :: (Esqueleto query expr backend, PersistField a) => expr (Value a) -> expr OrderBy desc :: (Esqueleto query expr backend, PersistField a) => expr (Value a) -> expr OrderBy limit :: Esqueleto query expr backend => Int64 -> query () offset :: Esqueleto query expr backend => Int64 -> query () rand :: Esqueleto query expr backend => expr OrderBy having :: Esqueleto query expr backend => expr (Value Bool) -> query () sub_select :: (Esqueleto query expr backend, PersistField a) => query (expr (Value a)) -> expr (Value a) sub_selectDistinct :: (Esqueleto query expr backend, PersistField a) => query (expr (Value a)) -> expr (Value a) (^.) :: (Esqueleto query expr backend, PersistEntity val, PersistField typ) => expr (Entity val) -> EntityField val typ -> expr (Value typ) (?.) :: (Esqueleto query expr backend, PersistEntity val, PersistField typ) => expr (Maybe (Entity val)) -> EntityField val typ -> expr (Value (Maybe typ)) val :: (Esqueleto query expr backend, PersistField typ) => typ -> expr (Value typ) isNothing :: (Esqueleto query expr backend, PersistField typ) => expr (Value (Maybe typ)) -> expr (Value Bool) just :: Esqueleto query expr backend => expr (Value typ) -> expr (Value (Maybe typ)) nothing :: Esqueleto query expr backend => expr (Value (Maybe typ)) joinV :: Esqueleto query expr backend => expr (Value (Maybe (Maybe typ))) -> expr (Value (Maybe typ)) countRows :: (Esqueleto query expr backend, Num a) => expr (Value a) count :: (Esqueleto query expr backend, Num a) => expr (Value typ) -> expr (Value a) not_ :: Esqueleto query expr backend => expr (Value Bool) -> expr (Value Bool) (==.) :: (Esqueleto query expr backend, PersistField typ) => expr (Value typ) -> expr (Value typ) -> expr (Value Bool) (>=.) :: (Esqueleto query expr backend, PersistField typ) => expr (Value typ) -> expr (Value typ) -> expr (Value Bool) (>.) :: (Esqueleto query expr backend, PersistField typ) => expr (Value typ) -> expr (Value typ) -> expr (Value Bool) (<=.) :: (Esqueleto query expr backend, PersistField typ) => expr (Value typ) -> expr (Value typ) -> expr (Value Bool) (<.) :: (Esqueleto query expr backend, PersistField typ) => expr (Value typ) -> expr (Value typ) -> expr (Value Bool) (!=.) :: (Esqueleto query expr backend, PersistField typ) => expr (Value typ) -> expr (Value typ) -> expr (Value Bool) (&&.) :: Esqueleto query expr backend => expr (Value Bool) -> expr (Value Bool) -> expr (Value Bool) (||.) :: Esqueleto query expr backend => expr (Value Bool) -> expr (Value Bool) -> expr (Value Bool) (+.) :: (Esqueleto query expr backend, PersistField a) => expr (Value a) -> expr (Value a) -> expr (Value a) (-.) :: (Esqueleto query expr backend, PersistField a) => expr (Value a) -> expr (Value a) -> expr (Value a) (/.) :: (Esqueleto query expr backend, PersistField a) => expr (Value a) -> expr (Value a) -> expr (Value a) (*.) :: (Esqueleto query expr backend, PersistField a) => expr (Value a) -> expr (Value a) -> expr (Value a) random_ :: (Esqueleto query expr backend, PersistField a, Num a) => expr (Value a) round_ :: (Esqueleto query expr backend, PersistField a, Num a, PersistField b, Num b) => expr (Value a) -> expr (Value b) ceiling_ :: (Esqueleto query expr backend, PersistField a, Num a, PersistField b, Num b) => expr (Value a) -> expr (Value b) floor_ :: (Esqueleto query expr backend, PersistField a, Num a, PersistField b, Num b) => expr (Value a) -> expr (Value b) sum_ :: (Esqueleto query expr backend, PersistField a, PersistField b) => expr (Value a) -> expr (Value (Maybe b)) min_ :: (Esqueleto query expr backend, PersistField a) => expr (Value a) -> expr (Value (Maybe a)) max_ :: (Esqueleto query expr backend, PersistField a) => expr (Value a) -> expr (Value (Maybe a)) avg_ :: (Esqueleto query expr backend, PersistField a, PersistField b) => expr (Value a) -> expr (Value (Maybe b)) lower_ :: (Esqueleto query expr backend, PersistField a, IsString a) => expr (Value a) -> expr (Value a) coalesce :: (Esqueleto query expr backend, PersistField a) => [expr (Value (Maybe a))] -> expr (Value (Maybe a)) coalesceDefault :: (Esqueleto query expr backend, PersistField a) => [expr (Value (Maybe a))] -> expr (Value a) -> expr (Value a) like :: (Esqueleto query expr backend, PersistField s, IsString s) => expr (Value s) -> expr (Value s) -> expr (Value Bool) (%) :: (Esqueleto query expr backend, PersistField s, IsString s) => expr (Value s) concat_ :: (Esqueleto query expr backend, PersistField s, IsString s) => [expr (Value s)] -> expr (Value s) (++.) :: (Esqueleto query expr backend, PersistField s, IsString s) => expr (Value s) -> expr (Value s) -> expr (Value s) subList_select :: (Esqueleto query expr backend, PersistField a) => query (expr (Value a)) -> expr (ValueList a) subList_selectDistinct :: (Esqueleto query expr backend, PersistField a) => query (expr (Value a)) -> expr (ValueList a) valList :: (Esqueleto query expr backend, PersistField typ) => [typ] -> expr (ValueList typ) in_ :: (Esqueleto query expr backend, PersistField typ) => expr (Value typ) -> expr (ValueList typ) -> expr (Value Bool) notIn :: (Esqueleto query expr backend, PersistField typ) => expr (Value typ) -> expr (ValueList typ) -> expr (Value Bool) exists :: Esqueleto query expr backend => query () -> expr (Value Bool) notExists :: Esqueleto query expr backend => query () -> expr (Value Bool) set :: (Esqueleto query expr backend, PersistEntity val) => expr (Entity val) -> [expr (Update val)] -> query () (=.) :: (Esqueleto query expr backend, PersistEntity val, PersistField typ) => EntityField val typ -> expr (Value typ) -> expr (Update val) (+=.) :: (Esqueleto query expr backend, PersistEntity val, PersistField a) => EntityField val a -> expr (Value a) -> expr (Update val) (-=.) :: (Esqueleto query expr backend, PersistEntity val, PersistField a) => EntityField val a -> expr (Value a) -> expr (Update val) (*=.) :: (Esqueleto query expr backend, PersistEntity val, PersistField a) => EntityField val a -> expr (Value a) -> expr (Update val) (/=.) :: (Esqueleto query expr backend, PersistEntity val, PersistField a) => EntityField val a -> expr (Value a) -> expr (Update val) (<#) :: Esqueleto query expr backend => (a -> b) -> expr (Value a) -> expr (Insertion b) (<&>) :: Esqueleto query expr backend => expr (Insertion (a -> b)) -> expr (Value a) -> expr (Insertion b) case_ :: (Esqueleto query expr backend, PersistField a) => [(expr (Value Bool), expr (Value a))] -> expr (Value a) -> expr (Value a) -- | FROM clause: bring entities into scope. -- -- This function internally uses two type classes in order to provide -- some flexibility of how you may call it. Internally we refer to these -- type classes as the two different magics. -- -- The innermost magic allows you to use from with the following -- types: -- --
-- from $ \person -> ... -- from $ \(person, blogPost) -> ... -- from $ \(p `'LeftOuterJoin`` mb) -> ... -- from $ \(p1 `'InnerJoin`` f `'InnerJoin`` p2) -> ... -- from $ \((p1 `'InnerJoin`` f) `'InnerJoin`` p2) -> ... ---- -- The types of the arguments to the lambdas above are, respectively: -- --
-- person -- :: ( Esqueleto query expr backend -- , PersistEntity Person -- , PersistEntityBackend Person ~ backend -- ) => expr (Entity Person) -- (person, blogPost) -- :: (...) => (expr (Entity Person), expr (Entity BlogPost)) -- (p `'LeftOuterJoin`` mb) -- :: (...) => InnerJoin (expr (Entity Person)) (expr (Maybe (Entity BlogPost))) -- (p1 `'InnerJoin`` f `'InnerJoin`` p2) -- :: (...) => InnerJoin -- (InnerJoin (expr (Entity Person)) -- (expr (Entity Follow))) -- (expr (Entity Person)) -- (p1 `'InnerJoin`` (f `'InnerJoin`` p2)) :: -- :: (...) => InnerJoin -- (expr (Entity Person)) -- (InnerJoin (expr (Entity Follow)) -- (expr (Entity Person))) ---- -- Note that some backends may not support all kinds of JOINs. from :: From query expr backend a => (a -> query b) -> query b -- | A single value (as opposed to a whole entity). You may use -- (^.) or (?.) to get a Value -- from an Entity. data Value a Value :: a -> Value a -- | Unwrap a Value. -- -- Since: 1.4.1 unValue :: Value a -> a -- | A list of single values. There's a limited set of functions able to -- work with this data type (such as subList_select, -- valList, in_ and exists). data ValueList a ValueList :: a -> ValueList a -- | A wrapper type for for any expr (Value a) for all a. data SomeValue expr SomeValue :: expr (Value a) -> SomeValue expr -- | A class of things that can be converted into a list of SomeValue. It -- has instances for tuples and is the reason why groupBy can take -- tuples, like groupBy (foo ^. FooId, foo ^. -- FooName, foo ^. FooType). class ToSomeValues expr a toSomeValues :: ToSomeValues expr a => a -> [SomeValue expr] -- | Data type that represents an INNER JOIN (see -- LeftOuterJoin for an example). data InnerJoin a b InnerJoin :: a -> b -> InnerJoin a b -- | Data type that represents a CROSS JOIN (see -- LeftOuterJoin for an example). data CrossJoin a b CrossJoin :: a -> b -> CrossJoin a b -- | Data type that represents a LEFT OUTER JOIN. For example, -- --
-- select $ -- from $ \(person `'LeftOuterJoin`` pet) -> -- ... ---- -- is translated into -- --
-- SELECT ... -- FROM Person LEFT OUTER JOIN Pet -- ... ---- -- See also: from. data LeftOuterJoin a b LeftOuterJoin :: a -> b -> LeftOuterJoin a b -- | Data type that represents a RIGHT OUTER JOIN (see -- LeftOuterJoin for an example). data RightOuterJoin a b RightOuterJoin :: a -> b -> RightOuterJoin a b -- | Data type that represents a FULL OUTER JOIN (see -- LeftOuterJoin for an example). data FullOuterJoin a b FullOuterJoin :: a -> b -> FullOuterJoin a b -- | Exception thrown whenever on is used to create an ON -- clause but no matching JOIN is found. data OnClauseWithoutMatchingJoinException OnClauseWithoutMatchingJoinException :: String -> OnClauseWithoutMatchingJoinException -- | Phantom type used by orderBy, asc and desc. data OrderBy -- | Phantom type for a SET operation on an entity of the given -- type (see set and '(=.)'). data Update typ -- | Phantom type used by insertSelect. data Insertion a -- | (Internal) A kind of JOIN. data JoinKind -- |
-- INNER JOIN --InnerJoinKind :: JoinKind -- |
-- CROSS JOIN --CrossJoinKind :: JoinKind -- |
-- LEFT OUTER JOIN --LeftOuterJoinKind :: JoinKind -- |
-- RIGHT OUTER JOIN --RightOuterJoinKind :: JoinKind -- |
-- FULL OUTER JOIN --FullOuterJoinKind :: JoinKind -- | (Internal) Functions that operate on types (that should be) of kind -- JoinKind. class IsJoinKind join smartJoin :: IsJoinKind join => a -> b -> join a b reifyJoinKind :: IsJoinKind join => join a b -> JoinKind -- | (Internal) Phantom type used to process from (see -- fromStart). data PreprocessedFrom a -- | (Internal) Class that implements the tuple from magic (see -- fromStart). class Esqueleto query expr backend => From query expr backend a -- | (Internal) Class that implements the JOIN from magic -- (see fromStart). class Esqueleto query expr backend => FromPreprocess query expr backend a -- | Syntax sugar for case_. -- -- Since: 2.1.2 when_ :: expr (Value Bool) -> () -> expr a -> (expr (Value Bool), expr a) -- | Syntax sugar for case_. -- -- Since: 2.1.2 then_ :: () -- | Syntax sugar for case_. -- -- Since: 2.1.2 else_ :: expr a -> expr a instance Typeable Value instance Typeable ValueList instance Typeable OnClauseWithoutMatchingJoinException instance Eq a => Eq (Value a) instance Ord a => Ord (Value a) instance Show a => Show (Value a) instance Eq a => Eq (ValueList a) instance Ord a => Ord (ValueList a) instance Show a => Show (ValueList a) instance Eq JoinKind instance Eq OnClauseWithoutMatchingJoinException instance Ord OnClauseWithoutMatchingJoinException instance Show OnClauseWithoutMatchingJoinException instance (Esqueleto query expr backend, FromPreprocess query expr backend a, FromPreprocess query expr backend b, IsJoinKind join) => FromPreprocess query expr backend (join a b) instance (Esqueleto query expr backend, PersistEntity val, PersistEntityBackend val ~ backend) => FromPreprocess query expr backend (expr (Maybe (Entity val))) instance (Esqueleto query expr backend, PersistEntity val, PersistEntityBackend val ~ backend) => FromPreprocess query expr backend (expr (Entity val)) instance (From query expr backend a, From query expr backend b, From query expr backend c, From query expr backend d, From query expr backend e, From query expr backend f, From query expr backend g, From query expr backend h) => From query expr backend (a, b, c, d, e, f, g, h) instance (From query expr backend a, From query expr backend b, From query expr backend c, From query expr backend d, From query expr backend e, From query expr backend f, From query expr backend g) => From query expr backend (a, b, c, d, e, f, g) instance (From query expr backend a, From query expr backend b, From query expr backend c, From query expr backend d, From query expr backend e, From query expr backend f) => From query expr backend (a, b, c, d, e, f) instance (From query expr backend a, From query expr backend b, From query expr backend c, From query expr backend d, From query expr backend e) => From query expr backend (a, b, c, d, e) instance (From query expr backend a, From query expr backend b, From query expr backend c, From query expr backend d) => From query expr backend (a, b, c, d) instance (From query expr backend a, From query expr backend b, From query expr backend c) => From query expr backend (a, b, c) instance (From query expr backend a, From query expr backend b) => From query expr backend (a, b) instance (Esqueleto query expr backend, FromPreprocess query expr backend (FullOuterJoin a b)) => From query expr backend (FullOuterJoin a b) instance (Esqueleto query expr backend, FromPreprocess query expr backend (RightOuterJoin a b)) => From query expr backend (RightOuterJoin a b) instance (Esqueleto query expr backend, FromPreprocess query expr backend (LeftOuterJoin a b)) => From query expr backend (LeftOuterJoin a b) instance (Esqueleto query expr backend, FromPreprocess query expr backend (CrossJoin a b)) => From query expr backend (CrossJoin a b) instance (Esqueleto query expr backend, FromPreprocess query expr backend (InnerJoin a b)) => From query expr backend (InnerJoin a b) instance (Esqueleto query expr backend, FromPreprocess query expr backend (expr (Maybe (Entity val)))) => From query expr backend (expr (Maybe (Entity val))) instance (Esqueleto query expr backend, FromPreprocess query expr backend (expr (Entity val))) => From query expr backend (expr (Entity val)) instance Exception OnClauseWithoutMatchingJoinException instance IsJoinKind FullOuterJoin instance IsJoinKind RightOuterJoin instance IsJoinKind LeftOuterJoin instance IsJoinKind CrossJoin instance IsJoinKind InnerJoin instance (ToSomeValues expr a, ToSomeValues expr b, ToSomeValues expr c, ToSomeValues expr d, ToSomeValues expr e, ToSomeValues expr f, ToSomeValues expr g, ToSomeValues expr h) => ToSomeValues expr (a, b, c, d, e, f, g, h) instance (ToSomeValues expr a, ToSomeValues expr b, ToSomeValues expr c, ToSomeValues expr d, ToSomeValues expr e, ToSomeValues expr f, ToSomeValues expr g) => ToSomeValues expr (a, b, c, d, e, f, g) instance (ToSomeValues expr a, ToSomeValues expr b, ToSomeValues expr c, ToSomeValues expr d, ToSomeValues expr e, ToSomeValues expr f) => ToSomeValues expr (a, b, c, d, e, f) instance (ToSomeValues expr a, ToSomeValues expr b, ToSomeValues expr c, ToSomeValues expr d, ToSomeValues expr e) => ToSomeValues expr (a, b, c, d, e) instance (ToSomeValues expr a, ToSomeValues expr b, ToSomeValues expr c, ToSomeValues expr d) => ToSomeValues expr (a, b, c, d) instance (ToSomeValues expr a, ToSomeValues expr b, ToSomeValues expr c) => ToSomeValues expr (a, b, c) instance (ToSomeValues expr a, ToSomeValues expr b) => ToSomeValues expr (a, b) instance Functor Value -- | This is an internal module, anything exported by this module may -- change without a major version bump. Please use only -- Database.Esqueleto if possible. module Database.Esqueleto.Internal.Sql -- | SQL backend for esqueleto using SqlPersistT. data SqlQuery a -- | An expression on the SQL backend. -- -- There are many comments describing the constructors of this data type. -- However, Haddock doesn't like GADTs, so you'll have to read them by -- hitting "Source". data SqlExpr a -- | Constraint synonym for persistent entities whose backend is -- SqlPersistT. type SqlEntity ent = (PersistEntity ent, PersistEntityBackend ent ~ SqlBackend) -- | Execute an esqueleto SELECT query inside -- persistent's SqlPersistT monad and return a list of -- rows. -- -- We've seen that from has some magic about which kinds of things -- you may bring into scope. This select function also has some -- magic for which kinds of things you may bring back to Haskell-land by -- using SqlQuery's return: -- --
-- do ps <- select $ -- from $ \p -> -- return p -- liftIO $ mapM_ (putStrLn . personName . entityVal) ps ---- -- we are able to infer from that single personName . entityVal -- function composition that the p inside the query is of type -- SqlExpr (Entity Person). select :: (SqlSelect a r, MonadIO m) => SqlQuery a -> SqlPersistT m [r] -- | Execute an esqueleto SELECT query inside -- persistent's SqlPersistT monad and return a -- Source of rows. selectSource :: (SqlSelect a r, MonadResource m) => SqlQuery a -> Source (SqlPersistT m) r -- | Execute an esqueleto SELECT DISTINCT query inside -- persistent's SqlPersistT monad and return a list of -- rows. selectDistinct :: (SqlSelect a r, MonadIO m) => SqlQuery a -> SqlPersistT m [r] -- | Execute an esqueleto SELECT DISTINCT query inside -- persistent's SqlPersistT monad and return a -- Source of rows. selectDistinctSource :: (SqlSelect a r, MonadResource m) => SqlQuery a -> Source (SqlPersistT m) r -- | Execute an esqueleto DELETE query inside -- persistent's SqlPersistT monad. Note that currently -- there are no type checks for statements that should not appear on a -- DELETE query. -- -- Example of usage: -- --
-- delete $ -- from $ \appointment -> -- where_ (appointment ^. AppointmentDate <. val now) ---- -- Unlike select, there is a useful way of using delete -- that will lead to type ambiguities. If you want to delete all rows -- (i.e., no where_ clause), you'll have to use a type signature: -- --
-- delete $ -- from $ \(appointment :: SqlExpr (Entity Appointment)) -> -- return () --delete :: MonadIO m => SqlQuery () -> SqlPersistT m () -- | Same as delete, but returns the number of rows affected. deleteCount :: MonadIO m => SqlQuery () -> SqlPersistT m Int64 -- | Execute an esqueleto UPDATE query inside -- persistent's SqlPersistT monad. Note that currently -- there are no type checks for statements that should not appear on a -- UPDATE query. -- -- Example of usage: -- --
-- update $ p -> do -- set p [ PersonAge =. just (val thisYear) -. p ^. PersonBorn ] -- where_ $ isNothing (p ^. PersonAge) --update :: (MonadIO m, SqlEntity val) => (SqlExpr (Entity val) -> SqlQuery ()) -> SqlPersistT m () -- | Same as update, but returns the number of rows affected. updateCount :: (MonadIO m, SqlEntity val) => (SqlExpr (Entity val) -> SqlQuery ()) -> SqlPersistT m Int64 -- | Insert a PersistField for every unique selected value. insertSelectDistinct :: (MonadIO m, PersistEntity a) => SqlQuery (SqlExpr (Insertion a)) -> SqlPersistT m () -- | Insert a PersistField for every selected value. insertSelect :: (MonadIO m, PersistEntity a) => SqlQuery (SqlExpr (Insertion a)) -> SqlPersistT m () -- | (Internal) Create a case statement. -- -- Since: 2.1.1 unsafeSqlCase :: PersistField a => [(SqlExpr (Value Bool), SqlExpr (Value a))] -> SqlExpr (Value a) -> SqlExpr (Value a) -- | (Internal) Create a custom binary operator. You should -- not use this function directly since its type is very general, -- you should always use it with an explicit type signature. For example: -- --
-- (==.) :: SqlExpr (Value a) -> SqlExpr (Value a) -> SqlExpr (Value Bool) -- (==.) = unsafeSqlBinOp " = " ---- -- In the example above, we constraint the arguments to be of the same -- type and constraint the result to be a boolean value. unsafeSqlBinOp :: Builder -> SqlExpr (Value a) -> SqlExpr (Value b) -> SqlExpr (Value c) -- | Similar to unsafeSqlBinOp, but may also be applied to composite -- keys. Uses the operator given as the second argument whenever applied -- to composite keys. -- -- Usage example: -- --
-- (==.) :: SqlExpr (Value a) -> SqlExpr (Value a) -> SqlExpr (Value Bool) -- (==.) = unsafeSqlBinOpComposite " = " " AND " ---- -- Persistent has a hack for implementing composite keys (see -- ECompositeKey doc for more details), so we're forced to use a -- hack here as well. We deconstruct ERaw values based on two -- rules: -- --
-- -- For a module using just esqueleto. -- import Database.Esqueleto ---- -- If you need to use persistent's default support for queries -- as well, either import it qualified: -- --
-- -- For a module that mostly uses esqueleto. -- import Database.Esqueleto -- import qualified Database.Persistent as P ---- -- or import esqueleto itself qualified: -- --
-- -- For a module uses esqueleto just on some queries. -- import Database.Persistent -- import qualified Database.Esqueleto as E ---- -- Other than identifier name clashes, esqueleto does not -- conflict with persistent in any way. module Database.Esqueleto -- | Finally tagless representation of esqueleto's EDSL. class (Functor query, Applicative query, Monad query) => Esqueleto query expr backend | query -> expr backend, expr -> query backend where_ :: Esqueleto query expr backend => expr (Value Bool) -> query () on :: Esqueleto query expr backend => expr (Value Bool) -> query () groupBy :: (Esqueleto query expr backend, ToSomeValues expr a) => a -> query () orderBy :: Esqueleto query expr backend => [expr OrderBy] -> query () asc :: (Esqueleto query expr backend, PersistField a) => expr (Value a) -> expr OrderBy desc :: (Esqueleto query expr backend, PersistField a) => expr (Value a) -> expr OrderBy limit :: Esqueleto query expr backend => Int64 -> query () offset :: Esqueleto query expr backend => Int64 -> query () rand :: Esqueleto query expr backend => expr OrderBy having :: Esqueleto query expr backend => expr (Value Bool) -> query () sub_select :: (Esqueleto query expr backend, PersistField a) => query (expr (Value a)) -> expr (Value a) sub_selectDistinct :: (Esqueleto query expr backend, PersistField a) => query (expr (Value a)) -> expr (Value a) (^.) :: (Esqueleto query expr backend, PersistEntity val, PersistField typ) => expr (Entity val) -> EntityField val typ -> expr (Value typ) (?.) :: (Esqueleto query expr backend, PersistEntity val, PersistField typ) => expr (Maybe (Entity val)) -> EntityField val typ -> expr (Value (Maybe typ)) val :: (Esqueleto query expr backend, PersistField typ) => typ -> expr (Value typ) isNothing :: (Esqueleto query expr backend, PersistField typ) => expr (Value (Maybe typ)) -> expr (Value Bool) just :: Esqueleto query expr backend => expr (Value typ) -> expr (Value (Maybe typ)) nothing :: Esqueleto query expr backend => expr (Value (Maybe typ)) joinV :: Esqueleto query expr backend => expr (Value (Maybe (Maybe typ))) -> expr (Value (Maybe typ)) countRows :: (Esqueleto query expr backend, Num a) => expr (Value a) count :: (Esqueleto query expr backend, Num a) => expr (Value typ) -> expr (Value a) not_ :: Esqueleto query expr backend => expr (Value Bool) -> expr (Value Bool) (==.) :: (Esqueleto query expr backend, PersistField typ) => expr (Value typ) -> expr (Value typ) -> expr (Value Bool) (>=.) :: (Esqueleto query expr backend, PersistField typ) => expr (Value typ) -> expr (Value typ) -> expr (Value Bool) (>.) :: (Esqueleto query expr backend, PersistField typ) => expr (Value typ) -> expr (Value typ) -> expr (Value Bool) (<=.) :: (Esqueleto query expr backend, PersistField typ) => expr (Value typ) -> expr (Value typ) -> expr (Value Bool) (<.) :: (Esqueleto query expr backend, PersistField typ) => expr (Value typ) -> expr (Value typ) -> expr (Value Bool) (!=.) :: (Esqueleto query expr backend, PersistField typ) => expr (Value typ) -> expr (Value typ) -> expr (Value Bool) (&&.) :: Esqueleto query expr backend => expr (Value Bool) -> expr (Value Bool) -> expr (Value Bool) (||.) :: Esqueleto query expr backend => expr (Value Bool) -> expr (Value Bool) -> expr (Value Bool) (+.) :: (Esqueleto query expr backend, PersistField a) => expr (Value a) -> expr (Value a) -> expr (Value a) (-.) :: (Esqueleto query expr backend, PersistField a) => expr (Value a) -> expr (Value a) -> expr (Value a) (/.) :: (Esqueleto query expr backend, PersistField a) => expr (Value a) -> expr (Value a) -> expr (Value a) (*.) :: (Esqueleto query expr backend, PersistField a) => expr (Value a) -> expr (Value a) -> expr (Value a) random_ :: (Esqueleto query expr backend, PersistField a, Num a) => expr (Value a) round_ :: (Esqueleto query expr backend, PersistField a, Num a, PersistField b, Num b) => expr (Value a) -> expr (Value b) ceiling_ :: (Esqueleto query expr backend, PersistField a, Num a, PersistField b, Num b) => expr (Value a) -> expr (Value b) floor_ :: (Esqueleto query expr backend, PersistField a, Num a, PersistField b, Num b) => expr (Value a) -> expr (Value b) sum_ :: (Esqueleto query expr backend, PersistField a, PersistField b) => expr (Value a) -> expr (Value (Maybe b)) min_ :: (Esqueleto query expr backend, PersistField a) => expr (Value a) -> expr (Value (Maybe a)) max_ :: (Esqueleto query expr backend, PersistField a) => expr (Value a) -> expr (Value (Maybe a)) avg_ :: (Esqueleto query expr backend, PersistField a, PersistField b) => expr (Value a) -> expr (Value (Maybe b)) lower_ :: (Esqueleto query expr backend, PersistField a, IsString a) => expr (Value a) -> expr (Value a) coalesce :: (Esqueleto query expr backend, PersistField a) => [expr (Value (Maybe a))] -> expr (Value (Maybe a)) coalesceDefault :: (Esqueleto query expr backend, PersistField a) => [expr (Value (Maybe a))] -> expr (Value a) -> expr (Value a) like :: (Esqueleto query expr backend, PersistField s, IsString s) => expr (Value s) -> expr (Value s) -> expr (Value Bool) (%) :: (Esqueleto query expr backend, PersistField s, IsString s) => expr (Value s) concat_ :: (Esqueleto query expr backend, PersistField s, IsString s) => [expr (Value s)] -> expr (Value s) (++.) :: (Esqueleto query expr backend, PersistField s, IsString s) => expr (Value s) -> expr (Value s) -> expr (Value s) subList_select :: (Esqueleto query expr backend, PersistField a) => query (expr (Value a)) -> expr (ValueList a) subList_selectDistinct :: (Esqueleto query expr backend, PersistField a) => query (expr (Value a)) -> expr (ValueList a) valList :: (Esqueleto query expr backend, PersistField typ) => [typ] -> expr (ValueList typ) in_ :: (Esqueleto query expr backend, PersistField typ) => expr (Value typ) -> expr (ValueList typ) -> expr (Value Bool) notIn :: (Esqueleto query expr backend, PersistField typ) => expr (Value typ) -> expr (ValueList typ) -> expr (Value Bool) exists :: Esqueleto query expr backend => query () -> expr (Value Bool) notExists :: Esqueleto query expr backend => query () -> expr (Value Bool) set :: (Esqueleto query expr backend, PersistEntity val) => expr (Entity val) -> [expr (Update val)] -> query () (=.) :: (Esqueleto query expr backend, PersistEntity val, PersistField typ) => EntityField val typ -> expr (Value typ) -> expr (Update val) (+=.) :: (Esqueleto query expr backend, PersistEntity val, PersistField a) => EntityField val a -> expr (Value a) -> expr (Update val) (-=.) :: (Esqueleto query expr backend, PersistEntity val, PersistField a) => EntityField val a -> expr (Value a) -> expr (Update val) (*=.) :: (Esqueleto query expr backend, PersistEntity val, PersistField a) => EntityField val a -> expr (Value a) -> expr (Update val) (/=.) :: (Esqueleto query expr backend, PersistEntity val, PersistField a) => EntityField val a -> expr (Value a) -> expr (Update val) (<#) :: Esqueleto query expr backend => (a -> b) -> expr (Value a) -> expr (Insertion b) (<&>) :: Esqueleto query expr backend => expr (Insertion (a -> b)) -> expr (Value a) -> expr (Insertion b) case_ :: (Esqueleto query expr backend, PersistField a) => [(expr (Value Bool), expr (Value a))] -> expr (Value a) -> expr (Value a) -- | Syntax sugar for case_. -- -- Since: 2.1.2 when_ :: expr (Value Bool) -> () -> expr a -> (expr (Value Bool), expr a) -- | Syntax sugar for case_. -- -- Since: 2.1.2 then_ :: () -- | Syntax sugar for case_. -- -- Since: 2.1.2 else_ :: expr a -> expr a -- | FROM clause: bring entities into scope. -- -- This function internally uses two type classes in order to provide -- some flexibility of how you may call it. Internally we refer to these -- type classes as the two different magics. -- -- The innermost magic allows you to use from with the following -- types: -- --
-- from $ \person -> ... -- from $ \(person, blogPost) -> ... -- from $ \(p `'LeftOuterJoin`` mb) -> ... -- from $ \(p1 `'InnerJoin`` f `'InnerJoin`` p2) -> ... -- from $ \((p1 `'InnerJoin`` f) `'InnerJoin`` p2) -> ... ---- -- The types of the arguments to the lambdas above are, respectively: -- --
-- person -- :: ( Esqueleto query expr backend -- , PersistEntity Person -- , PersistEntityBackend Person ~ backend -- ) => expr (Entity Person) -- (person, blogPost) -- :: (...) => (expr (Entity Person), expr (Entity BlogPost)) -- (p `'LeftOuterJoin`` mb) -- :: (...) => InnerJoin (expr (Entity Person)) (expr (Maybe (Entity BlogPost))) -- (p1 `'InnerJoin`` f `'InnerJoin`` p2) -- :: (...) => InnerJoin -- (InnerJoin (expr (Entity Person)) -- (expr (Entity Follow))) -- (expr (Entity Person)) -- (p1 `'InnerJoin`` (f `'InnerJoin`` p2)) :: -- :: (...) => InnerJoin -- (expr (Entity Person)) -- (InnerJoin (expr (Entity Follow)) -- (expr (Entity Person))) ---- -- Note that some backends may not support all kinds of JOINs. from :: From query expr backend a => (a -> query b) -> query b -- | A single value (as opposed to a whole entity). You may use -- (^.) or (?.) to get a Value -- from an Entity. data Value a Value :: a -> Value a -- | Unwrap a Value. -- -- Since: 1.4.1 unValue :: Value a -> a -- | A list of single values. There's a limited set of functions able to -- work with this data type (such as subList_select, -- valList, in_ and exists). data ValueList a ValueList :: a -> ValueList a -- | Phantom type used by orderBy, asc and desc. data OrderBy -- | Data type that represents an INNER JOIN (see -- LeftOuterJoin for an example). data InnerJoin a b InnerJoin :: a -> b -> InnerJoin a b -- | Data type that represents a CROSS JOIN (see -- LeftOuterJoin for an example). data CrossJoin a b CrossJoin :: a -> b -> CrossJoin a b -- | Data type that represents a LEFT OUTER JOIN. For example, -- --
-- select $ -- from $ \(person `'LeftOuterJoin`` pet) -> -- ... ---- -- is translated into -- --
-- SELECT ... -- FROM Person LEFT OUTER JOIN Pet -- ... ---- -- See also: from. data LeftOuterJoin a b LeftOuterJoin :: a -> b -> LeftOuterJoin a b -- | Data type that represents a RIGHT OUTER JOIN (see -- LeftOuterJoin for an example). data RightOuterJoin a b RightOuterJoin :: a -> b -> RightOuterJoin a b -- | Data type that represents a FULL OUTER JOIN (see -- LeftOuterJoin for an example). data FullOuterJoin a b FullOuterJoin :: a -> b -> FullOuterJoin a b -- | Exception thrown whenever on is used to create an ON -- clause but no matching JOIN is found. data OnClauseWithoutMatchingJoinException OnClauseWithoutMatchingJoinException :: String -> OnClauseWithoutMatchingJoinException -- | SQL backend for esqueleto using SqlPersistT. data SqlQuery a -- | An expression on the SQL backend. -- -- There are many comments describing the constructors of this data type. -- However, Haddock doesn't like GADTs, so you'll have to read them by -- hitting "Source". data SqlExpr a -- | Constraint synonym for persistent entities whose backend is -- SqlPersistT. type SqlEntity ent = (PersistEntity ent, PersistEntityBackend ent ~ SqlBackend) -- | Execute an esqueleto SELECT query inside -- persistent's SqlPersistT monad and return a list of -- rows. -- -- We've seen that from has some magic about which kinds of things -- you may bring into scope. This select function also has some -- magic for which kinds of things you may bring back to Haskell-land by -- using SqlQuery's return: -- --
-- do ps <- select $ -- from $ \p -> -- return p -- liftIO $ mapM_ (putStrLn . personName . entityVal) ps ---- -- we are able to infer from that single personName . entityVal -- function composition that the p inside the query is of type -- SqlExpr (Entity Person). select :: (SqlSelect a r, MonadIO m) => SqlQuery a -> SqlPersistT m [r] -- | Execute an esqueleto SELECT DISTINCT query inside -- persistent's SqlPersistT monad and return a list of -- rows. selectDistinct :: (SqlSelect a r, MonadIO m) => SqlQuery a -> SqlPersistT m [r] -- | Execute an esqueleto SELECT query inside -- persistent's SqlPersistT monad and return a -- Source of rows. selectSource :: (SqlSelect a r, MonadResource m) => SqlQuery a -> Source (SqlPersistT m) r -- | Execute an esqueleto SELECT DISTINCT query inside -- persistent's SqlPersistT monad and return a -- Source of rows. selectDistinctSource :: (SqlSelect a r, MonadResource m) => SqlQuery a -> Source (SqlPersistT m) r -- | Execute an esqueleto DELETE query inside -- persistent's SqlPersistT monad. Note that currently -- there are no type checks for statements that should not appear on a -- DELETE query. -- -- Example of usage: -- --
-- delete $ -- from $ \appointment -> -- where_ (appointment ^. AppointmentDate <. val now) ---- -- Unlike select, there is a useful way of using delete -- that will lead to type ambiguities. If you want to delete all rows -- (i.e., no where_ clause), you'll have to use a type signature: -- --
-- delete $ -- from $ \(appointment :: SqlExpr (Entity Appointment)) -> -- return () --delete :: MonadIO m => SqlQuery () -> SqlPersistT m () -- | Same as delete, but returns the number of rows affected. deleteCount :: MonadIO m => SqlQuery () -> SqlPersistT m Int64 -- | Execute an esqueleto UPDATE query inside -- persistent's SqlPersistT monad. Note that currently -- there are no type checks for statements that should not appear on a -- UPDATE query. -- -- Example of usage: -- --
-- update $ p -> do -- set p [ PersonAge =. just (val thisYear) -. p ^. PersonBorn ] -- where_ $ isNothing (p ^. PersonAge) --update :: (MonadIO m, SqlEntity val) => (SqlExpr (Entity val) -> SqlQuery ()) -> SqlPersistT m () -- | Same as update, but returns the number of rows affected. updateCount :: (MonadIO m, SqlEntity val) => (SqlExpr (Entity val) -> SqlQuery ()) -> SqlPersistT m Int64 -- | Insert a PersistField for every selected value. insertSelect :: (MonadIO m, PersistEntity a) => SqlQuery (SqlExpr (Insertion a)) -> SqlPersistT m () -- | Insert a PersistField for every unique selected value. insertSelectDistinct :: (MonadIO m, PersistEntity a) => SqlQuery (SqlExpr (Insertion a)) -> SqlPersistT m () -- | valkey i = val . toSqlKey -- (https://github.com/prowdsponsor/esqueleto/issues/9). valkey :: (Esqueleto query expr backend, ToBackendKey SqlBackend entity, PersistField (Key entity)) => Int64 -> expr (Value (Key entity)) -- | valJ is like val but for something that is already a -- Value. The use case it was written for was, given a -- Value lift the Key for that Value into the -- query expression in a type safe way. However, the implementation is -- more generic than that so we call it valJ. -- -- Its important to note that the input entity and the output entity are -- constrained to be the same by the type signature on the function -- (https://github.com/prowdsponsor/esqueleto/pull/69). -- -- Since: 1.4.2 valJ :: (Esqueleto query expr backend, PersistField (Key entity)) => Value (Key entity) -> expr (Value (Key entity)) -- | Synonym for delete that does not clash with -- esqueleto's delete. deleteKey :: (PersistStore (PersistEntityBackend val), MonadIO m, PersistEntity val) => Key val -> ReaderT (PersistEntityBackend val) m ()