diff --git a/superset/viz.py b/superset/viz.py index 250295350e52..004a8b90a0df 100644 --- a/superset/viz.py +++ b/superset/viz.py @@ -865,6 +865,13 @@ def query_obj(self) -> QueryObjectDict: raise QueryObjectValidationError(_("Please choose at least one metric")) if set(groupby) & set(columns): raise QueryObjectValidationError(_("Group By' and 'Columns' can't overlap")) + sort_by = self.form_data.get("timeseries_limit_metric") + if sort_by: + sort_by_label = utils.get_metric_name(sort_by) + if sort_by_label not in d["metrics"]: + d["metrics"].append(sort_by) + if self.form_data.get("order_desc"): + d["orderby"] = [(sort_by, not self.form_data.get("order_desc", True))] return d @staticmethod @@ -963,6 +970,18 @@ class TreemapViz(BaseViz): credits = 'd3.js' is_timeseries = False + def query_obj(self) -> QueryObjectDict: + d = super().query_obj() + metrics = self.form_data.get("metrics") + sort_by = self.form_data.get("timeseries_limit_metric") + if sort_by: + sort_by_label = utils.get_metric_name(sort_by) + if sort_by_label not in d["metrics"]: + d["metrics"].append(sort_by) + if self.form_data.get("order_desc"): + d["orderby"] = [(sort_by, not self.form_data.get("order_desc", True))] + return d + def _nest(self, metric: str, df: pd.DataFrame) -> List[Dict[str, Any]]: nlevels = df.index.nlevels if nlevels == 1: @@ -1621,6 +1640,18 @@ class NVD3TimeSeriesStackedViz(NVD3TimeSeriesViz): sort_series = True pivot_fill_value = 0 + def query_obj(self) -> QueryObjectDict: + d = super().query_obj() + metrics = self.form_data.get("metrics") + sort_by = self.form_data.get("timeseries_limit_metric") + if sort_by: + sort_by_label = utils.get_metric_name(sort_by) + if sort_by_label not in d["metrics"]: + d["metrics"].append(sort_by) + if self.form_data.get("order_desc"): + d["orderby"] = [(sort_by, not self.form_data.get("order_desc", True))] + return d + class HistogramViz(BaseViz): @@ -2080,6 +2111,13 @@ def query_obj(self) -> QueryObjectDict: d = super().query_obj() fd = self.form_data d["groupby"] = [fd.get("series")] + sort_by = self.form_data.get("timeseries_limit_metric") + if sort_by: + sort_by_label = utils.get_metric_name(sort_by) + if sort_by_label not in d["metrics"]: + d["metrics"].append(sort_by) + if self.form_data.get("order_desc"): + d["orderby"] = [(sort_by, not self.form_data.get("order_desc", True))] return d def get_data(self, df: pd.DataFrame) -> VizData: @@ -2153,6 +2191,18 @@ class HorizonViz(NVD3TimeSeriesViz): "d3-horizon-chart" ) + def query_obj(self) -> QueryObjectDict: + d = super().query_obj() + metrics = self.form_data.get("metrics") + sort_by = self.form_data.get("timeseries_limit_metric") + if sort_by: + sort_by_label = utils.get_metric_name(sort_by) + if sort_by_label not in d["metrics"]: + d["metrics"].append(sort_by) + if self.form_data.get("order_desc"): + d["orderby"] = [(sort_by, not self.form_data.get("order_desc", True))] + return d + class MapboxViz(BaseViz): @@ -2769,6 +2819,18 @@ class PairedTTestViz(BaseViz): sort_series = False is_timeseries = True + def query_obj(self) -> QueryObjectDict: + d = super().query_obj() + metrics = self.form_data.get("metrics") + sort_by = self.form_data.get("timeseries_limit_metric") + if sort_by: + sort_by_label = utils.get_metric_name(sort_by) + if sort_by_label not in d["metrics"]: + d["metrics"].append(sort_by) + if self.form_data.get("order_desc"): + d["orderby"] = [(sort_by, not self.form_data.get("order_desc", True))] + return d + def get_data(self, df: pd.DataFrame) -> VizData: """ Transform received data frame into an object of the form: @@ -2824,6 +2886,18 @@ class RoseViz(NVD3TimeSeriesViz): sort_series = False is_timeseries = True + def query_obj(self) -> QueryObjectDict: + d = super().query_obj() + metrics = self.form_data.get("metrics") + sort_by = self.form_data.get("timeseries_limit_metric") + if sort_by: + sort_by_label = utils.get_metric_name(sort_by) + if sort_by_label not in d["metrics"]: + d["metrics"].append(sort_by) + if self.form_data.get("order_desc"): + d["orderby"] = [(sort_by, not self.form_data.get("order_desc", True))] + return d + def get_data(self, df: pd.DataFrame) -> VizData: if df.empty: return None @@ -2862,6 +2936,14 @@ def query_obj(self) -> QueryObjectDict: time_op = self.form_data.get("time_series_option", "not_time") # Return time series data if the user specifies so query_obj["is_timeseries"] = time_op != "not_time" + sort_by = self.form_data.get("timeseries_limit_metric") + if sort_by: + sort_by_label = utils.get_metric_name(sort_by) + if sort_by_label not in query_obj["metrics"]: + query_obj["metrics"].append(sort_by) + query_obj["orderby"] = [ + (sort_by, not self.form_data.get("order_desc", True)) + ] return query_obj def levels_for(