This is an automated email from the ASF dual-hosted git repository. eschutho pushed a commit to branch fix/backport-query-object-factory-deprecated-fields in repository https://gitbox.apache.org/repos/asf/superset.git
commit 6ee8fd1d3bfc60104389000c19870277d280e99d Author: Elizabeth Thompson <[email protected]> AuthorDate: Sat Jul 25 18:06:45 2026 +0000 fix(query_object_factory): preserve truthy-override precedence for deprecated fields setdefault() let an already-present canonical field win over a truthy deprecated value, reversing QueryObject._rename_deprecated_fields's historical precedence (deprecated value always overrides when truthy). That's what test_time_offsets_accuracy and test_time_offsets_in_query_object_no_limit were catching in CI. Per richardfogaca's review. --- superset/common/query_object_factory.py | 4 +++- tests/unit_tests/common/test_query_object_factory.py | 7 ++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/superset/common/query_object_factory.py b/superset/common/query_object_factory.py index ffd282b210b..e8f5ca544a0 100644 --- a/superset/common/query_object_factory.py +++ b/superset/common/query_object_factory.py @@ -68,9 +68,11 @@ class QueryObjectFactory: # pylint: disable=too-few-public-methods # Rename deprecated kwargs before any processing so that downstream code # (time-range resolution, QueryObject) only ever sees the canonical names. + # A truthy deprecated value always overrides the canonical field, matching + # the historical QueryObject._rename_deprecated_fields precedence. for field in DEPRECATED_FIELDS: if old_val := kwargs.pop(field.old_name, None): - kwargs.setdefault(field.new_name, old_val) + kwargs[field.new_name] = old_val # Process row limit taking server pagination into account row_limit = self._process_row_limit( diff --git a/tests/unit_tests/common/test_query_object_factory.py b/tests/unit_tests/common/test_query_object_factory.py index 9202f1f722f..52ca86ef52d 100644 --- a/tests/unit_tests/common/test_query_object_factory.py +++ b/tests/unit_tests/common/test_query_object_factory.py @@ -154,19 +154,20 @@ class TestQueryObjectFactory: assert query_object.columns == ["name", "gender"] assert not hasattr(query_object, "groupby") - def test_deprecated_groupby_does_not_overwrite_columns( + def test_deprecated_groupby_overwrites_columns( self, query_object_factory: QueryObjectFactory, raw_query_context: dict[str, Any], ): - """When both groupby and columns are present, columns takes precedence.""" + """A truthy deprecated groupby overrides an already-present columns, + matching the historical QueryObject._rename_deprecated_fields precedence.""" raw_query_object = raw_query_context["queries"][0] raw_query_object["columns"] = ["state"] raw_query_object["groupby"] = ["name", "gender"] query_object = query_object_factory.create( raw_query_context["result_type"], **raw_query_object ) - assert query_object.columns == ["state"] + assert query_object.columns == ["name", "gender"] def test_deprecated_groupby_empty_list_is_ignored( self,
