Skip to content

Commit 97d520e

Browse files
fix: fixed the 'order' method for 'BaseSelectRequestBuilder' (#495)
Co-authored-by: Andrew Smith <[email protected]>
1 parent b5b7b2f commit 97d520e

5 files changed

+110
-13
lines changed

postgrest/base_request_builder.py

+13-2
Original file line numberDiff line numberDiff line change
@@ -563,9 +563,20 @@ def order(
563563
.. versionchanged:: 0.10.3
564564
Allow ordering results for foreign tables with the foreign_table parameter.
565565
"""
566+
567+
new_order_parameter = (
568+
f"{foreign_table + '(' if foreign_table else ''}{column}{')' if foreign_table else ''}"
569+
f"{'.desc' if desc else ''}{'.nullsfirst' if nullsfirst else ''}"
570+
)
571+
572+
existing_order_parameter = self.params.get("order")
573+
if existing_order_parameter:
574+
self.params = self.params.remove("order")
575+
new_order_parameter = f"{existing_order_parameter},{new_order_parameter}"
576+
566577
self.params = self.params.add(
567-
f"{foreign_table}.order" if foreign_table else "order",
568-
f"{column}{'.desc' if desc else ''}{'.nullsfirst' if nullsfirst else ''}",
578+
"order",
579+
new_order_parameter,
569580
)
570581
return self
571582

tests/_async/test_filter_request_builder_integration.py

+17
Original file line numberDiff line numberDiff line change
@@ -481,3 +481,20 @@ async def test_rpc_with_range():
481481
{"nicename": "Albania", "iso": "AL"},
482482
{"nicename": "Algeria", "iso": "DZ"},
483483
]
484+
485+
486+
async def test_order():
487+
res = (
488+
await rest_client()
489+
.from_("countries")
490+
.select("country_name, iso")
491+
.limit(3)
492+
.order("nicename", desc=True)
493+
.execute()
494+
)
495+
496+
assert res.data == [
497+
{"country_name": "ZIMBABWE", "iso": "ZW"},
498+
{"country_name": "UNITED STATES", "iso": "US"},
499+
{"country_name": "UNITED KINGDOM", "iso": "GB"},
500+
]

tests/_async/test_request_builder.py

+26
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,32 @@ def test_explain_options(self, request_builder: AsyncRequestBuilder):
190190
assert "options=analyze|verbose|buffers|wal" in str(builder.headers.get("accept"))
191191

192192

193+
class TestOrder:
194+
def test_order(self, request_builder: AsyncRequestBuilder):
195+
builder = request_builder.select().order("country_name", desc=True)
196+
assert str(builder.params) == "order=country_name.desc"
197+
198+
def test_multiple_orders(self, request_builder: AsyncRequestBuilder):
199+
builder = (
200+
request_builder.select()
201+
.order("country_name", desc=True)
202+
.order("iso", desc=True)
203+
)
204+
assert str(builder.params) == "order=country_name.desc%2Ciso.desc"
205+
206+
def test_multiple_orders_on_foreign_table(self, request_builder: AsyncRequestBuilder):
207+
foreign_table = "cities"
208+
builder = (
209+
request_builder.select()
210+
.order("city_name", desc=True, foreign_table=foreign_table)
211+
.order("id", desc=True, foreign_table=foreign_table)
212+
)
213+
assert (
214+
str(builder.params)
215+
== "order=cities%28city_name%29.desc%2Ccities%28id%29.desc"
216+
)
217+
218+
193219
class TestRange:
194220
def test_range_on_own_table(self, request_builder: AsyncRequestBuilder):
195221
builder = request_builder.select("*").range(0, 1)

tests/_sync/test_filter_request_builder_integration.py

+17
Original file line numberDiff line numberDiff line change
@@ -474,3 +474,20 @@ def test_rpc_with_range():
474474
{"nicename": "Albania", "iso": "AL"},
475475
{"nicename": "Algeria", "iso": "DZ"},
476476
]
477+
478+
479+
def test_order():
480+
res = (
481+
rest_client()
482+
.from_("countries")
483+
.select("country_name, iso")
484+
.limit(3)
485+
.order("nicename", desc=True)
486+
.execute()
487+
)
488+
489+
assert res.data == [
490+
{"country_name": "ZIMBABWE", "iso": "ZW"},
491+
{"country_name": "UNITED STATES", "iso": "US"},
492+
{"country_name": "UNITED KINGDOM", "iso": "GB"},
493+
]

tests/_sync/test_request_builder.py

+37-11
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,17 @@ def test_insert_with_upsert(self, request_builder: SyncRequestBuilder):
7171
assert builder.http_method == "POST"
7272
assert builder.json == {"key1": "val1"}
7373

74+
def test_upsert_with_default_single(self, request_builder: SyncRequestBuilder):
75+
builder = request_builder.upsert([{"key1": "val1"}], default_to_null=False)
76+
assert builder.headers.get_list("prefer", True) == [
77+
"return=representation",
78+
"resolution=merge-duplicates",
79+
"missing=default",
80+
]
81+
assert builder.http_method == "POST"
82+
assert builder.json == [{"key1": "val1"}]
83+
assert builder.params.get("columns") == '"key1"'
84+
7485
def test_bulk_insert_using_default(self, request_builder: SyncRequestBuilder):
7586
builder = request_builder.insert(
7687
[{"key1": "val1", "key2": "val2"}, {"key3": "val3"}], default_to_null=False
@@ -95,17 +106,6 @@ def test_upsert(self, request_builder: SyncRequestBuilder):
95106
assert builder.http_method == "POST"
96107
assert builder.json == {"key1": "val1"}
97108

98-
def test_upsert_with_default_single(self, request_builder: SyncRequestBuilder):
99-
builder = request_builder.upsert([{"key1": "val1"}], default_to_null=False)
100-
assert builder.headers.get_list("prefer", True) == [
101-
"return=representation",
102-
"resolution=merge-duplicates",
103-
"missing=default",
104-
]
105-
assert builder.http_method == "POST"
106-
assert builder.json == [{"key1": "val1"}]
107-
assert builder.params.get("columns") == '"key1"'
108-
109109
def test_bulk_upsert_with_default(self, request_builder: SyncRequestBuilder):
110110
builder = request_builder.upsert(
111111
[{"key1": "val1", "key2": "val2"}, {"key3": "val3"}], default_to_null=False
@@ -190,6 +190,32 @@ def test_explain_options(self, request_builder: SyncRequestBuilder):
190190
assert "options=analyze|verbose|buffers|wal" in str(builder.headers.get("accept"))
191191

192192

193+
class TestOrder:
194+
def test_order(self, request_builder: SyncRequestBuilder):
195+
builder = request_builder.select().order("country_name", desc=True)
196+
assert str(builder.params) == "order=country_name.desc"
197+
198+
def test_multiple_orders(self, request_builder: SyncRequestBuilder):
199+
builder = (
200+
request_builder.select()
201+
.order("country_name", desc=True)
202+
.order("iso", desc=True)
203+
)
204+
assert str(builder.params) == "order=country_name.desc%2Ciso.desc"
205+
206+
def test_multiple_orders_on_foreign_table(self, request_builder: SyncRequestBuilder):
207+
foreign_table = "cities"
208+
builder = (
209+
request_builder.select()
210+
.order("city_name", desc=True, foreign_table=foreign_table)
211+
.order("id", desc=True, foreign_table=foreign_table)
212+
)
213+
assert (
214+
str(builder.params)
215+
== "order=cities%28city_name%29.desc%2Ccities%28id%29.desc"
216+
)
217+
218+
193219
class TestRange:
194220
def test_range_on_own_table(self, request_builder: SyncRequestBuilder):
195221
builder = request_builder.select("*").range(0, 1)

0 commit comments

Comments
 (0)