@@ -20,6 +20,7 @@ import PostgREST.Plan.MutatePlan as MTPlan
2020import PostgREST.Plan.ReadPlan
2121import PostgREST.Query.QueryBuilder
2222import PostgREST.Query.SqlFragment
23+ import PostgREST.RangeQuery (NonnegRange )
2324import PostgREST.SchemaCache.Routine (MediaHandler (.. ), Routine )
2425
2526import Protolude
@@ -63,50 +64,52 @@ mainWrite rPlan mtplan mt handler rep resolution = mtSnippet mt snippet
6364 _ -> (False ,False , mempty );
6465
6566mainRead :: ReadPlanTree -> SQL. Snippet -> Maybe PreferCount -> Maybe Integer ->
66- MediaType -> MediaHandler -> SQL. Snippet
67- mainRead rPlan countQuery pCount maxRows mt handler = mtSnippet mt snippet
67+ NonnegRange -> MediaType -> MediaHandler -> SQL. Snippet
68+ mainRead rPlan countQuery pCount maxRows range mt handler = mtSnippet mt snippet
6869 where
6970 snippet =
7071 " WITH " <> sourceCTE <> " AS ( " <> selectQuery <> " ) " <>
7172 countCTEF <> " " <>
7273 " SELECT " <>
7374 countResultF <> " AS total_result_set, " <>
74- pageCountSelectF Nothing <> " AS page_total, " <>
75+ pageCountSelect <> " AS page_total, " <>
7576 handlerF Nothing handler <> " AS body, " <>
7677 responseHeadersF <> " AS response_headers, " <>
7778 responseStatusF <> " AS response_status, " <>
7879 " ''" <> " AS response_inserted " <>
7980 " FROM ( SELECT * FROM " <> sourceCTE <> " ) _postgrest_t"
8081
81- (countCTEF, countResultF) = countF countQ $ shouldCount pCount
82+ (countCTEF, countResultF) = countF countQ pageCountSelect ( shouldCount pCount) maxRows range
8283 selectQuery = readPlanToQuery rPlan
84+ pageCountSelect = pageCountSelectF Nothing
8385 countQ =
8486 if pCount == Just EstimatedCount then
8587 -- LIMIT maxRows + 1 so we can determine below that maxRows was surpassed
8688 limitedQuery countQuery ((+ 1 ) <$> maxRows)
8789 else
8890 countQuery
8991
90- mainCall :: Routine -> CallPlan -> ReadPlanTree -> Maybe PreferCount ->
91- MediaType -> MediaHandler -> SQL. Snippet
92- mainCall rout cPlan rPlan pCount mt handler = mtSnippet mt snippet
92+ mainCall :: Routine -> CallPlan -> ReadPlanTree -> Maybe PreferCount -> Maybe Integer ->
93+ NonnegRange -> MediaType -> MediaHandler -> SQL. Snippet
94+ mainCall rout cPlan rPlan pCount maxRows range mt handler = mtSnippet mt snippet
9395 where
9496 snippet =
9597 " WITH " <> sourceCTE <> " AS (" <> callProcQuery <> " ) " <>
9698 countCTEF <>
9799 " SELECT " <>
98100 countResultF <> " AS total_result_set, " <>
99- pageCountSelectF ( Just rout) <> " AS page_total, " <>
101+ pageCountSelect <> " AS page_total, " <>
100102 handlerF (Just rout) handler <> " AS body, " <>
101103 responseHeadersF <> " AS response_headers, " <>
102104 responseStatusF <> " AS response_status, " <>
103105 " ''" <> " AS response_inserted " <>
104106 " FROM (" <> selectQuery <> " ) _postgrest_t"
105107
106- (countCTEF, countResultF) = countF countQuery $ shouldCount pCount
108+ (countCTEF, countResultF) = countF countQuery pageCountSelect ( shouldCount pCount) maxRows range
107109 selectQuery = readPlanToQuery rPlan
108110 callProcQuery = callPlanToQuery cPlan
109111 countQuery = readPlanToCountQuery rPlan
112+ pageCountSelect = pageCountSelectF (Just rout)
110113
111114-- This occurs after the main query runs, that's why it's prefixed with "post"
112115postExplain :: SQL. Snippet -> SQL. Snippet
0 commit comments