Skip to content

Commit 76fd411

Browse files
committed
refactor: asJsonF/asJsonSingleF Routine param
1 parent fad4732 commit 76fd411

File tree

3 files changed

+30
-22
lines changed

3 files changed

+30
-22
lines changed

src/PostgREST/Query.hs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,11 @@ import qualified Hasql.Encoders as HE
2828
import qualified Hasql.Statement as SQL
2929
import qualified Hasql.Transaction as SQL
3030

31-
import qualified PostgREST.Error as Error
32-
import qualified PostgREST.Query.QueryBuilder as QueryBuilder
33-
import qualified PostgREST.Query.Statements as Statements
34-
import qualified PostgREST.RangeQuery as RangeQuery
35-
import qualified PostgREST.SchemaCache as SchemaCache
36-
import qualified PostgREST.SchemaCache.Routine as Routine
31+
import qualified PostgREST.Error as Error
32+
import qualified PostgREST.Query.QueryBuilder as QueryBuilder
33+
import qualified PostgREST.Query.Statements as Statements
34+
import qualified PostgREST.RangeQuery as RangeQuery
35+
import qualified PostgREST.SchemaCache as SchemaCache
3736

3837
import Data.Scientific (FPFormat (..), formatScientific, isInteger)
3938

@@ -153,13 +152,11 @@ deleteQuery mrPlan apiReq@ApiRequest{..} conf = do
153152
pure resultSet
154153

155154
invokeQuery :: Routine -> CallReadPlan -> ApiRequest -> AppConfig -> PgVersion -> DbHandler ResultSet
156-
invokeQuery proc CallReadPlan{crReadPlan, crCallPlan, crBinField} apiReq@ApiRequest{iPreferences=Preferences{..}, ..} conf@AppConfig{..} pgVer = do
155+
invokeQuery rout CallReadPlan{crReadPlan, crCallPlan, crBinField} apiReq@ApiRequest{iPreferences=Preferences{..}, ..} conf@AppConfig{..} pgVer = do
157156
resultSet <-
158157
lift . SQL.statement mempty $
159158
Statements.prepareCall
160-
(Routine.funcReturnsScalar proc)
161-
(Routine.funcReturnsSingleComposite proc)
162-
(Routine.funcReturnsSetOfScalar proc)
159+
rout
163160
(QueryBuilder.callPlanToQuery crCallPlan pgVer)
164161
(QueryBuilder.readPlanToQuery crReadPlan)
165162
(QueryBuilder.readPlanToCountQuery crReadPlan)

src/PostgREST/Query/SqlFragment.hs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ import PostgREST.RangeQuery (NonnegRange, allRange,
8080
rangeLimit, rangeOffset)
8181
import PostgREST.SchemaCache.Identifiers (FieldName,
8282
QualifiedIdentifier (..))
83+
import PostgREST.SchemaCache.Routine (Routine (..),
84+
funcReturnsScalar,
85+
funcReturnsSetOfScalar,
86+
funcReturnsSingleComposite)
8387

8488
import Protolude hiding (cast)
8589

@@ -183,17 +187,23 @@ asCsvF = asCsvHeaderF <> " || '\n' || " <> asCsvBodyF
183187
")"
184188
asCsvBodyF = "coalesce(string_agg(substring(_postgrest_t::text, 2, length(_postgrest_t::text) - 2), '\n'), '')"
185189

186-
asJsonSingleF :: Bool -> SqlFragment
187-
asJsonSingleF returnsScalar
190+
asJsonSingleF :: Maybe Routine -> SqlFragment
191+
asJsonSingleF rout
188192
| returnsScalar = "coalesce(json_agg(_postgrest_t.pgrst_scalar)->0, 'null')"
189193
| otherwise = "coalesce(json_agg(_postgrest_t)->0, 'null')"
194+
where
195+
returnsScalar = maybe False funcReturnsScalar rout
190196

191-
asJsonF :: Bool -> Bool -> Bool -> SqlFragment
192-
asJsonF returnsScalar returnsSetOfScalar returnsSingleComposite
197+
asJsonF :: Maybe Routine -> SqlFragment
198+
asJsonF rout
193199
| returnsSingleComposite = "coalesce(json_agg(_postgrest_t)->0, 'null')"
194200
| returnsScalar = "coalesce(json_agg(_postgrest_t.pgrst_scalar)->0, 'null')"
195201
| returnsSetOfScalar = "coalesce(json_agg(_postgrest_t.pgrst_scalar), '[]')"
196202
| otherwise = "coalesce(json_agg(_postgrest_t), '[]')"
203+
where
204+
(returnsSingleComposite, returnsScalar, returnsSetOfScalar) = case rout of
205+
Just r -> (funcReturnsSingleComposite r, funcReturnsScalar r, funcReturnsSetOfScalar r)
206+
Nothing -> (False, False, False)
197207

198208
asXmlF :: FieldName -> SqlFragment
199209
asXmlF fieldName = "coalesce(xmlagg(_postgrest_t." <> pgFmtIdent fieldName <> "), '')"

src/PostgREST/Query/Statements.hs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import PostgREST.MediaType (MTPlanAttrs (..),
3232
getMediaType)
3333
import PostgREST.Query.SqlFragment
3434
import PostgREST.SchemaCache.Identifiers (FieldName)
35+
import PostgREST.SchemaCache.Routine (Routine)
3536

3637
import Protolude
3738

@@ -86,8 +87,8 @@ prepareWrite selectQuery mutateQuery isInsert mt rep pKeys =
8687
| rep /= Full = "''"
8788
| getMediaType mt == MTTextCSV = asCsvF
8889
| getMediaType mt == MTGeoJSON = asGeoJsonF
89-
| getMediaType mt == MTSingularJSON = asJsonSingleF False
90-
| otherwise = asJsonF False False False
90+
| getMediaType mt == MTSingularJSON = asJsonSingleF Nothing
91+
| otherwise = asJsonF Nothing
9192

9293
selectF
9394
-- prevent using any of the column names in ?select= when no response is returned from the CTE
@@ -119,21 +120,21 @@ prepareRead selectQuery countQuery countTotal mt binaryField =
119120

120121
bodyF
121122
| getMediaType mt == MTTextCSV = asCsvF
122-
| getMediaType mt == MTSingularJSON = asJsonSingleF False
123+
| getMediaType mt == MTSingularJSON = asJsonSingleF Nothing
123124
| getMediaType mt == MTGeoJSON = asGeoJsonF
124125
| isJust binaryField && getMediaType mt == MTTextXML = asXmlF $ fromJust binaryField
125126
| isJust binaryField = asBinaryF $ fromJust binaryField
126-
| otherwise = asJsonF False False False
127+
| otherwise = asJsonF Nothing
127128

128129
decodeIt :: HD.Result ResultSet
129130
decodeIt = case mt of
130131
MTPlan{} -> planRow
131132
_ -> HD.singleRow $ standardRow True
132133

133-
prepareCall :: Bool -> Bool -> Bool -> SQL.Snippet -> SQL.Snippet -> SQL.Snippet -> Bool ->
134+
prepareCall :: Routine -> SQL.Snippet -> SQL.Snippet -> SQL.Snippet -> Bool ->
134135
MediaType -> Maybe FieldName -> Bool ->
135136
SQL.Statement () ResultSet
136-
prepareCall returnsScalar returnsSingleComposite returnsSetOfScalar callProcQuery selectQuery countQuery countTotal mt binaryField =
137+
prepareCall rout callProcQuery selectQuery countQuery countTotal mt binaryField =
137138
SQL.dynamicallyParameterized (mtSnippet mt snippet) decodeIt
138139
where
139140
snippet =
@@ -151,12 +152,12 @@ prepareCall returnsScalar returnsSingleComposite returnsSetOfScalar callProcQuer
151152
(countCTEF, countResultF) = countF countQuery countTotal
152153

153154
bodyF
154-
| getMediaType mt == MTSingularJSON = asJsonSingleF returnsScalar
155+
| getMediaType mt == MTSingularJSON = asJsonSingleF $ Just rout
155156
| getMediaType mt == MTTextCSV = asCsvF
156157
| getMediaType mt == MTGeoJSON = asGeoJsonF
157158
| isJust binaryField && getMediaType mt == MTTextXML = asXmlF $ fromJust binaryField
158159
| isJust binaryField = asBinaryF $ fromJust binaryField
159-
| otherwise = asJsonF returnsScalar returnsSetOfScalar returnsSingleComposite
160+
| otherwise = asJsonF $ Just rout
160161

161162
decodeIt :: HD.Result ResultSet
162163
decodeIt = case mt of

0 commit comments

Comments
 (0)