From 73ce2f1ea73ddf902a7c40e2e01bd52e3908dbd0 Mon Sep 17 00:00:00 2001 From: Victor Malai Date: Mon, 22 Feb 2021 07:59:45 +0200 Subject: [PATCH] feat: Add sort by metric for charts with multiple metrics (#13057) * feat: Add sort by metric for pivot-table * feat(legacy-plugin-chart-parallel-coordinates): subject Add sort by metric * feat(legacy-plugin-chart-rose-chart): subject Add sort by metric * feat(legacy-plugin-chart-partition): subject Add sort by metric * feat(legacy-plugin-chart-paired-t-test): subject Add sort by metric * feat(legacy-plugin-chart-treemap): subject Add sort by metric * feat(legacy-plugin-chart-nvd3-area): subject Add sort by metric * Fix lint * feat(plugin-chart-horizon): Add sort by & Add no default sorting if checkbox is not selected --- superset/viz.py | 82 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/superset/viz.py b/superset/viz.py index 9235f6c3a..96e8ba017 100644 --- a/superset/viz.py +++ b/superset/viz.py @@ -844,6 +844,13 @@ class PivotTableViz(BaseViz): 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 @@ -942,6 +949,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: @@ -1600,6 +1619,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): @@ -2067,6 +2098,13 @@ class ParallelCoordinatesViz(BaseViz): 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: @@ -2144,6 +2182,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): @@ -2760,6 +2810,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: @@ -2815,6 +2877,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 @@ -2853,6 +2927,14 @@ class PartitionViz(NVD3TimeSeriesViz): 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(