@@ -17,6 +17,7 @@ Squeal queries.
1717 , GeneralizedNewtypeDeriving
1818 , LambdaCase
1919 , MultiParamTypeClasses
20+ , OverloadedLabels
2021 , OverloadedStrings
2122 , QuantifiedConstraints
2223 , ScopedTypeVariables
@@ -57,8 +58,8 @@ module Squeal.PostgreSQL.Query
5758 -- ** Json
5859 , jsonEach
5960 , jsonbEach
60− , jsonEachAsText
61− , jsonbEachAsText
61+ , jsonEachText
62+ , jsonbEachText
6263 , jsonObjectKeys
6364 , jsonbObjectKeys
6465 , jsonPopulateRecord
@@ -717,89 +718,108 @@ JSON stuff
717718unsafeSetOfFunction
718719 :: ByteString
719720 -> Expression outer 'Ungrouped commons schemas params '[] ty
720− -> Query outer commons schemas params row
721−unsafeSetOfFunction fun expr = UnsafeQuery $
722− "SELECT * FROM " <> fun <> "(" <> renderSQL expr <> ")"
721+ -> FromClause outer commons schemas params from
722+unsafeSetOfFunction fun expr = UnsafeFromClause $
723+ fun <> "(" <> renderSQL expr <> ")"
723724
724725-- | Expand an array to a set of rows
725726unnest
726727 :: Expression outer 'Ungrouped commons schemas params '[] (nullity ('PGvararray ty))
727− -> Query outer commons schemas params '[ "unnest" ::: ty ]
728+ -> FromClause outer commons schemas params '["unnest" ::: '["unnest" ::: ty]]
728729unnest = unsafeSetOfFunction "unnest"
729730
730731-- | Expands the outermost JSON object into a set of key/value pairs.
732+-- >>> import Data.Aeson
733+-- >>> printSQL (select Star (from (jsonEach (jsonLit (object ["a" .= "foo", "b" .= "bar"])))))
734+-- SELECT * FROM json_each(('{"a":"foo","b":"bar"}' :: json))
731735jsonEach
732− :: Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjson) -- ^ json object
733− -> Query outer commons schemas params
734− '["key" ::: 'NotNull 'PGtext, "value" ::: 'NotNull 'PGjson]
736+ :: Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjson) -- ^ json object
737+ -> FromClause outer commons schemas params
738+ '["json_each" ::: '["key" ::: 'NotNull 'PGtext, "value" ::: 'NotNull 'PGjson]]
735739jsonEach = unsafeSetOfFunction "json_each"
736740
737741-- | Expands the outermost binary JSON object into a set of key/value pairs.
742+-- >>> import Data.Aeson
743+-- >>> printSQL (select Star (from (jsonbEach (jsonbLit (object ["a" .= "foo", "b" .= "bar"])))))
744+-- SELECT * FROM jsonb_each(('{"a":"foo","b":"bar"}' :: jsonb))
738745jsonbEach
739− :: Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjsonb) -- ^ jsonb object
740− -> Query outer commons schemas params
741− '["key" ::: 'NotNull 'PGtext, "value" ::: 'NotNull 'PGjsonb]
746+ :: Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjsonb) -- ^ jsonb object
747+ -> FromClause outer commons schemas params
748+ '["jsonb_each" ::: '["key" ::: 'NotNull 'PGtext, "value" ::: 'NotNull 'PGjson]]
742749jsonbEach = unsafeSetOfFunction "jsonb_each"
743750
744−-- | Expands the outermost JSON object into a set of key/value pairs.
745−jsonEachAsText
746− :: Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjson) -- ^ json object
747− -> Query outer commons schemas params
748− '["key" ::: 'NotNull 'PGtext, "value" ::: 'NotNull 'PGtext]
749−jsonEachAsText = unsafeSetOfFunction "json_each_text"
751+-- | Expands the outermost JSON object into a set of key/value pairs.-- | Expands the outermost binary JSON object into a set of key/value pairs.
752+-- >>> import Data.Aeson
753+-- >>> printSQL (select Star (from (jsonEachText (jsonLit (object ["a" .= "foo", "b" .= "bar"])))))
754+-- SELECT * FROM json_each_text(('{"a":"foo","b":"bar"}' :: json))
755+jsonEachText
756+ :: Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjson) -- ^ json object
757+ -> FromClause outer commons schemas params
758+ '["json_each" ::: '["key" ::: 'NotNull 'PGtext, "value" ::: 'NotNull 'PGtext]]
759+jsonEachText = unsafeSetOfFunction "json_each_text"
750760
751761-- | Expands the outermost binary JSON object into a set of key/value pairs.
752−jsonbEachAsText
753− :: Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjsonb) -- ^ jsonb object
754− -> Query outer commons schemas params
755− '["key" ::: 'NotNull 'PGtext, "value" ::: 'NotNull 'PGtext]
756−jsonbEachAsText = unsafeSetOfFunction "jsonb_each_text"
762+-- >>> import Data.Aeson
763+-- >>> printSQL (select Star (from (jsonbEachText (jsonbLit (object ["a" .= "foo", "b" .= "bar"])))))
764+-- SELECT * FROM jsonb_each_text(('{"a":"foo","b":"bar"}' :: jsonb))
765+jsonbEachText
766+ :: Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjsonb) -- ^ jsonb object
767+ -> FromClause outer commons schemas params
768+ '["jsonb_each" ::: '["key" ::: 'NotNull 'PGtext, "value" ::: 'NotNull 'PGtext]]
769+jsonbEachText = unsafeSetOfFunction "jsonb_each_text"
757770
758771-- | Returns set of keys in the outermost JSON object.
772+-- >>> import Data.Aeson
773+-- >>> printSQL (jsonObjectKeys (jsonLit (object ["a" .= "foo", "b" .= "bar"])))
774+-- json_object_keys(('{"a":"foo","b":"bar"}' :: json))
759775jsonObjectKeys
760776 :: Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjson) -- ^ json object
761− -> Query outer commons schemas params '["json_object_keys" ::: 'NotNull 'PGtext]
777+ -> FromClause outer commons schemas params
778+ '["json_object_keys" ::: '["json_object_keys" ::: 'NotNull 'PGtext]]
762779jsonObjectKeys = unsafeSetOfFunction "json_object_keys"
763780
764781-- | Returns set of keys in the outermost JSON object.
782+-- >>> import Data.Aeson
783+-- >>> printSQL (jsonbObjectKeys (jsonbLit (object ["a" .= "foo", "b" .= "bar"])))
784+-- jsonb_object_keys(('{"a":"foo","b":"bar"}' :: jsonb))
765785jsonbObjectKeys
766786 :: Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjsonb) -- ^ jsonb object
767− -> Query outer commons schemas params '["jsonb_object_keys" ::: 'NotNull 'PGtext]
787+ -> FromClause outer commons schemas params
788+ '["jsonb_object_keys" ::: '["jsonb_object_keys" ::: 'NotNull 'PGtext]]
768789jsonbObjectKeys = unsafeSetOfFunction "jsonb_object_keys"
769790
770791unsafePopulateFunction
771− :: ByteString
792+ :: KnownSymbol fun
793+ => Alias fun
772794 -> TypeExpression schemas (nullity ('PGcomposite row))
773795 -> Expression outer 'Ungrouped commons schemas params '[] ty
774− -> Query outer commons schemas params row
775−unsafePopulateFunction fun ty expr = UnsafeQuery $
776− "SELECT * FROM " <> fun <> "("
777− <> "null::" <> renderSQL ty <> ", "
778− <> renderSQL expr <> ")"
796+ -> FromClause outer commons schemas params '[fun ::: row]
797+unsafePopulateFunction fun ty expr = UnsafeFromClause $ renderSQL fun
798+ <> parenthesized ("null::" <> renderSQL ty <> ", " <> renderSQL expr)
779799
780800-- | Expands the JSON expression to a row whose columns match the record
781801-- type defined by the given table.
782802jsonPopulateRecord
783803 :: TypeExpression schemas (nullity ('PGcomposite row)) -- ^ row type
784804 -> Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjson) -- ^ json object
785− -> Query outer commons schemas params row
786−jsonPopulateRecord = unsafePopulateFunction "json_populate_record"
805+ -> FromClause outer commons schemas params '["json_populate_record" ::: row]
806+jsonPopulateRecord = unsafePopulateFunction #json_populate_record
787807
788808-- | Expands the binary JSON expression to a row whose columns match the record
789809-- type defined by the given table.
790810jsonbPopulateRecord
791811 :: TypeExpression schemas (nullity ('PGcomposite row)) -- ^ row type
792− -> Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjsonb) -- ^ jsonb object
793− -> Query outer commons schemas params row
794−jsonbPopulateRecord = unsafePopulateFunction "jsonb_populate_record"
812+ -> Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjsonb) -- ^ jsonb object
813+ -> FromClause outer commons schemas params '["jsonb_populate_record" ::: row]
814+jsonbPopulateRecord = unsafePopulateFunction #jsonb_populate_record
795815
796816-- | Expands the outermost array of objects in the given JSON expression to a
797817-- set of rows whose columns match the record type defined by the given table.
798818jsonPopulateRecordSet
799819 :: TypeExpression schemas (nullity ('PGcomposite row)) -- ^ row type
800− -> Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjson) -- ^ json array
801− -> Query outer commons schemas params row
802−jsonPopulateRecordSet = unsafePopulateFunction "json_populate_record_set"
820+ -> Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjson) -- ^ json array
821+ -> FromClause outer commons schemas params '["json_populate_record_set" ::: row]
822+jsonPopulateRecordSet = unsafePopulateFunction #json_populate_record_set
803823
804824-- | Expands the outermost array of objects in the given binary JSON expression
805825-- to a set of rows whose columns match the record type defined by the given
@@ -807,54 +827,52 @@ jsonPopulateRecordSet = unsafePopulateFunction "json_populate_record_set"
807827jsonbPopulateRecordSet
808828 :: TypeExpression schemas (nullity ('PGcomposite row)) -- ^ row type
809829 -> Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjsonb) -- ^ jsonb array
810− -> Query outer commons schemas params row
811−jsonbPopulateRecordSet = unsafePopulateFunction "jsonb_populate_record_set"
830+ -> FromClause outer commons schemas params '["jsonb_populate_record_set" ::: row]
831+jsonbPopulateRecordSet = unsafePopulateFunction #jsonb_populate_record_set
812832
813833unsafeRecordFunction
814834 :: (SListI record, json `In` PGJsonType)
815835 => ByteString
816− -> Expression outer 'Ungrouped commons schemas params '[] (nullity json)
817− -> NP (Aliased (TypeExpression schemas)) record
818− -> Query outer commons schemas params record
819−unsafeRecordFunction fun expr types = UnsafeQuery $
820− "SELECT * FROM " <> fun <> "("
821− <> renderSQL expr <> ")"
822− <+> "AS" <+> "x" <> parenthesized (renderCommaSeparated renderTy types)
836+ -> Expression outer 'Ungrouped commons schemas params '[] (nullity json)
837+ -> Aliased (NP (Aliased (TypeExpression schemas))) (tab ::: record)
838+ -> FromClause outer commons schemas params '[tab ::: record]
839+unsafeRecordFunction fun expr (types `As` tab) = UnsafeFromClause $
840+ fun <> parenthesized (renderSQL expr) <+> "AS" <+> renderSQL tab
841+ <> parenthesized (renderCommaSeparated renderTy types)
823842 where
824843 renderTy :: Aliased (TypeExpression schemas) ty -> ByteString
825− renderTy (ty `As` alias) =
826− renderSQL alias <+> renderSQL ty
844+ renderTy (ty `As` alias) = renderSQL alias <+> renderSQL ty
827845
828846-- | Builds an arbitrary record from a JSON object.
829847jsonToRecord
830848 :: SListI record
831− => Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjson) -- ^ json object
832− -> NP (Aliased (TypeExpression schemas)) record -- ^ record types
833− -> Query outer commons schemas params record
849+ => Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjson) -- ^ json object
850+ -> Aliased (NP (Aliased (TypeExpression schemas))) (tab ::: record)
851+ -> FromClause outer commons schemas params '[tab ::: record]
834852jsonToRecord = unsafeRecordFunction "json_to_record"
835853
836854-- | Builds an arbitrary record from a binary JSON object.
837855jsonbToRecord
838856 :: SListI record
839− => Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjsonb) -- ^ jsonb object
840− -> NP (Aliased (TypeExpression schemas)) record -- ^ record types
841− -> Query outer commons schemas params record
857+ => Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjsonb) -- ^ jsonb object
858+ -> Aliased (NP (Aliased (TypeExpression schemas))) (tab ::: record)
859+ -> FromClause outer commons schemas params '[tab ::: record]
842860jsonbToRecord = unsafeRecordFunction "jsonb_to_record"
843861
844862-- | Builds an arbitrary set of records from a JSON array of objects.
845863jsonToRecordSet
846864 :: SListI record
847865 => Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjson) -- ^ json array
848− -> NP (Aliased (TypeExpression schemas)) record -- ^ record types
849− -> Query outer commons schemas params record
866+ -> Aliased (NP (Aliased (TypeExpression schemas))) (tab ::: record)
867+ -> FromClause outer commons schemas params '[tab ::: record]
850868jsonToRecordSet = unsafeRecordFunction "json_to_record_set"
851869
852870-- | Builds an arbitrary set of records from a binary JSON array of objects.
853871jsonbToRecordSet
854872 :: SListI record
855873 => Expression outer 'Ungrouped commons schemas params '[] (nullity 'PGjsonb) -- ^ jsonb array
856− -> NP (Aliased (TypeExpression schemas)) record -- ^ record types
857− -> Query outer commons schemas params record
874+ -> Aliased (NP (Aliased (TypeExpression schemas))) (tab ::: record)
875+ -> FromClause outer commons schemas params '[tab ::: record]
858876jsonbToRecordSet = unsafeRecordFunction "jsonb_to_record_set"
859877
860878{-----------------------------------------