mirror of
https://github.com/django/django.git
synced 2025-08-22 11:34:33 +00:00
Refs #28333 -- Added partial support for filtering against window functions.
Adds support for joint predicates against window annotations through subquery wrapping while maintaining errors for disjointed filter attempts. The "qualify" wording was used to refer to predicates against window annotations as it's the name of a specialized Snowflake extension to SQL that is to window functions what HAVING is to aggregates. While not complete the implementation should cover most of the common use cases for filtering against window functions without requiring the complex subquery pushdown and predicate re-aliasing machinery to deal with disjointed predicates against columns, aggregates, and window functions. A complete disjointed filtering implementation should likely be deferred until proper QUALIFY support lands or the ORM gains a proper subquery pushdown interface.
This commit is contained in:
parent
f3f9d03edf
commit
f387d024fc
9 changed files with 489 additions and 67 deletions
|
@ -836,6 +836,7 @@ class ResolvedOuterRef(F):
|
|||
"""
|
||||
|
||||
contains_aggregate = False
|
||||
contains_over_clause = False
|
||||
|
||||
def as_sql(self, *args, **kwargs):
|
||||
raise ValueError(
|
||||
|
@ -1210,6 +1211,12 @@ class OrderByList(Func):
|
|||
return "", ()
|
||||
return super().as_sql(*args, **kwargs)
|
||||
|
||||
def get_group_by_cols(self):
|
||||
group_by_cols = []
|
||||
for order_by in self.get_source_expressions():
|
||||
group_by_cols.extend(order_by.get_group_by_cols())
|
||||
return group_by_cols
|
||||
|
||||
|
||||
@deconstructible(path="django.db.models.ExpressionWrapper")
|
||||
class ExpressionWrapper(SQLiteNumericMixin, Expression):
|
||||
|
@ -1631,7 +1638,6 @@ class Window(SQLiteNumericMixin, Expression):
|
|||
# be introduced in the query as a result is not desired.
|
||||
contains_aggregate = False
|
||||
contains_over_clause = True
|
||||
filterable = False
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
|
@ -1733,7 +1739,12 @@ class Window(SQLiteNumericMixin, Expression):
|
|||
return "<%s: %s>" % (self.__class__.__name__, self)
|
||||
|
||||
def get_group_by_cols(self, alias=None):
|
||||
return []
|
||||
group_by_cols = []
|
||||
if self.partition_by:
|
||||
group_by_cols.extend(self.partition_by.get_group_by_cols())
|
||||
if self.order_by is not None:
|
||||
group_by_cols.extend(self.order_by.get_group_by_cols())
|
||||
return group_by_cols
|
||||
|
||||
|
||||
class WindowFrame(Expression):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue