summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2023-12-29 01:28:19 -0500
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-12-29 09:07:27 +0100
commit90d365d869924d503565eb1ccdc24077d60faf0c (patch)
tree9f9454f9e31b7a4e1e7397bec7ecaae20e997770
parentbb560651c489879c22878cba5003a09b6a9f930a (diff)
Refs #35064 -- Made OrderableAggMixin avoid creating empty OrderByList.
This paves the way for making OrderByList a simple shim over ExpressionList which requires at least a single item to be provided.
-rw-r--r--django/contrib/postgres/aggregates/mixins.py14
1 files changed, 10 insertions, 4 deletions
diff --git a/django/contrib/postgres/aggregates/mixins.py b/django/contrib/postgres/aggregates/mixins.py
index 340a917879..68f24a5ce3 100644
--- a/django/contrib/postgres/aggregates/mixins.py
+++ b/django/contrib/postgres/aggregates/mixins.py
@@ -3,18 +3,21 @@ from django.db.models.expressions import OrderByList
class OrderableAggMixin:
def __init__(self, *expressions, ordering=(), **extra):
- if isinstance(ordering, (list, tuple)):
+ if not ordering:
+ self.order_by = None
+ elif isinstance(ordering, (list, tuple)):
self.order_by = OrderByList(*ordering)
else:
self.order_by = OrderByList(ordering)
super().__init__(*expressions, **extra)
def resolve_expression(self, *args, **kwargs):
- self.order_by = self.order_by.resolve_expression(*args, **kwargs)
+ if self.order_by is not None:
+ self.order_by = self.order_by.resolve_expression(*args, **kwargs)
return super().resolve_expression(*args, **kwargs)
def get_source_expressions(self):
- if self.order_by.source_expressions:
+ if self.order_by is not None:
return super().get_source_expressions() + [self.order_by]
return super().get_source_expressions()
@@ -24,6 +27,9 @@ class OrderableAggMixin:
return super().set_source_expressions(exprs)
def as_sql(self, compiler, connection):
- order_by_sql, order_by_params = compiler.compile(self.order_by)
+ if self.order_by is not None:
+ order_by_sql, order_by_params = compiler.compile(self.order_by)
+ else:
+ order_by_sql, order_by_params = "", ()
sql, sql_params = super().as_sql(compiler, connection, ordering=order_by_sql)
return sql, (*sql_params, *order_by_params)