Add ToBaseId

This commit is contained in:
Eric Easley 2016-02-05 15:32:19 -08:00
parent 17b9c3be9a
commit 970deabfc2
3 changed files with 46 additions and 1 deletions

View File

@ -52,7 +52,7 @@ module Database.Esqueleto
, subList_select, subList_selectDistinct, valList, justList , subList_select, subList_selectDistinct, valList, justList
, in_, notIn, exists, notExists , in_, notIn, exists, notExists
, set, (=.), (+=.), (-=.), (*=.), (/=.) , set, (=.), (+=.), (-=.), (*=.), (/=.)
, case_ ) , case_, toBaseId)
, when_ , when_
, then_ , then_
, else_ , else_

View File

@ -32,6 +32,7 @@ module Database.Esqueleto.Internal.Language
, Insertion , Insertion
, LockingKind(..) , LockingKind(..)
, SqlString , SqlString
, ToBaseId(..)
-- * The guts -- * The guts
, JoinKind(..) , JoinKind(..)
, IsJoinKind(..) , IsJoinKind(..)
@ -555,6 +556,42 @@ class (Functor query, Applicative query, Monad query) =>
-- /Since: 2.1.2/ -- /Since: 2.1.2/
case_ :: PersistField a => [(expr (Value Bool), expr (Value a))] -> expr (Value a) -> expr (Value a) case_ :: PersistField a => [(expr (Value Bool), expr (Value a))] -> expr (Value a) -> expr (Value a)
-- | Convert an entity's key into another entity's.
--
-- This function is to be used when you change an entity's @Id@ to be
-- that of another entity. For example:
--
-- @
-- Bar
-- barNum Int
-- Foo
-- Id BarId
-- fooNum Int
-- @
--
-- For this example, declare:
--
-- @
-- instance ToBaseId Foo where
-- type BaseEnt Foo = Bar
-- toBaseIdWitness = FooKey
-- @
--
-- Now you're able to write queries such as:
--
-- @
-- 'select' $
-- 'from' $ \(bar `'InnerJoin`` foo) -> do
-- 'on' ('toBaseId' (foo '^.' FooId) '==.' bar '^.' BarId)
-- return (bar, foo)
-- @
--
-- Note: this function may be unsafe to use in conditions not like the
-- one of the example above.
--
-- /Since: 2.4.3/
toBaseId :: ToBaseId ent => expr (Value (Key ent)) -> expr (Value (Key (BaseEnt ent)))
{-# DEPRECATED sub_selectDistinct "Since 2.2.4: use 'sub_select' and 'distinct'." #-} {-# DEPRECATED sub_selectDistinct "Since 2.2.4: use 'sub_select' and 'distinct'." #-}
{-# DEPRECATED subList_selectDistinct "Since 2.2.4: use 'subList_select' and 'distinct'." #-} {-# DEPRECATED subList_selectDistinct "Since 2.2.4: use 'subList_select' and 'distinct'." #-}
@ -837,6 +874,12 @@ instance SqlString Html where
-- | /Since: 2.4.0/ -- | /Since: 2.4.0/
instance SqlString a => SqlString (Maybe a) where instance SqlString a => SqlString (Maybe a) where
-- | Class that enables one to use 'toBaseId' to convert an entity's
-- key on a query into another (cf. 'toBaseId').
class ToBaseId ent where
type BaseEnt ent :: *
toBaseIdWitness :: Key (BaseEnt ent) -> Key ent
-- | @FROM@ clause: bring entities into scope. -- | @FROM@ clause: bring entities into scope.
-- --

View File

@ -524,6 +524,8 @@ instance Esqueleto SqlQuery SqlExpr SqlBackend where
(EInsert _ _) <&> (ECompositeKey _) = unexpectedCompositeKeyError "(<&>)" (EInsert _ _) <&> (ECompositeKey _) = unexpectedCompositeKeyError "(<&>)"
case_ = unsafeSqlCase case_ = unsafeSqlCase
toBaseId = veryUnsafeCoerceSqlExprValue
instance ToSomeValues SqlExpr (SqlExpr (Value a)) where instance ToSomeValues SqlExpr (SqlExpr (Value a)) where
toSomeValues a = [SomeValue a] toSomeValues a = [SomeValue a]