Use fundeps on SqlSelect.
This allows GHC to infer the type of from by the return of select.
This commit is contained in:
parent
33d04d5f27
commit
b189791dc3
@ -1,4 +1,4 @@
|
|||||||
{-# LANGUAGE ConstraintKinds, MultiParamTypeClasses, TypeFamilies, FlexibleContexts, GADTs, OverloadedStrings #-}
|
{-# LANGUAGE ConstraintKinds, MultiParamTypeClasses, FunctionalDependencies, FlexibleContexts, FlexibleInstances, UndecidableInstances, GADTs, OverloadedStrings #-}
|
||||||
module Database.Esqueleto.Internal.Sql
|
module Database.Esqueleto.Internal.Sql
|
||||||
( SqlQuery
|
( SqlQuery
|
||||||
, select
|
, select
|
||||||
@ -138,11 +138,11 @@ binop op (ERaw f1) (ERaw f2) = ERaw f
|
|||||||
|
|
||||||
|
|
||||||
-- | TODO
|
-- | TODO
|
||||||
select :: ( SqlSelect a
|
select :: ( SqlSelect a r
|
||||||
, RawSql (SqlSelectRet r)
|
, RawSql r
|
||||||
, MonadLogger m
|
, MonadLogger m
|
||||||
, MonadResourceBase m)
|
, MonadResourceBase m)
|
||||||
=> SqlQuery a -> SqlPersist m [SqlSelectRet r]
|
=> SqlQuery a -> SqlPersist m [r]
|
||||||
select query = do
|
select query = do
|
||||||
conn <- getConnection
|
conn <- getConnection
|
||||||
uncurry rawSql $
|
uncurry rawSql $
|
||||||
@ -156,7 +156,7 @@ getConnection = SqlPersist R.ask
|
|||||||
|
|
||||||
|
|
||||||
-- | Pretty prints a 'SqlQuery' into a SQL query.
|
-- | Pretty prints a 'SqlQuery' into a SQL query.
|
||||||
toRawSelectSql :: SqlSelect a => Escape -> SqlQuery a -> (TLB.Builder, [PersistValue])
|
toRawSelectSql :: SqlSelect a r => Escape -> SqlQuery a -> (TLB.Builder, [PersistValue])
|
||||||
toRawSelectSql esc query =
|
toRawSelectSql esc query =
|
||||||
let (ret, SideData fromClauses whereClauses) =
|
let (ret, SideData fromClauses whereClauses) =
|
||||||
flip S.evalSupply (idents ()) $
|
flip S.evalSupply (idents ()) $
|
||||||
@ -176,41 +176,37 @@ toRawSelectSql esc query =
|
|||||||
in (text, selectVars <> whereVars)
|
in (text, selectVars <> whereVars)
|
||||||
|
|
||||||
|
|
||||||
class RawSql (SqlSelectRet a) => SqlSelect a where
|
class RawSql r => SqlSelect a r | a -> r, r -> a where
|
||||||
type SqlSelectRet a :: *
|
|
||||||
makeSelect :: Escape -> a -> (TLB.Builder, [PersistValue])
|
makeSelect :: Escape -> a -> (TLB.Builder, [PersistValue])
|
||||||
|
|
||||||
instance RawSql a => SqlSelect (SqlExpr a) where
|
instance PersistEntity a => SqlSelect (SqlExpr (Entity a)) (Entity a) where
|
||||||
type SqlSelectRet (SqlExpr a) = a
|
makeSelect _ (EEntity _) = ("??", mempty)
|
||||||
makeSelect _ (EEntity _) = ("??", mempty)
|
instance PersistField a => SqlSelect (SqlExpr (Single a)) (Single a) where
|
||||||
makeSelect esc (ERaw f) = first parens (f esc)
|
makeSelect esc (ERaw f) = first parens (f esc)
|
||||||
|
|
||||||
instance (SqlSelect a, SqlSelect b) => SqlSelect (a, b) where
|
instance ( SqlSelect a ra
|
||||||
type SqlSelectRet (a, b) = (SqlSelectRet a, SqlSelectRet b)
|
, SqlSelect b rb
|
||||||
makeSelect esc (a, b) = uncommas' [makeSelect esc a, makeSelect esc b]
|
) => SqlSelect (a, b) (ra, rb) where
|
||||||
instance (SqlSelect a, SqlSelect b, SqlSelect c) => SqlSelect (a, b, c) where
|
makeSelect esc (a, b) =
|
||||||
type SqlSelectRet (a, b, c) =
|
uncommas'
|
||||||
( SqlSelectRet a
|
[ makeSelect esc a
|
||||||
, SqlSelectRet b
|
, makeSelect esc b
|
||||||
, SqlSelectRet c
|
]
|
||||||
)
|
instance ( SqlSelect a ra
|
||||||
|
, SqlSelect b rb
|
||||||
|
, SqlSelect c rc
|
||||||
|
) => SqlSelect (a, b, c) (ra, rb, rc) where
|
||||||
makeSelect esc (a, b, c) =
|
makeSelect esc (a, b, c) =
|
||||||
uncommas'
|
uncommas'
|
||||||
[ makeSelect esc a
|
[ makeSelect esc a
|
||||||
, makeSelect esc b
|
, makeSelect esc b
|
||||||
, makeSelect esc c
|
, makeSelect esc c
|
||||||
]
|
]
|
||||||
instance ( SqlSelect a
|
instance ( SqlSelect a ra
|
||||||
, SqlSelect b
|
, SqlSelect b rb
|
||||||
, SqlSelect c
|
, SqlSelect c rc
|
||||||
, SqlSelect d
|
, SqlSelect d rd
|
||||||
) => SqlSelect (a, b, c, d) where
|
) => SqlSelect (a, b, c, d) (ra, rb, rc, rd) where
|
||||||
type SqlSelectRet (a, b, c, d) =
|
|
||||||
( SqlSelectRet a
|
|
||||||
, SqlSelectRet b
|
|
||||||
, SqlSelectRet c
|
|
||||||
, SqlSelectRet d
|
|
||||||
)
|
|
||||||
makeSelect esc (a, b, c, d) =
|
makeSelect esc (a, b, c, d) =
|
||||||
uncommas'
|
uncommas'
|
||||||
[ makeSelect esc a
|
[ makeSelect esc a
|
||||||
@ -218,19 +214,12 @@ instance ( SqlSelect a
|
|||||||
, makeSelect esc c
|
, makeSelect esc c
|
||||||
, makeSelect esc d
|
, makeSelect esc d
|
||||||
]
|
]
|
||||||
instance ( SqlSelect a
|
instance ( SqlSelect a ra
|
||||||
, SqlSelect b
|
, SqlSelect b rb
|
||||||
, SqlSelect c
|
, SqlSelect c rc
|
||||||
, SqlSelect d
|
, SqlSelect d rd
|
||||||
, SqlSelect e
|
, SqlSelect e re
|
||||||
) => SqlSelect (a, b, c, d, e) where
|
) => SqlSelect (a, b, c, d, e) (ra, rb, rc, rd, re) where
|
||||||
type SqlSelectRet (a, b, c, d, e) =
|
|
||||||
( SqlSelectRet a
|
|
||||||
, SqlSelectRet b
|
|
||||||
, SqlSelectRet c
|
|
||||||
, SqlSelectRet d
|
|
||||||
, SqlSelectRet e
|
|
||||||
)
|
|
||||||
makeSelect esc (a, b, c, d, e) =
|
makeSelect esc (a, b, c, d, e) =
|
||||||
uncommas'
|
uncommas'
|
||||||
[ makeSelect esc a
|
[ makeSelect esc a
|
||||||
@ -239,21 +228,13 @@ instance ( SqlSelect a
|
|||||||
, makeSelect esc d
|
, makeSelect esc d
|
||||||
, makeSelect esc e
|
, makeSelect esc e
|
||||||
]
|
]
|
||||||
instance ( SqlSelect a
|
instance ( SqlSelect a ra
|
||||||
, SqlSelect b
|
, SqlSelect b rb
|
||||||
, SqlSelect c
|
, SqlSelect c rc
|
||||||
, SqlSelect d
|
, SqlSelect d rd
|
||||||
, SqlSelect e
|
, SqlSelect e re
|
||||||
, SqlSelect f
|
, SqlSelect f rf
|
||||||
) => SqlSelect (a, b, c, d, e, f) where
|
) => SqlSelect (a, b, c, d, e, f) (ra, rb, rc, rd, re, rf) where
|
||||||
type SqlSelectRet (a, b, c, d, e, f) =
|
|
||||||
( SqlSelectRet a
|
|
||||||
, SqlSelectRet b
|
|
||||||
, SqlSelectRet c
|
|
||||||
, SqlSelectRet d
|
|
||||||
, SqlSelectRet e
|
|
||||||
, SqlSelectRet f
|
|
||||||
)
|
|
||||||
makeSelect esc (a, b, c, d, e, f) =
|
makeSelect esc (a, b, c, d, e, f) =
|
||||||
uncommas'
|
uncommas'
|
||||||
[ makeSelect esc a
|
[ makeSelect esc a
|
||||||
@ -263,23 +244,14 @@ instance ( SqlSelect a
|
|||||||
, makeSelect esc e
|
, makeSelect esc e
|
||||||
, makeSelect esc f
|
, makeSelect esc f
|
||||||
]
|
]
|
||||||
instance ( SqlSelect a
|
instance ( SqlSelect a ra
|
||||||
, SqlSelect b
|
, SqlSelect b rb
|
||||||
, SqlSelect c
|
, SqlSelect c rc
|
||||||
, SqlSelect d
|
, SqlSelect d rd
|
||||||
, SqlSelect e
|
, SqlSelect e re
|
||||||
, SqlSelect f
|
, SqlSelect f rf
|
||||||
, SqlSelect g
|
, SqlSelect g rg
|
||||||
) => SqlSelect (a, b, c, d, e, f, g) where
|
) => SqlSelect (a, b, c, d, e, f, g) (ra, rb, rc, rd, re, rf, rg) where
|
||||||
type SqlSelectRet (a, b, c, d, e, f, g) =
|
|
||||||
( SqlSelectRet a
|
|
||||||
, SqlSelectRet b
|
|
||||||
, SqlSelectRet c
|
|
||||||
, SqlSelectRet d
|
|
||||||
, SqlSelectRet e
|
|
||||||
, SqlSelectRet f
|
|
||||||
, SqlSelectRet g
|
|
||||||
)
|
|
||||||
makeSelect esc (a, b, c, d, e, f, g) =
|
makeSelect esc (a, b, c, d, e, f, g) =
|
||||||
uncommas'
|
uncommas'
|
||||||
[ makeSelect esc a
|
[ makeSelect esc a
|
||||||
@ -290,25 +262,15 @@ instance ( SqlSelect a
|
|||||||
, makeSelect esc f
|
, makeSelect esc f
|
||||||
, makeSelect esc g
|
, makeSelect esc g
|
||||||
]
|
]
|
||||||
instance ( SqlSelect a
|
instance ( SqlSelect a ra
|
||||||
, SqlSelect b
|
, SqlSelect b rb
|
||||||
, SqlSelect c
|
, SqlSelect c rc
|
||||||
, SqlSelect d
|
, SqlSelect d rd
|
||||||
, SqlSelect e
|
, SqlSelect e re
|
||||||
, SqlSelect f
|
, SqlSelect f rf
|
||||||
, SqlSelect g
|
, SqlSelect g rg
|
||||||
, SqlSelect h
|
, SqlSelect h rh
|
||||||
) => SqlSelect (a, b, c, d, e, f, g, h) where
|
) => SqlSelect (a, b, c, d, e, f, g, h) (ra, rb, rc, rd, re, rf, rg, rh) where
|
||||||
type SqlSelectRet (a, b, c, d, e, f, g, h) =
|
|
||||||
( SqlSelectRet a
|
|
||||||
, SqlSelectRet b
|
|
||||||
, SqlSelectRet c
|
|
||||||
, SqlSelectRet d
|
|
||||||
, SqlSelectRet e
|
|
||||||
, SqlSelectRet f
|
|
||||||
, SqlSelectRet g
|
|
||||||
, SqlSelectRet h
|
|
||||||
)
|
|
||||||
makeSelect esc (a, b, c, d, e, f, g, h) =
|
makeSelect esc (a, b, c, d, e, f, g, h) =
|
||||||
uncommas'
|
uncommas'
|
||||||
[ makeSelect esc a
|
[ makeSelect esc a
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user