You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by kg...@apache.org on 2025/12/19 16:24:16 UTC
(superset) 03/08: Fix mixed timeseries second query
This is an automated email from the ASF dual-hosted git repository.
kgabryje pushed a commit to branch what-if
in repository https://gitbox.apache.org/repos/asf/superset.git
commit 5881b604922e5aaadb592ced535ea383b28d83c9
Author: Kamil Gabryjelski <ka...@gmail.com>
AuthorDate: Fri Dec 19 12:45:07 2025 +0100
Fix mixed timeseries second query
---
.../util/charts/getFormDataWithExtraFilters.ts | 41 ++++---
superset-frontend/src/dashboard/util/whatIf.ts | 129 ++++++++++++++-------
2 files changed, 114 insertions(+), 56 deletions(-)
diff --git a/superset-frontend/src/dashboard/util/charts/getFormDataWithExtraFilters.ts b/superset-frontend/src/dashboard/util/charts/getFormDataWithExtraFilters.ts
index c8490632b9..1e66fe9fbe 100644
--- a/superset-frontend/src/dashboard/util/charts/getFormDataWithExtraFilters.ts
+++ b/superset-frontend/src/dashboard/util/charts/getFormDataWithExtraFilters.ts
@@ -137,19 +137,10 @@ function extractColumnNames(columns: unknown[]): string[] {
return columnNames;
}
-function buildExistingColumnsSet(chart: ChartQueryPayload): Set<string> {
- const existingColumns = new Set<string>();
- const chartType = chart.form_data?.viz_type;
-
- const existingGroupBy = ensureIsArray(chart.form_data?.groupby);
- existingGroupBy.forEach((col: string) => existingColumns.add(col));
-
- const xAxisColumn = chart.form_data?.x_axis;
- if (xAxisColumn && chartType !== 'heatmap' && chartType !== 'heatmap_v2') {
- existingColumns.add(xAxisColumn);
- }
-
- const metrics = chart.form_data?.metrics || [];
+function extractColumnsFromMetrics(
+ metrics: any[],
+ existingColumns: Set<string>,
+): void {
metrics.forEach((metric: any) => {
if (typeof metric === 'string') {
existingColumns.add(metric);
@@ -166,6 +157,30 @@ function buildExistingColumnsSet(chart: ChartQueryPayload): Set<string> {
}
}
});
+}
+
+function buildExistingColumnsSet(chart: ChartQueryPayload): Set<string> {
+ const existingColumns = new Set<string>();
+ const chartType = chart.form_data?.viz_type;
+
+ const existingGroupBy = ensureIsArray(chart.form_data?.groupby);
+ existingGroupBy.forEach((col: string) => existingColumns.add(col));
+
+ // Handle groupby_b for multi-query charts (e.g., Mixed Timeseries)
+ const existingGroupByB = ensureIsArray(chart.form_data?.groupby_b);
+ existingGroupByB.forEach((col: string) => existingColumns.add(col));
+
+ const xAxisColumn = chart.form_data?.x_axis;
+ if (xAxisColumn && chartType !== 'heatmap' && chartType !== 'heatmap_v2') {
+ existingColumns.add(xAxisColumn);
+ }
+
+ const metrics = chart.form_data?.metrics || [];
+ extractColumnsFromMetrics(metrics, existingColumns);
+
+ // Handle metrics_b for multi-query charts (e.g., Mixed Timeseries)
+ const metricsB = chart.form_data?.metrics_b || [];
+ extractColumnsFromMetrics(metricsB, existingColumns);
// Handle metric (singular) - used by pie charts and other single-metric charts
const singleMetric = chart.form_data?.metric;
diff --git a/superset-frontend/src/dashboard/util/whatIf.ts b/superset-frontend/src/dashboard/util/whatIf.ts
index 9d7d6f11b6..884820e5d1 100644
--- a/superset-frontend/src/dashboard/util/whatIf.ts
+++ b/superset-frontend/src/dashboard/util/whatIf.ts
@@ -81,19 +81,27 @@ export function collectSqlExpressionsFromSlice(slice: Slice): string[] {
}
};
+ // Helper to extract SQL expressions from metrics array
+ const addMetricSqlExpressions = (metrics: unknown[]) => {
+ metrics.forEach((metric: unknown) => {
+ if (
+ metric &&
+ typeof metric === 'object' &&
+ 'expressionType' in metric &&
+ (metric as { expressionType: unknown }).expressionType === 'SQL' &&
+ 'sqlExpression' in metric &&
+ typeof (metric as { sqlExpression: unknown }).sqlExpression === 'string'
+ ) {
+ expressions.push((metric as { sqlExpression: string }).sqlExpression);
+ }
+ });
+ };
+
// Extract SQL expressions from metrics
- ensureIsArray(formData.metrics).forEach((metric: unknown) => {
- if (
- metric &&
- typeof metric === 'object' &&
- 'expressionType' in metric &&
- (metric as { expressionType: unknown }).expressionType === 'SQL' &&
- 'sqlExpression' in metric &&
- typeof (metric as { sqlExpression: unknown }).sqlExpression === 'string'
- ) {
- expressions.push((metric as { sqlExpression: string }).sqlExpression);
- }
- });
+ addMetricSqlExpressions(ensureIsArray(formData.metrics));
+
+ // Handle metrics_b for multi-query charts (e.g., Mixed Timeseries)
+ addMetricSqlExpressions(ensureIsArray(formData.metrics_b));
// Extract SQL expression from singular metric
if (
@@ -110,24 +118,35 @@ export function collectSqlExpressionsFromSlice(slice: Slice): string[] {
);
}
+ // Helper to extract SQL expressions from filters array
+ const addFilterSqlExpressions = (filters: unknown[]) => {
+ filters.forEach((filter: unknown) => {
+ if (
+ filter &&
+ typeof filter === 'object' &&
+ 'expressionType' in filter &&
+ (filter as { expressionType: unknown }).expressionType === 'SQL' &&
+ 'sqlExpression' in filter &&
+ typeof (filter as { sqlExpression: unknown }).sqlExpression === 'string'
+ ) {
+ expressions.push((filter as { sqlExpression: string }).sqlExpression);
+ }
+ });
+ };
+
// Extract SQL expressions from filters
- ensureIsArray(formData.adhoc_filters).forEach((filter: unknown) => {
- if (
- filter &&
- typeof filter === 'object' &&
- 'expressionType' in filter &&
- (filter as { expressionType: unknown }).expressionType === 'SQL' &&
- 'sqlExpression' in filter &&
- typeof (filter as { sqlExpression: unknown }).sqlExpression === 'string'
- ) {
- expressions.push((filter as { sqlExpression: string }).sqlExpression);
- }
- });
+ addFilterSqlExpressions(ensureIsArray(formData.adhoc_filters));
+
+ // Handle adhoc_filters_b for multi-query charts (e.g., Mixed Timeseries)
+ addFilterSqlExpressions(ensureIsArray(formData.adhoc_filters_b));
// Extract SQL expressions from adhoc columns in groupby, x_axis, series, columns, entity
ensureIsArray(formData.groupby).forEach(addAdhocColumnExpression);
ensureIsArray(formData.columns).forEach(addAdhocColumnExpression);
+ // Handle groupby_b for multi-query charts (e.g., Mixed Timeseries)
+ ensureIsArray(formData.groupby_b).forEach(addAdhocColumnExpression);
+
if (formData.x_axis) {
addAdhocColumnExpression(formData.x_axis);
}
@@ -192,29 +211,54 @@ export function extractColumnsFromSlice(slice: Slice): Set<string> {
}
};
+ // Helper to extract columns from metrics array
+ const addMetricColumns = (metrics: unknown[]) => {
+ metrics.forEach((metric: unknown) => {
+ if (typeof metric === 'string') {
+ // Saved metric name - we can't extract columns from it
+ return;
+ }
+ if (metric && typeof metric === 'object' && 'column' in metric) {
+ const metricColumn = (metric as FormDataMetric).column;
+ if (typeof metricColumn === 'string') {
+ columns.add(metricColumn);
+ } else if (
+ metricColumn &&
+ typeof metricColumn === 'object' &&
+ 'column_name' in metricColumn
+ ) {
+ columns.add(metricColumn.column_name);
+ }
+ }
+ });
+ };
+
+ // Helper to extract columns from filters array
+ const addFilterColumns = (filters: unknown[]) => {
+ filters.forEach((filter: unknown) => {
+ const f = filter as FormDataFilter;
+ if (f?.subject && typeof f.subject === 'string') {
+ columns.add(f.subject);
+ }
+ });
+ };
+
// Extract groupby columns (can be physical or adhoc)
ensureIsArray(formData.groupby).forEach(addColumn);
+ // Handle groupby_b for multi-query charts (e.g., Mixed Timeseries)
+ ensureIsArray(formData.groupby_b).forEach(addColumn);
+
// Extract x_axis column (can be physical or adhoc)
if (formData.x_axis) {
addColumn(formData.x_axis);
}
// Extract metrics - get column names from metric definitions
- ensureIsArray(formData.metrics).forEach((metric: string | FormDataMetric) => {
- if (typeof metric === 'string') {
- // Saved metric name - we can't extract columns from it
- return;
- }
- if (metric && typeof metric === 'object' && 'column' in metric) {
- const metricColumn = metric.column;
- if (typeof metricColumn === 'string') {
- columns.add(metricColumn);
- } else if (metricColumn && typeof metricColumn === 'object' && 'column_name' in metricColumn) {
- columns.add(metricColumn.column_name);
- }
- }
- });
+ addMetricColumns(ensureIsArray(formData.metrics));
+
+ // Handle metrics_b for multi-query charts (e.g., Mixed Timeseries)
+ addMetricColumns(ensureIsArray(formData.metrics_b));
// Extract metric (singular) - used by pie charts and other single-metric charts
if (formData.metric && typeof formData.metric === 'object') {
@@ -240,11 +284,10 @@ export function extractColumnsFromSlice(slice: Slice): Set<string> {
}
// Extract columns from filters
- ensureIsArray(formData.adhoc_filters).forEach((filter: FormDataFilter) => {
- if (filter?.subject && typeof filter.subject === 'string') {
- columns.add(filter.subject);
- }
- });
+ addFilterColumns(ensureIsArray(formData.adhoc_filters));
+
+ // Handle adhoc_filters_b for multi-query charts (e.g., Mixed Timeseries)
+ addFilterColumns(ensureIsArray(formData.adhoc_filters_b));
// Extract columns array (used by some chart types like box_plot)
ensureIsArray(formData.columns).forEach(addColumn);