Skip to content

Commit e3ae687

Browse files
authored
Merge pull request #9 from foxhound-systems/final-expr
Convert SqlExpr to a final encoding
2 parents 1ba08ab + 01407d2 commit e3ae687

File tree

8 files changed

+360
-506
lines changed

8 files changed

+360
-506
lines changed

src/Database/Esqueleto/Experimental/From.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ instance PersistEntity a => From (Table a) where
5252
runFrom e@Table = do
5353
let ed = entityDef $ getVal e
5454
ident <- newIdentFor (entityDB ed)
55-
let entity = EEntity ident
55+
let entity = unsafeSqlEntity ident
5656
pure $ (entity, FromStart ident ed)
5757
where
5858
getVal :: Table ent -> Proxy ent

src/Database/Esqueleto/Experimental/ToAlias.hs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,22 @@ class ToAlias a where
1616
toAlias :: a -> SqlQuery a
1717

1818
instance ToAlias (SqlExpr (Value a)) where
19-
toAlias v@(EAliasedValue _ _) = pure v
20-
toAlias v = do
21-
ident <- newIdentFor (DBName "v")
22-
pure $ EAliasedValue ident v
19+
toAlias e@(ERaw m f)
20+
| Just _ <- sqlExprMetaAlias m, not (sqlExprMetaIsReference m) = pure e
21+
| otherwise = do
22+
ident <- newIdentFor (DBName "v")
23+
pure $ ERaw noMeta{sqlExprMetaAlias = Just ident} f
2324

2425
instance ToAlias (SqlExpr (Entity a)) where
25-
toAlias v@(EAliasedEntityReference _ _) = pure v
26-
toAlias v@(EAliasedEntity _ _) = pure v
27-
toAlias (EEntity tableIdent) = do
26+
toAlias (ERaw m f) = do
2827
ident <- newIdentFor (DBName "v")
29-
pure $ EAliasedEntity ident tableIdent
28+
pure $ ERaw m{sqlExprMetaIsReference = False, sqlExprMetaAlias = Just ident} f
3029

3130
instance ToAlias (SqlExpr (Maybe (Entity a))) where
32-
toAlias (EMaybe e) = EMaybe <$> toAlias e
31+
-- FIXME: Code duplication because the compiler doesnt like half final encoding
32+
toAlias (ERaw m f) = do
33+
ident <- newIdentFor (DBName "v")
34+
pure $ ERaw m{sqlExprMetaIsReference = False, sqlExprMetaAlias = Just ident} f
3335

3436
instance (ToAlias a, ToAlias b) => ToAlias (a,b) where
3537
toAlias (a,b) = (,) <$> toAlias a <*> toAlias b

src/Database/Esqueleto/Experimental/ToAliasReference.hs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
{-# LANGUAGE FlexibleInstances #-}
2+
{-# LANGUAGE OverloadedStrings #-}
23
{-# LANGUAGE TypeFamilies #-}
34

45
module Database.Esqueleto.Experimental.ToAliasReference
56
where
67

7-
import Database.Esqueleto.Experimental.ToAlias
8+
import Data.Coerce
89
import Database.Esqueleto.Internal.Internal hiding (From, from, on)
910
import Database.Esqueleto.Internal.PersistentImport
1011

@@ -16,18 +17,21 @@ class ToAliasReference a where
1617
toAliasReference :: Ident -> a -> SqlQuery a
1718

1819
instance ToAliasReference (SqlExpr (Value a)) where
19-
toAliasReference aliasSource (EAliasedValue aliasIdent _) = pure $ EValueReference aliasSource (\_ -> aliasIdent)
20-
toAliasReference _ v@(ERaw _ _) = toAlias v
21-
toAliasReference _ v@(ECompositeKey _) = toAlias v
22-
toAliasReference s (EValueReference _ b) = pure $ EValueReference s b
20+
toAliasReference aliasSource (ERaw m _)
21+
| Just alias <- sqlExprMetaAlias m = pure $ ERaw m{sqlExprMetaIsReference = True} $ \_ info ->
22+
(useIdent info aliasSource <> "." <> useIdent info alias, [])
23+
toAliasReference _ e = pure e
2324

2425
instance ToAliasReference (SqlExpr (Entity a)) where
25-
toAliasReference aliasSource (EAliasedEntity ident _) = pure $ EAliasedEntityReference aliasSource ident
26-
toAliasReference _ e@(EEntity _) = toAlias e
27-
toAliasReference s (EAliasedEntityReference _ b) = pure $ EAliasedEntityReference s b
26+
toAliasReference aliasSource (ERaw m _)
27+
| Just _ <- sqlExprMetaAlias m, False <- sqlExprMetaIsReference m =
28+
pure $ ERaw m{sqlExprMetaIsReference = True} $ \_ info ->
29+
(useIdent info aliasSource, [])
30+
toAliasReference _ e = pure e
2831

2932
instance ToAliasReference (SqlExpr (Maybe (Entity a))) where
30-
toAliasReference s (EMaybe e) = EMaybe <$> toAliasReference s e
33+
toAliasReference aliasSource e =
34+
coerce <$> toAliasReference aliasSource (coerce e :: SqlExpr (Entity a))
3135

3236

3337
instance (ToAliasReference a, ToAliasReference b) => ToAliasReference (a, b) where

src/Database/Esqueleto/Experimental/ToMaybe.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ instance ToMaybe (SqlExpr (Maybe a)) where
2121

2222
instance ToMaybe (SqlExpr (Entity a)) where
2323
type ToMaybeT (SqlExpr (Entity a)) = SqlExpr (Maybe (Entity a))
24-
toMaybe = EMaybe
24+
toMaybe (ERaw f m) = (ERaw f m)
2525

2626
instance ToMaybe (SqlExpr (Value a)) where
2727
type ToMaybeT (SqlExpr (Value a)) = SqlExpr (Value (Maybe (Nullable a)))

0 commit comments

Comments
 (0)