From fff2284f989d0c8003687f7f1bc8d37e86a67120 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Tue, 27 Feb 2024 02:19:16 +0000 Subject: [PATCH] update range to use query parameters instead of headers --- postgrest/base_request_builder.py | 13 ++++++++++--- tests/_async/test_request_builder.py | 15 +++++++++++++++ tests/_sync/test_request_builder.py | 15 +++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/postgrest/base_request_builder.py b/postgrest/base_request_builder.py index 12549d0a..0a6ad2f2 100644 --- a/postgrest/base_request_builder.py +++ b/postgrest/base_request_builder.py @@ -565,7 +565,14 @@ def offset(self: _FilterT, size: int) -> _FilterT: ) return self - def range(self: Self, start: int, end: int) -> Self: - self.headers["Range-Unit"] = "items" - self.headers["Range"] = f"{start}-{end - 1}" + def range( + self: Self, start: int, end: int, foreign_table: Optional[str] = None + ) -> Self: + self.params = self.params.add( + f"{foreign_table}.offset" if foreign_table else "offset", start + ) + self.params = self.params.add( + f"{foreign_table}.limit" if foreign_table else "limit", + end - start + 1, + ) return self diff --git a/tests/_async/test_request_builder.py b/tests/_async/test_request_builder.py index dfbf0bf2..f038990d 100644 --- a/tests/_async/test_request_builder.py +++ b/tests/_async/test_request_builder.py @@ -152,6 +152,21 @@ def test_explain_options(self, request_builder: AsyncRequestBuilder): ) +class TestRange: + def test_range_on_own_table(self, request_builder: AsyncRequestBuilder): + builder = request_builder.select("*").range(0, 1) + assert builder.params["select"] == "*" + assert builder.params["limit"] == "2" + assert builder.params["offset"] == "0" + + def test_range_on_foreign_table(self, request_builder: AsyncRequestBuilder): + foreign_table = "cities" + builder = request_builder.select("*").range(1, 2, foreign_table) + assert builder.params["select"] == "*" + assert builder.params[f"{foreign_table}.limit"] == "2" + assert builder.params[f"{foreign_table}.offset"] == "1" + + @pytest.fixture def csv_api_response() -> str: return "id,name\n1,foo\n" diff --git a/tests/_sync/test_request_builder.py b/tests/_sync/test_request_builder.py index 5d8773e9..5d80a467 100644 --- a/tests/_sync/test_request_builder.py +++ b/tests/_sync/test_request_builder.py @@ -152,6 +152,21 @@ def test_explain_options(self, request_builder: SyncRequestBuilder): ) +class TestRange: + def test_range_on_own_table(self, request_builder: SyncRequestBuilder): + builder = request_builder.select("*").range(0, 1) + assert builder.params["select"] == "*" + assert builder.params["limit"] == "2" + assert builder.params["offset"] == "0" + + def test_range_on_foreign_table(self, request_builder: SyncRequestBuilder): + foreign_table = "cities" + builder = request_builder.select("*").range(1, 2, foreign_table) + assert builder.params["select"] == "*" + assert builder.params[f"{foreign_table}.limit"] == "2" + assert builder.params[f"{foreign_table}.offset"] == "1" + + @pytest.fixture def csv_api_response() -> str: return "id,name\n1,foo\n"