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
This commit is contained in:
parent
0c38134e5c
commit
ede879022c
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
multiline_fd = self.form_data
|
||||
# Late import to avoid circular import issues
|
||||
from superset.charts.dao import ChartDAO
|
||||
|
||||
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],
|
||||
}
|
||||
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):
|
||||
|
|
|
|||
Loading…
Reference in New Issue