This is an automated email from the ASF dual-hosted git repository. villebro pushed a commit to branch 1.0 in repository https://gitbox.apache.org/repos/asf/superset.git
commit 0686a1c347d65f23515233e692a4bb0c13630f87 Author: Ville Brofeldt <[email protected]> AuthorDate: Sat Jan 23 09:01:50 2021 +0200 fix(multiline): return all chart data on initial request (#12660) * fix(multiline): return chart data on data request * bump package * optimize chart retrieval and fix chart form_data --- superset-frontend/package-lock.json | 6 ++-- superset-frontend/package.json | 2 +- superset/viz.py | 71 +++++++++++++++++++++++++++++-------- 3 files changed, 61 insertions(+), 18 deletions(-) diff --git a/superset-frontend/package-lock.json b/superset-frontend/package-lock.json index 2bd8b2b..779c3ac 100644 --- a/superset-frontend/package-lock.json +++ b/superset-frontend/package-lock.json @@ -19011,9 +19011,9 @@ } }, "@superset-ui/legacy-preset-chart-nvd3": { - "version": "0.16.9", - "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.16.9.tgz", - "integrity": "sha512-wfbVZOGqIk/IFUnzW0k44t9N/iHd0VoJzHT6wwM+GgGcCm5mizBDWot9Zuu4U1gf1KLfKUD7/lwEEtyCrs2zXw==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@superset-ui/legacy-preset-chart-nvd3/-/legacy-preset-chart-nvd3-0.16.10.tgz", + "integrity": "sha512-zQPybEGYfthiUpwSOV4E1YUWnSqWY6S4nGXR8rVh2FIUFzyYyr4f5ZzOr6DKmytPlQbL1oXg0m35A8boshOh0g==", "requires": { "@data-ui/xy-chart": "^0.0.84", "@superset-ui/chart-controls": "0.16.9", diff --git a/superset-frontend/package.json b/superset-frontend/package.json index c13d59d..16b83d0 100644 --- a/superset-frontend/package.json +++ b/superset-frontend/package.json @@ -88,7 +88,7 @@ "@superset-ui/legacy-plugin-chart-world-map": "^0.16.9", "@superset-ui/legacy-preset-chart-big-number": "^0.16.9", "@superset-ui/legacy-preset-chart-deckgl": "^0.4.1", - "@superset-ui/legacy-preset-chart-nvd3": "^0.16.9", + "@superset-ui/legacy-preset-chart-nvd3": "^0.16.10", "@superset-ui/plugin-chart-echarts": "^0.16.9", "@superset-ui/plugin-chart-table": "^0.16.9", "@superset-ui/plugin-chart-word-cloud": "^0.16.9", diff --git a/superset/viz.py b/superset/viz.py index 21fbdf8..d8d799d 100644 --- a/superset/viz.py +++ b/superset/viz.py @@ -1405,21 +1405,64 @@ class MultiLineViz(NVD3Viz): return {} def get_data(self, df: pd.DataFrame) -> VizData: - fd = self.form_data - # Late imports to avoid circular import issues - from superset import db - from superset.models.slice import Slice - - slice_ids1 = fd.get("line_charts") - slices1 = db.session.query(Slice).filter(Slice.id.in_(slice_ids1)).all() - slice_ids2 = fd.get("line_charts_2") - slices2 = db.session.query(Slice).filter(Slice.id.in_(slice_ids2)).all() - return { - "slices": { - "axis1": [slc.data for slc in slices1], - "axis2": [slc.data for slc in slices2], - } + multiline_fd = self.form_data + # Late import to avoid circular import issues + from superset.charts.dao import ChartDAO + + axis1_chart_ids = multiline_fd.get("line_charts", []) + axis2_chart_ids = multiline_fd.get("line_charts_2", []) + all_charts = { + chart.id: chart + for chart in ChartDAO.find_by_ids(axis1_chart_ids + axis2_chart_ids) } + axis1_charts = [all_charts[chart_id] for chart_id in axis1_chart_ids] + axis2_charts = [all_charts[chart_id] for chart_id in axis2_chart_ids] + + filters = multiline_fd.get("filters", []) + add_prefix = multiline_fd.get("prefix_metric_with_slice_name", False) + data = [] + min_x, max_x = None, None + + for chart, y_axis in [(chart, 1) for chart in axis1_charts] + [ + (chart, 2) for chart in axis2_charts + ]: + prefix = f"{chart.chart}: " if add_prefix else "" + chart_fd = chart.form_data + chart_fd["filters"] = chart_fd.get("filters", []) + filters + if "extra_filters" in multiline_fd: + chart_fd["extra_filters"] = multiline_fd["extra_filters"] + if "time_range" in multiline_fd: + chart_fd["time_range"] = multiline_fd["time_range"] + viz_obj = viz_types[chart.viz_type]( + chart.datasource, + form_data=chart_fd, + force=self.force, + force_cached=self.force_cached, + ) + df = viz_obj.get_df_payload()["df"] + chart_series = viz_obj.get_data(df) or [] + for series in chart_series: + x_values = [value["x"] for value in series["values"]] + min_x = min(x_values + ([min_x] if min_x is not None else [])) + max_x = max(x_values + ([max_x] if max_x is not None else [])) + + data.append( + { + "key": prefix + ", ".join(series["key"]), + "type": "line", + "values": series["values"], + "yAxis": y_axis, + } + ) + bounds = [] + if min_x is not None: + bounds.append({"x": min_x, "y": None}) + if max_x is not None: + bounds.append({"x": max_x, "y": None}) + + for series in data: + series["values"].extend(bounds) + return data class NVD3DualLineViz(NVD3Viz):
