@@ -11,10 +11,13 @@ module Rel8.Statement.Select
12 , Optimized(..)
12 , Optimized(..)
13 , ppPrimSelect
13 , ppPrimSelect
19+import Data.Foldable ( toList )
20+import Data.List.NonEmpty ( NonEmpty( (:|) ) )
18import Data.Void ( Void )
21import Data.Void ( Void )
19import Prelude hiding ( undefined )
22import Prelude hiding ( undefined )
@@ -24,12 +27,15 @@ import qualified Hasql.Encoders as Hasql
24import qualified Hasql.Statement as Hasql
27import qualified Hasql.Statement as Hasql
30+import qualified Opaleye.Internal.HaskellDB.PrimQuery as Opaleye
27import qualified Opaleye.Internal.HaskellDB.Sql as Opaleye
31import qualified Opaleye.Internal.HaskellDB.Sql as Opaleye
32+import qualified Opaleye.Internal.HaskellDB.Sql.Print as Opaleye
28import qualified Opaleye.Internal.PrimQuery as Opaleye
33import qualified Opaleye.Internal.PrimQuery as Opaleye
29import qualified Opaleye.Internal.Print as Opaleye
34import qualified Opaleye.Internal.Print as Opaleye
30import qualified Opaleye.Internal.Optimize as Opaleye
35import qualified Opaleye.Internal.Optimize as Opaleye
31import qualified Opaleye.Internal.QueryArr as Opaleye hiding ( Select )
36import qualified Opaleye.Internal.QueryArr as Opaleye hiding ( Select )
32−import qualified Opaleye.Internal.Sql as Opaleye
37+import qualified Opaleye.Internal.Sql as Opaleye hiding ( Values )
38+import qualified Opaleye.Internal.Tag as Opaleye
35import Text.PrettyPrint ( Doc )
41import Text.PrettyPrint ( Doc )
@@ -45,6 +51,7 @@ import Rel8.Table ( Table )
45import Rel8.Table.Cols ( toCols )
51import Rel8.Table.Cols ( toCols )
46import Rel8.Table.Name ( namesFromLabels )
52import Rel8.Table.Name ( namesFromLabels )
47import Rel8.Table.Opaleye ( castTable, exprsWithNames )
53import Rel8.Table.Opaleye ( castTable, exprsWithNames )
54+import qualified Rel8.Table.Opaleye as T
48import Rel8.Table.Serialize ( Serializable, parse )
55import Rel8.Table.Serialize ( Serializable, parse )
49import Rel8.Table.Undefined ( undefined )
56import Rel8.Table.Undefined ( undefined )
@@ -80,12 +87,33 @@ ppSelect query =
80 never = pure (toPrimExpr false)
87 never = pure (toPrimExpr false)
90+ppRows :: Table Expr a => Query a -> Doc
91+ppRows query = case optimize primQuery of
92+ -- Special case VALUES because we can't use DEFAULT inside a SELECT
93+ Optimized (Opaleye.Product ((_, Opaleye.Values symbols rows) :| []) [])
94+ | eqSymbols symbols (toList (T.exprs a)) ->
95+ Opaleye.ppValues_ (map Opaleye.sqlExpr <$> toList rows)
98+ (a, primQuery, _) = Opaleye.runSimpleQueryArrStart (toOpaleye query) ()
100+ eqSymbols (symbol : symbols) (Opaleye.AttrExpr symbol' : exprs)
101+ | eqSymbol symbol symbol' = eqSymbols symbols exprs
103+ eqSymbols [] [] = True
104+ eqSymbols _ _ = False
107+ (Opaleye.Symbol name (Opaleye.UnsafeTag tag))
108+ (Opaleye.Symbol name' (Opaleye.UnsafeTag tag'))
109+ = name == name' && tag == tag'
83ppPrimSelect :: Query a -> (Optimized Doc, a)
112ppPrimSelect :: Query a -> (Optimized Doc, a)
84ppPrimSelect query =
113ppPrimSelect query =
85 (Opaleye.ppSql . primSelect <$> optimize primQuery, a)
114 (Opaleye.ppSql . primSelect <$> optimize primQuery, a)
88− Opaleye.runSimpleQueryArrStart (toOpaleye query) ()
116+ (a, primQuery, _) = Opaleye.runSimpleQueryArrStart (toOpaleye query) ()
91data Optimized a = Empty | Unit | Optimized a
119data Optimized a = Empty | Unit | Optimized a