This is an automated email from the ASF dual-hosted git repository. arivero pushed a commit to branch table-time-comparison in repository https://gitbox.apache.org/repos/asf/superset.git
commit aa74402839407ac8fe07320245b66528de66b8ef Author: Antonio Rivero <[email protected]> AuthorDate: Fri Mar 1 16:56:08 2024 +0100 Table with Time Comparison: - Stop using the new instant_time_comparison_info as a direct propery of queryObject. Put it in the extras --- .../superset-ui-core/src/query/types/Query.ts | 4 +--- .../plugins/plugin-chart-table/src/buildQuery.ts | 4 ++-- superset/charts/schemas.py | 19 +++++++++++-------- superset/common/query_object.py | 4 ---- superset/connectors/sqla/models.py | 11 +++++++---- tests/unit_tests/connectors/test_models.py | 15 +++++++++------ tests/unit_tests/queries/query_object_test.py | 1 - 7 files changed, 30 insertions(+), 28 deletions(-) diff --git a/superset-frontend/packages/superset-ui-core/src/query/types/Query.ts b/superset-frontend/packages/superset-ui-core/src/query/types/Query.ts index db3a090dd6..83b90253eb 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/types/Query.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/types/Query.ts @@ -71,6 +71,7 @@ export type QueryObjectExtras = Partial<{ where?: string; /** Instant Time Comparison */ instant_time_comparison_range?: string; + instant_time_comparison_info?: QueryObjectInstantTimeComparisonInfo; }>; export type ResidualQueryObjectData = { @@ -156,9 +157,6 @@ export interface QueryObject series_columns?: QueryFormColumn[]; series_limit?: number; series_limit_metric?: Maybe<QueryFormMetric>; - - /** Instant Time Comparison */ - instant_time_comparison_info?: QueryObjectInstantTimeComparisonInfo; } export interface QueryContext { diff --git a/superset-frontend/plugins/plugin-chart-table/src/buildQuery.ts b/superset-frontend/plugins/plugin-chart-table/src/buildQuery.ts index 9e93c268a4..f892d2fe94 100644 --- a/superset-frontend/plugins/plugin-chart-table/src/buildQuery.ts +++ b/superset-frontend/plugins/plugin-chart-table/src/buildQuery.ts @@ -183,8 +183,8 @@ const buildQuery: BuildQuery<TableChartFormData> = ( // Customize the query for time comparison if (canUseTimeComparison) { - queryObject = { - ...queryObject, + queryObject.extras = { + ...queryObject.extras, instant_time_comparison_info: { range: timeComparison, filter: diff --git a/superset/charts/schemas.py b/superset/charts/schemas.py index 34731af571..b5563a3446 100644 --- a/superset/charts/schemas.py +++ b/superset/charts/schemas.py @@ -1008,6 +1008,17 @@ class ChartDataExtrasSchema(Schema): }, allow_none=True, ) + instant_time_comparison_info = fields.Nested( + # TODO: The instant_time_comparison_range must be deleted in favor of this one + # once we have the DATEDIFF in place. Keeping for backward compatibility in the + # meantime. + InstantTimeComparisonInfoSchema, + metadata={ + "description": "Extra parameters to use instant time comparison" + " with JOINs using a single query" + }, + allow_none=True, + ) class AnnotationLayerSchema(Schema): @@ -1360,14 +1371,6 @@ class ChartDataQueryObjectSchema(Schema): fields.String(), allow_none=True, ) - instant_time_comparison_info = fields.Nested( - InstantTimeComparisonInfoSchema, - metadata={ - "description": "Extra parameters to use instant time comparison" - " with JOINs using a single query" - }, - allow_none=True, - ) class ChartDataQueryContextSchema(Schema): diff --git a/superset/common/query_object.py b/superset/common/query_object.py index 77f3a08ce8..5109c465e0 100644 --- a/superset/common/query_object.py +++ b/superset/common/query_object.py @@ -107,7 +107,6 @@ class QueryObject: # pylint: disable=too-many-instance-attributes time_shift: str | None time_range: str | None to_dttm: datetime | None - instant_time_comparison_info: dict[str, Any] | None def __init__( # pylint: disable=too-many-locals self, @@ -133,7 +132,6 @@ class QueryObject: # pylint: disable=too-many-instance-attributes series_limit_metric: Metric | None = None, time_range: str | None = None, time_shift: str | None = None, - instant_time_comparison_info: dict[str, Any] | None = None, **kwargs: Any, ): self._set_annotation_layers(annotation_layers) @@ -163,7 +161,6 @@ class QueryObject: # pylint: disable=too-many-instance-attributes self.time_offsets = kwargs.get("time_offsets", []) self.inner_from_dttm = kwargs.get("inner_from_dttm") self.inner_to_dttm = kwargs.get("inner_to_dttm") - self.instant_time_comparison_info = instant_time_comparison_info self._rename_deprecated_fields(kwargs) self._move_deprecated_extra_fields(kwargs) @@ -338,7 +335,6 @@ class QueryObject: # pylint: disable=too-many-instance-attributes "series_limit_metric": self.series_limit_metric, "to_dttm": self.to_dttm, "time_shift": self.time_shift, - "instant_time_comparison_info": self.instant_time_comparison_info, } return query_object_dict diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index b6e14ce62e..6259628d5b 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -1515,14 +1515,17 @@ class SqlaTable( mutate: bool = True, ) -> QueryStringExtended: # So we don't mutate the original query_obj - query_obj_clone = copy.copy(query_obj) - instant_time_comparison_info = query_obj.get("instant_time_comparison_info") - query_obj_clone.pop("instant_time_comparison_info", None) - sqlaq = self.get_sqla_query(**query_obj_clone) + sqlaq = self.get_sqla_query(**query_obj) sql = self.database.compile_sqla_query(sqlaq.sqla_query) sql = self._apply_cte(sql, sqlaq.cte) sql = sqlparse.format(sql, reindent=True) + query_obj_clone = copy.copy(query_obj) + query_object_extras: dict[str, Any] = query_obj.get("extras", {}) + instant_time_comparison_info = query_object_extras.get( + "instant_time_comparison_info", {} + ) + if mutate: sql = self.mutate_query_from_config(sql) diff --git a/tests/unit_tests/connectors/test_models.py b/tests/unit_tests/connectors/test_models.py index cf179c9dfa..1a176f4860 100644 --- a/tests/unit_tests/connectors/test_models.py +++ b/tests/unit_tests/connectors/test_models.py @@ -73,7 +73,13 @@ class TestInstantTimeComparisonQueryGeneration: return { "apply_fetch_values_predicate": False, "columns": ["name"], - "extras": {"having": "", "where": ""}, + "extras": { + "having": "", + "where": "", + "instant_time_comparison_info": { + "range": "y", + }, + }, "filter": [ {"op": "TEMPORAL_RANGE", "val": "1984-01-01 : 2024-02-14", "col": "ds"} ], @@ -132,9 +138,6 @@ class TestInstantTimeComparisonQueryGeneration: "sqlExpression": None, }, ], - "instant_time_comparison_info": { - "range": "y", - }, } @with_feature_flags(CHART_PLUGINS_EXPERIMENTAL=True) @@ -256,7 +259,7 @@ class TestInstantTimeComparisonQueryGeneration: def test_creates_query_without_time_comparison(session: Session): table = TestInstantTimeComparisonQueryGeneration.base_setup(session) query_obj = TestInstantTimeComparisonQueryGeneration.generate_base_query_obj() - query_obj["instant_time_comparison_info"] = None + query_obj["extras"]["instant_time_comparison_info"] = None str = table.get_query_str_extended(query_obj) expected_str = """ SELECT name AS name, @@ -279,7 +282,7 @@ class TestInstantTimeComparisonQueryGeneration: def test_creates_time_comparison_query_custom_filters(session: Session): table = TestInstantTimeComparisonQueryGeneration.base_setup(session) query_obj = TestInstantTimeComparisonQueryGeneration.generate_base_query_obj() - query_obj["instant_time_comparison_info"] = { + query_obj["extras"]["instant_time_comparison_info"] = { "range": "c", "filter": { "op": "TEMPORAL_RANGE", diff --git a/tests/unit_tests/queries/query_object_test.py b/tests/unit_tests/queries/query_object_test.py index f90ab8255d..81a654653f 100644 --- a/tests/unit_tests/queries/query_object_test.py +++ b/tests/unit_tests/queries/query_object_test.py @@ -47,7 +47,6 @@ def test_default_query_object_to_dict(): "granularity": None, "inner_from_dttm": None, "inner_to_dttm": None, - "instant_time_comparison_info": None, "is_rowcount": False, "is_timeseries": False, "metrics": None,
