From 1f80074b6ef4b0be0478a9002ca63cdbb400351f Mon Sep 17 00:00:00 2001 From: Alberto Valverde Date: Wed, 24 Dec 2014 05:27:10 +0100 Subject: [PATCH] Revert "Revert "custom primary keys (not composite, yet) supported on projections"" This reverts commit 761ef03b035a8efee7fa80aef6ccb11fffaf7ea6. --- src/Database/Esqueleto/Internal/Sql.hs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Database/Esqueleto/Internal/Sql.hs b/src/Database/Esqueleto/Internal/Sql.hs index e62eade..bc02410 100644 --- a/src/Database/Esqueleto/Internal/Sql.hs +++ b/src/Database/Esqueleto/Internal/Sql.hs @@ -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