on dev help sign in
set returning functions
cc7dadcEitan Chatav
squeal-postgresql/squeal-postgresql.cabal+1
@@ -34,6 +34,7 @@ library
34 Squeal.PostgreSQL.Expression.Math
34 Squeal.PostgreSQL.Expression.Math
35 Squeal.PostgreSQL.Expression.Null
35 Squeal.PostgreSQL.Expression.Null
36 Squeal.PostgreSQL.Expression.Parameter
36 Squeal.PostgreSQL.Expression.Parameter
37+ Squeal.PostgreSQL.Expression.SetOf
37 Squeal.PostgreSQL.Expression.Sort
38 Squeal.PostgreSQL.Expression.Sort
38 Squeal.PostgreSQL.Expression.Subquery
39 Squeal.PostgreSQL.Expression.Subquery
39 Squeal.PostgreSQL.Expression.Text
40 Squeal.PostgreSQL.Expression.Text
squeal-postgresql/src/Squeal/PostgreSQL.hs+2
@@ -206,6 +206,7 @@ module Squeal.PostgreSQL
206 , module Squeal.PostgreSQL.Expression.Math
206 , module Squeal.PostgreSQL.Expression.Math
207 , module Squeal.PostgreSQL.Expression.Null
207 , module Squeal.PostgreSQL.Expression.Null
208 , module Squeal.PostgreSQL.Expression.Parameter
208 , module Squeal.PostgreSQL.Expression.Parameter
209+ , module Squeal.PostgreSQL.Expression.SetOf
209 , module Squeal.PostgreSQL.Expression.Sort
210 , module Squeal.PostgreSQL.Expression.Sort
210 , module Squeal.PostgreSQL.Expression.Subquery
211 , module Squeal.PostgreSQL.Expression.Subquery
211 , module Squeal.PostgreSQL.Expression.Text
212 , module Squeal.PostgreSQL.Expression.Text
@@ -234,6 +235,7 @@ import Squeal.PostgreSQL.Expression.Logic
234import Squeal.PostgreSQL.Expression.Math
235import Squeal.PostgreSQL.Expression.Math
235import Squeal.PostgreSQL.Expression.Null
236import Squeal.PostgreSQL.Expression.Null
236import Squeal.PostgreSQL.Expression.Parameter
237import Squeal.PostgreSQL.Expression.Parameter
238+import Squeal.PostgreSQL.Expression.SetOf
237import Squeal.PostgreSQL.Expression.Sort
239import Squeal.PostgreSQL.Expression.Sort
238import Squeal.PostgreSQL.Expression.Subquery
240import Squeal.PostgreSQL.Expression.Subquery
239import Squeal.PostgreSQL.Expression.Text
241import Squeal.PostgreSQL.Expression.Text
squeal-postgresql/src/Squeal/PostgreSQL/Expression/Collection.hs+7
@@ -19,6 +19,7 @@ module Squeal.PostgreSQL.Expression.Collection
19 , array2
19 , array2
20 , cardinality
20 , cardinality
21 , index
21 , index
22+ , unnest
22 , row
23 , row
23 , field
24 , field
24 ) where
25 ) where
@@ -30,6 +31,7 @@ import qualified Generics.SOP as SOP
30
31
31import Squeal.PostgreSQL.Alias
32import Squeal.PostgreSQL.Alias
32import Squeal.PostgreSQL.Expression
33import Squeal.PostgreSQL.Expression
34+import Squeal.PostgreSQL.Expression.SetOf
33import Squeal.PostgreSQL.List
35import Squeal.PostgreSQL.List
34import Squeal.PostgreSQL.Render
36import Squeal.PostgreSQL.Render
35import Squeal.PostgreSQL.Schema
37import Squeal.PostgreSQL.Schema
@@ -109,6 +111,11 @@ index
109index n expr = UnsafeExpression $
111index n expr = UnsafeExpression $
110 parenthesized (renderSQL expr) <> "[" <> fromString (show n) <> "]"
112 parenthesized (renderSQL expr) <> "[" <> fromString (show n) <> "]"
111
113
114+-- | Expand an array to a set of rows
115+unnest
116+ :: SetOfFunction (null ('PGvararray ty)) '["unnest" ::: '["unnest" ::: ty]]
117+unnest = unsafeSetOfFunction "unnest"
118+
112-- | A row constructor is an expression that builds a row value
119-- | A row constructor is an expression that builds a row value
113-- (also called a composite value) using values for its member fields.
120-- (also called a composite value) using values for its member fields.
114--
121--
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
53 -- ** With
53 -- ** With
54 , With (..)
54 , With (..)
55 , CommonTableExpression (..)
55 , CommonTableExpression (..)
56− -- ** Unnest
57− , unnest
58 -- ** Json
56 -- ** Json
59 , jsonEach
57 , jsonEach
60 , jsonbEach
58 , jsonbEach
@@ -726,12 +724,6 @@ unsafeSetOfFunction
726unsafeSetOfFunction fun expr = UnsafeFromClause $
724unsafeSetOfFunction fun expr = UnsafeFromClause $
727 fun <> "(" <> renderSQL expr <> ")"
725 fun <> "(" <> renderSQL expr <> ")"
728
726
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−
735-- | Expands the outermost JSON object into a set of key/value pairs.
727-- | Expands the outermost JSON object into a set of key/value pairs.
736-- >>> import Data.Aeson
728-- >>> import Data.Aeson
737-- >>> printSQL (select Star (from (jsonEach (literal (Json (object ["a" .= "foo", "b" .= "bar"]))))))
729-- >>> printSQL (select Star (from (jsonEach (literal (Json (object ["a" .= "foo", "b" .= "bar"]))))))