Merge pull request #16688 from phot0n/multiple_order_by
fix: support for multiple order by in add_conditions
This commit is contained in:
commit
085900328b
2 changed files with 24 additions and 9 deletions
|
|
@ -108,11 +108,14 @@ def change_orderby(order: str):
|
|||
tuple: field, order
|
||||
"""
|
||||
order = order.split()
|
||||
if order[1].lower() == "asc":
|
||||
orderby, order = order[0], Order.asc
|
||||
return orderby, order
|
||||
orderby, order = order[0], Order.desc
|
||||
return orderby, order
|
||||
|
||||
try:
|
||||
if order[1].lower() == "asc":
|
||||
return order[0], Order.asc
|
||||
except IndexError:
|
||||
pass
|
||||
|
||||
return order[0], Order.desc
|
||||
|
||||
|
||||
OPERATOR_MAP = {
|
||||
|
|
@ -175,10 +178,13 @@ class Query:
|
|||
"""
|
||||
if kwargs.get("orderby"):
|
||||
orderby = kwargs.get("orderby")
|
||||
order = kwargs.get("order") if kwargs.get("order") else Order.desc
|
||||
if isinstance(orderby, str) and len(orderby.split()) > 1:
|
||||
orderby, order = change_orderby(orderby)
|
||||
conditions = conditions.orderby(orderby, order=order)
|
||||
for ordby in orderby.split(","):
|
||||
if ordby := ordby.strip():
|
||||
orderby, order = change_orderby(ordby)
|
||||
conditions = conditions.orderby(orderby, order=order)
|
||||
else:
|
||||
conditions = conditions.orderby(orderby, order=kwargs.get("order") or Order.desc)
|
||||
|
||||
if kwargs.get("limit"):
|
||||
conditions = conditions.limit(kwargs.get("limit"))
|
||||
|
|
@ -288,7 +294,7 @@ class Query:
|
|||
table: str,
|
||||
fields: Union[List, Tuple],
|
||||
filters: Union[Dict[str, Union[str, int]], str, int] = None,
|
||||
**kwargs
|
||||
**kwargs,
|
||||
):
|
||||
criterion = self.build_conditions(table, filters, **kwargs)
|
||||
if isinstance(fields, (list, tuple)):
|
||||
|
|
|
|||
|
|
@ -87,6 +87,15 @@ class TestDB(unittest.TestCase):
|
|||
frappe.db.get_values("User", filters=[["name", "=", "Administrator"]], fieldname="email"),
|
||||
)
|
||||
|
||||
# test multiple orderby's
|
||||
delimiter = '"' if frappe.db.db_type == "postgres" else "`"
|
||||
self.assertIn(
|
||||
"ORDER BY {deli}creation{deli} DESC,{deli}modified{deli} ASC,{deli}name{deli} DESC".format(
|
||||
deli=delimiter
|
||||
),
|
||||
frappe.db.get_value("DocType", "DocField", order_by="creation desc, modified asc, name", run=0),
|
||||
)
|
||||
|
||||
def test_get_value_limits(self):
|
||||
|
||||
# check both dict and list style filters
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue