From c7b160bee2bd785dfdfd69e805bc019a4f276ce7 Mon Sep 17 00:00:00 2001 From: Kaan Date: Tue, 18 Mar 2025 23:26:32 +0000 Subject: [PATCH] refactored frame spec clause validation and assignment --- lib/sqlalchemy/sql/elements.py | 48 ++++++++++++---------------------- 1 file changed, 17 insertions(+), 31 deletions(-) diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py index 4d229dbb4a..9d8b00b854 100644 --- a/lib/sqlalchemy/sql/elements.py +++ b/lib/sqlalchemy/sql/elements.py @@ -4246,37 +4246,23 @@ class Over(ColumnElement[_T]): _literal_as_text_role=roles.ByOfRole, ) - self.range_, self.rows, self.groups = None, None, None - if range_: - self.range_ = _FrameClause(range_) - if rows: - raise exc.ArgumentError( - "'range_' and 'rows' are mutually exclusive" - ) - if groups: - raise exc.ArgumentError( - "'range_' and 'groups' are mutually exclusive" - ) - if rows: - self.rows = _FrameClause(rows) - if range_: - raise exc.ArgumentError( - "'rows' and 'range_' are mutually exclusive" - ) - if groups: - raise exc.ArgumentError( - "'rows' and 'groups' are mutually exclusive" - ) - if groups: - self.groups = _FrameClause(groups) - if range_: - raise exc.ArgumentError( - "'groups' and 'range_' are mutually exclusive" - ) - if rows: - raise exc.ArgumentError( - "'groups' and 'rows' are mutually exclusive" - ) + # validate frame spec and assign clause + _frame_spec_map = {"range_": range_, "rows": rows, "groups": groups} + if sum([v is not None for v in _frame_spec_map.values()]) > 1: + _clauses = [ + f"'{k}'" + for i, k in enumerate(_frame_spec_map.keys()) + if list(_frame_spec_map.values())[i] + ] + _clauses_str = ' and '.join(_clauses) + raise exc.ArgumentError( + f"too many frame spec clauses provided: {_clauses_str}" + ) + else: + self.range_, self.rows, self.groups = [ + (_FrameClause(v) if v else None) + for v in _frame_spec_map.values() + ] if not TYPE_CHECKING: -- 2.47.3