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 <[email protected]> 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);
