From f47981f362e6772058432c697e8d035b981ea145 Mon Sep 17 00:00:00 2001 From: Andrew Watkins Date: Wed, 27 Jun 2018 11:32:39 -0700 Subject: [PATCH] Move replate replacement functions to the frontend --- ui/src/tempVars/utils/replace.ts | 38 ++++++++++++++++++++++-- ui/test/tempVars/utils/replace.test.ts | 41 +++++++++++++++++++++++--- 2 files changed, 72 insertions(+), 7 deletions(-) diff --git a/ui/src/tempVars/utils/replace.ts b/ui/src/tempVars/utils/replace.ts index 54e15734b5..dbdf290f5d 100644 --- a/ui/src/tempVars/utils/replace.ts +++ b/ui/src/tempVars/utils/replace.ts @@ -42,24 +42,56 @@ const renderTemplate = (query: string, template: Template): string => { const {tempVar} = template const {value, type} = templateValue + let q = '' + + // First replace all template variable types in regular expressions. Values should appear unquoted. switch (type) { case TemplateValueType.TagKey: case TemplateValueType.FieldKey: case TemplateValueType.Measurement: case TemplateValueType.Database: - return replaceAll(query, tempVar, `"${value}"`) case TemplateValueType.TagValue: case TemplateValueType.TimeStamp: - return replaceAll(query, tempVar, `'${value}'`) + q = replaceAllRegex(query, tempVar, value) + break + default: + q = query + } + + // Then render template variables not in regular expressions + switch (type) { + case TemplateValueType.TagKey: + case TemplateValueType.FieldKey: + case TemplateValueType.Measurement: + case TemplateValueType.Database: + return replaceAll(q, tempVar, `"${value}"`) + case TemplateValueType.TagValue: + case TemplateValueType.TimeStamp: + return replaceAll(q, tempVar, `'${value}'`) case TemplateValueType.CSV: case TemplateValueType.Constant: case TemplateValueType.MetaQuery: - return replaceAll(query, tempVar, value) + return replaceAll(q, tempVar, value) default: return query } } +const replaceAllRegex = ( + query: string, + search: string, + replacement: string +) => { + const matches = query.match(/\/([^\/]*)\//gm) + const isReplaceable = !!matches && matches.some(m => m.includes(search)) + + if (!isReplaceable) { + return query + } + + return replaceAll(query, search, replacement) +} + const replaceAll = (query: string, search: string, replacement: string) => { return query.split(search).join(replacement) } diff --git a/ui/test/tempVars/utils/replace.test.ts b/ui/test/tempVars/utils/replace.test.ts index 66527d57fa..7d5465ff03 100644 --- a/ui/test/tempVars/utils/replace.test.ts +++ b/ui/test/tempVars/utils/replace.test.ts @@ -4,9 +4,6 @@ import {emptyTemplate} from 'test/resources' describe('templates.utils.replace', () => { it('can replace select with parameters', () => { - const query = - ':method: field1, :field: FROM :measurement: WHERE temperature > :temperature:' - const vars = [ { ...emptyTemplate, @@ -33,7 +30,8 @@ describe('templates.utils.replace', () => { values: [{type: TemplateValueType.CSV, value: `"cpu"`, selected: true}], }, ] - + const query = + ':method: field1, :field: FROM :measurement: WHERE temperature > :temperature:' const expected = `SELECT field1, "field2" FROM "cpu" WHERE temperature > 10` const actual = templateReplace(query, vars) @@ -76,6 +74,41 @@ describe('templates.utils.replace', () => { expect(actual).toBe(expected) }) + describe('queries with a regex', () => { + it('replaces properly', () => { + const vars = [ + { + ...emptyTemplate, + tempVar: ':host:', + values: [ + { + type: TemplateValueType.TagValue, + value: 'my-host.local', + selected: true, + }, + ], + }, + { + ...emptyTemplate, + tempVar: ':dashboardTime:', + values: [ + { + value: 'now() - 1h', + type: TemplateValueType.Constant, + selected: true, + }, + ], + }, + ] + + const query = `SELECT "usage_active" FROM "cpu" WHERE host =~ /^:host:$/ AND time > :dashboardTime: FILL(null)` + const expected = `SELECT "usage_active" FROM "cpu" WHERE host =~ /^my-host.local$/ AND time > now() - 1h FILL(null)` + const actual = templateReplace(query, vars) + + expect(actual).toBe(expected) + }) + }) + describe('with no templates', () => { it('does not do a replacement', () => { const query = `SELECT :field: FROM "cpu"`