diff --git a/public/app/features/alerting/unified/components/rule-editor/util.test.ts b/public/app/features/alerting/unified/components/rule-editor/util.test.ts index 2c23db035fd..28aedeaf091 100644 --- a/public/app/features/alerting/unified/components/rule-editor/util.test.ts +++ b/public/app/features/alerting/unified/components/rule-editor/util.test.ts @@ -156,6 +156,35 @@ describe('rule-editor', () => { expect(rewiredQueries[1]).toEqual(queries[1]); expect(rewiredQueries[2]).toEqual(queries[2]); }); + + it('should not rewire non-referencing expressions', () => { + const dataSource1 = { ...dataSource, refId: 'Q1' }; + const dataSource2 = { ...dataSource, refId: 'Q2' }; + const condition1 = { + ...classicCondition, + refId: 'A', + model: { + ...classicCondition.model, + conditions: [ + { + ...classicCondition.model.conditions[0], + query: { params: ['Q1'] }, + }, + ], + }, + }; + const condition2 = { ...reduceExpression, refId: 'B', model: { ...reduceExpression.model, expression: 'Q1' } }; + const condition3 = { ...mathExpression, refId: 'C', model: { ...mathExpression.model, expression: '${Q1}' } }; + + const queries: AlertQuery[] = [dataSource1, dataSource2, condition1, condition2, condition3]; + const rewiredQueries = queriesWithUpdatedReferences(queries, 'Q2', 'Q3'); + + expect(rewiredQueries[0]).toEqual(queries[0]); + expect(rewiredQueries[1]).toEqual(queries[1]); + expect(rewiredQueries[2]).toEqual(queries[2]); + expect(rewiredQueries[3]).toEqual(queries[3]); + expect(rewiredQueries[4]).toEqual(queries[4]); + }); }); describe('updateMathExpressionRefs', () => { @@ -165,5 +194,8 @@ describe('rule-editor', () => { it('should rewire refs with brackets', () => { expect(updateMathExpressionRefs('abs(${Foo}) + $Foo', 'Foo', 'Bar')).toBe('abs(${Bar}) + ${Bar}'); }); + it('should not rewire refs with partial variable match', () => { + expect(updateMathExpressionRefs('$A3 + $B', 'A', 'C')).toBe('$A3 + $B'); + }); }); }); diff --git a/public/app/features/alerting/unified/components/rule-editor/util.ts b/public/app/features/alerting/unified/components/rule-editor/util.ts index e49bf28c191..04e488b2d1f 100644 --- a/public/app/features/alerting/unified/components/rule-editor/util.ts +++ b/public/app/features/alerting/unified/components/rule-editor/util.ts @@ -31,11 +31,13 @@ export function queriesWithUpdatedReferences( } if (isResampleExpression || isReduceExpression) { + const isReferencing = query.model.expression === previousRefId; + return { ...query, model: { ...query.model, - expression: newRefId, + expression: isReferencing ? newRefId : query.model.expression, }, }; } @@ -57,7 +59,7 @@ export function queriesWithUpdatedReferences( } export function updateMathExpressionRefs(expression: string, previousRefId: string, newRefId: string): string { - const oldExpression = new RegExp('\\${?' + previousRefId + '}?', 'gm'); + const oldExpression = new RegExp('(\\$' + previousRefId + '\\b)|(\\${' + previousRefId + '})', 'gm'); const newExpression = '${' + newRefId + '}'; return expression.replace(oldExpression, newExpression);