diff --git a/packages/grafana-data/src/transformations/matchers/refIdMatcher.ts b/packages/grafana-data/src/transformations/matchers/refIdMatcher.ts index 9ee6962be47..922085b2a00 100644 --- a/packages/grafana-data/src/transformations/matchers/refIdMatcher.ts +++ b/packages/grafana-data/src/transformations/matchers/refIdMatcher.ts @@ -1,4 +1,4 @@ -import { stringStartsAsRegEx, stringToJsRegex } from '../../text/string'; +import { escapeStringForRegex, stringStartsAsRegEx, stringToJsRegex } from '../../text/string'; import { DataFrame } from '../../types/dataFrame'; import { FrameMatcherInfo } from '../../types/transformations'; @@ -23,6 +23,12 @@ const refIdMatcher: FrameMatcherInfo = { } } } + // old format that was simply unescaped pipe-joined strings -> regexp + else if (pattern.includes('|')) { + // convert A|B -> /^(?:A|B)$/, regexp-escaping all chars between pipes + const escapedUnion = pattern.split('|').map(escapeStringForRegex).join('|'); + regex = new RegExp(`^(?:${escapedUnion})$`); + } return (frame: DataFrame) => { return regex?.test(frame.refId || '') ?? frame.refId === pattern; diff --git a/packages/grafana-data/src/transformations/transformers/filterByRefId.test.ts b/packages/grafana-data/src/transformations/transformers/filterByRefId.test.ts index 74a6477529b..7a85ed6a559 100644 --- a/packages/grafana-data/src/transformations/transformers/filterByRefId.test.ts +++ b/packages/grafana-data/src/transformations/transformers/filterByRefId.test.ts @@ -37,8 +37,22 @@ describe('filterByRefId transformer', () => { }); }); - describe('respects', () => { - it('inclusion', async () => { + describe('respects inclusion', () => { + it('pipe delimited literals', async () => { + const cfg = { + id: DataTransformerID.filterByRefId, + options: { + include: 'A|B', + }, + }; + + await expect(transformDataFrame([cfg], allSeries)).toEmitValuesWith((received) => { + const filtered = received[0]; + expect(filtered.map((f) => f.refId)).toEqual(['A', 'B']); + }); + }); + + it('explicit regexp', async () => { const cfg = { id: DataTransformerID.filterByRefId, options: {