on dev help sign in
set returning functions
commitcc7dadceffc444f7083c799d4d699139040fcc16 authorEitan Chatav <eitan@Eitans-MacBook-Pro.local> dateFri 12 Apr 2019, 14:22 (8 years ago) parent41bf0a9
5 files changed+79−8
squeal-postgresql/squeal-postgresql.cabal+1 squeal-postgresql/src/Squeal/PostgreSQL.hs+2 squeal-postgresql/src/Squeal/PostgreSQL/Expression/Collection.hs+7 squeal-postgresql/src/Squeal/PostgreSQL/Expression/SetOf.hs+69 squeal-postgresql/src/Squeal/PostgreSQL/Query.hs−8
squeal-postgresql/squeal-postgresql.cabal+1
@@ -34,6 +34,7 @@ library
3434 Squeal.PostgreSQL.Expression.Math
3535 Squeal.PostgreSQL.Expression.Null
3636 Squeal.PostgreSQL.Expression.Parameter
37+ Squeal.PostgreSQL.Expression.SetOf
3738 Squeal.PostgreSQL.Expression.Sort
3839 Squeal.PostgreSQL.Expression.Subquery
3940 Squeal.PostgreSQL.Expression.Text
squeal-postgresql/src/Squeal/PostgreSQL.hs+2
@@ -206,6 +206,7 @@ module Squeal.PostgreSQL
206206 , module Squeal.PostgreSQL.Expression.Math
207207 , module Squeal.PostgreSQL.Expression.Null
208208 , module Squeal.PostgreSQL.Expression.Parameter
209+ , module Squeal.PostgreSQL.Expression.SetOf
209210 , module Squeal.PostgreSQL.Expression.Sort
210211 , module Squeal.PostgreSQL.Expression.Subquery
211212 , module Squeal.PostgreSQL.Expression.Text
@@ -234,6 +235,7 @@ import Squeal.PostgreSQL.Expression.Logic
234235import Squeal.PostgreSQL.Expression.Math
235236import Squeal.PostgreSQL.Expression.Null
236237import Squeal.PostgreSQL.Expression.Parameter
238+import Squeal.PostgreSQL.Expression.SetOf
237239import Squeal.PostgreSQL.Expression.Sort
238240import Squeal.PostgreSQL.Expression.Subquery
239241import Squeal.PostgreSQL.Expression.Text
squeal-postgresql/src/Squeal/PostgreSQL/Expression/Collection.hs+7
@@ -19,6 +19,7 @@ module Squeal.PostgreSQL.Expression.Collection
1919 , array2
2020 , cardinality
2121 , index
22+ , unnest
2223 , row
2324 , field
2425 ) where
@@ -30,6 +31,7 @@ import qualified Generics.SOP as SOP
3031
3132import Squeal.PostgreSQL.Alias
3233import Squeal.PostgreSQL.Expression
34+import Squeal.PostgreSQL.Expression.SetOf
3335import Squeal.PostgreSQL.List
3436import Squeal.PostgreSQL.Render
3537import Squeal.PostgreSQL.Schema
@@ -109,6 +111,11 @@ index
109111index n expr = UnsafeExpression $
110112 parenthesized (renderSQL expr) <> "[" <> fromString (show n) <> "]"
111113
114+-- | Expand an array to a set of rows
115+unnest
116+ :: SetOfFunction (null ('PGvararray ty)) '["unnest" ::: '["unnest" ::: ty]]
117+unnest = unsafeSetOfFunction "unnest"
118+
112119-- | A row constructor is an expression that builds a row value
113120-- (also called a composite value) using values for its member fields.
114121--
squeal-postgresql/src/Squeal/PostgreSQL/Expression/SetOf.hsnew file+69
@@ -0,0 +1,69 @@
1+{-# LANGUAGE
2+ AllowAmbiguousTypes
3+ , DataKinds
4+ , FlexibleContexts
5+ , OverloadedStrings
6+ , PolyKinds
7+ , RankNTypes
8+ , TypeOperators
9+#-}
10+
11+module Squeal.PostgreSQL.Expression.SetOf
12+ ( SetOfFunction
13+ , unsafeSetOfFunction
14+ , SetOfFunctionN
15+ , unsafeSetOfFunctionN
16+ , generateSeries
17+ , generateSeriesStep
18+ , generateSeriesTimestamp
19+ ) where
20+
21+import Data.ByteString (ByteString)
22+
23+import qualified Generics.SOP as SOP
24+
25+import Squeal.PostgreSQL.Alias
26+import Squeal.PostgreSQL.Expression
27+import Squeal.PostgreSQL.List
28+import Squeal.PostgreSQL.Render
29+import Squeal.PostgreSQL.Query
30+import Squeal.PostgreSQL.Schema
31+
32+type SetOfFunction ty setof
33+ = forall outer commons schemas params
34+ . Expression outer commons 'Ungrouped schemas params '[] ty
35+ -> FromClause outer commons schemas params setof
36+
37+unsafeSetOfFunction :: ByteString -> SetOfFunction ty setof
38+unsafeSetOfFunction fun x = UnsafeFromClause $
39+ fun <> parenthesized (renderSQL x)
40+
41+type SetOfFunctionN tys setof
42+ = forall outer commons schemas params
43+ . NP (Expression outer commons 'Ungrouped schemas params '[]) tys
44+ -> FromClause outer commons schemas params setof
45+
46+unsafeSetOfFunctionN
47+ :: SOP.SListI tys
48+ => ByteString
49+ -> SetOfFunctionN tys setof
50+unsafeSetOfFunctionN fun xs = UnsafeFromClause $
51+ fun <> parenthesized (renderCommaSeparated renderSQL xs)
52+
53+generateSeries
54+ :: ty `In` '[ 'PGint4, 'PGint8, 'PGnumeric]
55+ => SetOfFunctionN '[ null ty, null ty]
56+ '["generate_series" ::: '["generate_series" ::: '[null ty]]]
57+generateSeries = unsafeSetOfFunctionN "generate_series"
58+
59+generateSeriesStep
60+ :: ty `In` '[ 'PGint4, 'PGint8, 'PGnumeric]
61+ => SetOfFunctionN '[null ty, null ty, null ty]
62+ '["generate_series" ::: '["generate_series" ::: '[null ty]]]
63+generateSeriesStep = unsafeSetOfFunctionN "generate_series"
64+
65+generateSeriesTimestamp
66+ :: ty `In` '[ 'PGtimestamp, 'PGtimestamptz]
67+ => SetOfFunctionN '[null ty, null ty, null 'PGinterval]
68+ '["generate_series" ::: '["generate_series" ::: '[null ty]]]
69+generateSeriesTimestamp = unsafeSetOfFunctionN "generate_series"
squeal-postgresql/src/Squeal/PostgreSQL/Query.hs−8
@@ -53,8 +53,6 @@ module Squeal.PostgreSQL.Query
5353 -- ** With
5454 , With (..)
5555 , CommonTableExpression (..)
56− -- ** Unnest
57− , unnest
5856 -- ** Json
5957 , jsonEach
6058 , jsonbEach
@@ -726,12 +724,6 @@ unsafeSetOfFunction
726724unsafeSetOfFunction fun expr = UnsafeFromClause $
727725 fun <> "(" <> renderSQL expr <> ")"
728726
729−-- | Expand an array to a set of rows
730−unnest
731− :: Expression outer commons 'Ungrouped schemas params '[] (nullity ('PGvararray ty))
732− -> FromClause outer commons schemas params '["unnest" ::: '["unnest" ::: ty]]
733−unnest = unsafeSetOfFunction "unnest"
734−
735727-- | Expands the outermost JSON object into a set of key/value pairs.
736728-- >>> import Data.Aeson
737729-- >>> printSQL (select Star (from (jsonEach (literal (Json (object ["a" .= "foo", "b" .= "bar"]))))))