mirror of
https://github.com/apache/superset.git
synced 2026-05-08 17:35:33 +00:00
fix(ag-grid-table): fix AND filter conditions not applied (#38369)
This commit is contained in:
@@ -482,12 +482,77 @@ const buildQuery: BuildQuery<TableChartFormData> = (
|
||||
};
|
||||
}
|
||||
|
||||
// Add AG Grid complex WHERE clause from ownState (non-metric filters)
|
||||
// Map metric/column labels to SQL expressions for WHERE/HAVING resolution
|
||||
const sqlExpressionMap: Record<string, string> = {};
|
||||
(metrics || []).forEach((m: QueryFormMetric) => {
|
||||
if (typeof m === 'object' && 'expressionType' in m) {
|
||||
const label = getMetricLabel(m);
|
||||
if (m.expressionType === 'SQL' && m.sqlExpression) {
|
||||
sqlExpressionMap[label] = m.sqlExpression;
|
||||
} else if (
|
||||
m.expressionType === 'SIMPLE' &&
|
||||
m.aggregate &&
|
||||
m.column?.column_name
|
||||
) {
|
||||
sqlExpressionMap[label] = `${m.aggregate}(${m.column.column_name})`;
|
||||
}
|
||||
}
|
||||
});
|
||||
// Map dimension columns with custom SQL expressions
|
||||
(columns || []).forEach((col: QueryFormColumn) => {
|
||||
if (typeof col === 'object' && 'sqlExpression' in col) {
|
||||
const label = getColumnLabel(col);
|
||||
if (col.sqlExpression) {
|
||||
sqlExpressionMap[label] = col.sqlExpression;
|
||||
}
|
||||
}
|
||||
});
|
||||
// Merge datasource-level saved metrics and calculated columns
|
||||
if (ownState.metricSqlExpressions) {
|
||||
Object.entries(
|
||||
ownState.metricSqlExpressions as Record<string, string>,
|
||||
).forEach(([label, expression]) => {
|
||||
if (!sqlExpressionMap[label]) {
|
||||
sqlExpressionMap[label] = expression;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const resolveLabelsToSQL = (clause: string): string => {
|
||||
let resolved = clause;
|
||||
// Sort by label length descending to prevent substring false positives
|
||||
const sortedEntries = Object.entries(sqlExpressionMap).sort(
|
||||
([a], [b]) => b.length - a.length,
|
||||
);
|
||||
sortedEntries.forEach(([label, expression]) => {
|
||||
if (resolved.includes(label)) {
|
||||
const escapedLabel = label.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
||||
// Wrap complex expressions in parentheses for valid SQL
|
||||
const isExpression =
|
||||
expression.includes('(') ||
|
||||
expression.toUpperCase().includes('CASE') ||
|
||||
expression.includes('\n');
|
||||
const wrappedExpression = isExpression
|
||||
? `(${expression})`
|
||||
: expression;
|
||||
resolved = resolved.replace(
|
||||
new RegExp(`\\b${escapedLabel}\\b`, 'g'),
|
||||
wrappedExpression,
|
||||
);
|
||||
}
|
||||
});
|
||||
return resolved;
|
||||
};
|
||||
|
||||
// Resolve and apply AG Grid WHERE clause
|
||||
if (ownState.agGridComplexWhere && ownState.agGridComplexWhere.trim()) {
|
||||
const resolvedWhere = resolveLabelsToSQL(ownState.agGridComplexWhere);
|
||||
(ownState as Record<string, unknown>).agGridComplexWhere =
|
||||
resolvedWhere;
|
||||
const existingWhere = queryObject.extras?.where;
|
||||
const combinedWhere = existingWhere
|
||||
? `${existingWhere} AND ${ownState.agGridComplexWhere}`
|
||||
: ownState.agGridComplexWhere;
|
||||
? `${existingWhere} AND ${resolvedWhere}`
|
||||
: resolvedWhere;
|
||||
|
||||
queryObject = {
|
||||
...queryObject,
|
||||
@@ -498,12 +563,15 @@ const buildQuery: BuildQuery<TableChartFormData> = (
|
||||
};
|
||||
}
|
||||
|
||||
// Add AG Grid HAVING clause from ownState (metric filters only)
|
||||
// Resolve and apply AG Grid HAVING clause
|
||||
if (ownState.agGridHavingClause && ownState.agGridHavingClause.trim()) {
|
||||
const resolvedHaving = resolveLabelsToSQL(ownState.agGridHavingClause);
|
||||
(ownState as Record<string, unknown>).agGridHavingClause =
|
||||
resolvedHaving;
|
||||
const existingHaving = queryObject.extras?.having;
|
||||
const combinedHaving = existingHaving
|
||||
? `${existingHaving} AND ${ownState.agGridHavingClause}`
|
||||
: ownState.agGridHavingClause;
|
||||
? `${existingHaving} AND ${resolvedHaving}`
|
||||
: resolvedHaving;
|
||||
|
||||
queryObject = {
|
||||
...queryObject,
|
||||
|
||||
Reference in New Issue
Block a user