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
, UndecidableInstances
, ScopedTypeVariables
, InstanceSigs
#-}
-- | This is an internal module, anything exported by this module
-- may change without a major version bump. Please use only
@ -60,7 +61,8 @@ import Data.Monoid (Monoid(..), (<>))
import Data.Proxy (Proxy(..))
import Database.Esqueleto.Internal.PersistentImport
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.Writer as W
import qualified Data.Conduit as C
@ -336,8 +338,16 @@ instance Esqueleto SqlQuery SqlExpr SqlBackend where
sub_select = sub SELECT
sub_selectDistinct = sub SELECT_DISTINCT
EEntity ident ^. field =
ERaw Never $ \info -> (useIdent info ident <> ("." <> fieldName info field), [])
(^.) :: forall val typ. (PersistEntity val, PersistField typ) =>
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)
where