Revert "Revert "custom primary keys (not composite, yet) supported on projections""

This reverts commit 761ef03b03.
This commit is contained in:
Alberto Valverde 2014-12-24 05:27:10 +01:00
parent 761ef03b03
commit 1f80074b6e

View File

@ -8,6 +8,7 @@
, OverloadedStrings , OverloadedStrings
, UndecidableInstances , UndecidableInstances
, ScopedTypeVariables , ScopedTypeVariables
, InstanceSigs
#-} #-}
-- | This is an internal module, anything exported by this module -- | This is an internal module, anything exported by this module
-- may change without a major version bump. Please use only -- may change without a major version bump. Please use only
@ -60,7 +61,8 @@ import Data.Monoid (Monoid(..), (<>))
import Data.Proxy (Proxy(..)) import Data.Proxy (Proxy(..))
import Database.Esqueleto.Internal.PersistentImport import Database.Esqueleto.Internal.PersistentImport
import Database.Persist.Sql.Util ( import Database.Persist.Sql.Util (
entityColumnNames, entityColumnCount, parseEntityValues) entityColumnNames, entityColumnCount, parseEntityValues, isIdField
, hasCompositeKey)
import qualified Control.Monad.Trans.State as S import qualified Control.Monad.Trans.State as S
import qualified Control.Monad.Trans.Writer as W import qualified Control.Monad.Trans.Writer as W
import qualified Data.Conduit as C import qualified Data.Conduit as C
@ -336,8 +338,16 @@ instance Esqueleto SqlQuery SqlExpr SqlBackend where
sub_select = sub SELECT sub_select = sub SELECT
sub_selectDistinct = sub SELECT_DISTINCT sub_selectDistinct = sub SELECT_DISTINCT
EEntity ident ^. field = (^.) :: forall val typ. (PersistEntity val, PersistField typ) =>
ERaw Never $ \info -> (useIdent info ident <> ("." <> fieldName info field), []) SqlExpr (Entity val) -> EntityField val typ -> SqlExpr (Value typ)
EEntity ident ^. field
| isIdField field && hasCompositeKey ed
= ERaw Parens $
\info@(conn,_) -> (uncommas (map (\a -> useIdent info ident <> "." <> TLB.fromText (connEscapeName conn (fieldDB a))) (compositeFields pdef)), [])
| otherwise = ERaw Never $ \info -> (useIdent info ident <> ("." <> fieldName info field), [])
where
ed = entityDef $ getEntityVal $ (Proxy :: Proxy (SqlExpr (Entity val)))
Just pdef = entityPrimary ed
EMaybe r ?. field = maybelize (r ^. field) EMaybe r ?. field = maybelize (r ^. field)
where where