fix(ag-grid-table): fix AND filter conditions not applied (#38369)

This commit is contained in:
amaannawab923
2026-03-13 19:42:14 +05:30
committed by GitHub
parent f6106cd26f
commit ca2d26a1e2
5 changed files with 369 additions and 7 deletions

View File

@@ -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,