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
, in_, notIn, exists, notExists
, set, (=.), (+=.), (-=.), (*=.), (/=.)
, case_ )
, case_, toBaseId)
, when_
, then_
, else_

View File

@ -32,6 +32,7 @@ module Database.Esqueleto.Internal.Language
, Insertion
, LockingKind(..)
, SqlString
, ToBaseId(..)
-- * The guts
, JoinKind(..)
, IsJoinKind(..)
@ -555,6 +556,42 @@ class (Functor query, Applicative query, Monad query) =>
-- /Since: 2.1.2/
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 subList_selectDistinct "Since 2.2.4: use 'subList_select' and 'distinct'." #-}
@ -837,6 +874,12 @@ instance SqlString Html where
-- | /Since: 2.4.0/
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.
--

View File

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