From 003010f73b21b155be26fc183e29d602d7412ebd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Fri, 5 May 2017 22:36:50 +0100 Subject: [PATCH] Speed up filter matches by re-using global match object Instead of compiling filter regexp on every filter match pre-compile it and use same instance --- filters/filter.go | 3 +-- filters/registry.go | 9 +++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/filters/filter.go b/filters/filter.go index 8d186bc3d..77ccb2c41 100644 --- a/filters/filter.go +++ b/filters/filter.go @@ -96,8 +96,7 @@ func NewFilter(expression string) FilterT { // we have "filter=" part, lookup filter that matches for _, fc := range AllFilters { f := fc.Factory() - labelRe := regexp.MustCompile("^(?:" + fc.Label + ")$") - if !labelRe.MatchString(matched) { + if !fc.LabelRe.MatchString(matched) { // filter name doesn't match, keep searching continue } diff --git a/filters/registry.go b/filters/registry.go index e8d087cf3..88073ceca 100644 --- a/filters/registry.go +++ b/filters/registry.go @@ -1,5 +1,7 @@ package filters +import "regexp" + const ( equalOperator string = "=" notEqualOperator string = "!=" @@ -29,6 +31,7 @@ var matcherConfig = map[string]matcherT{ type filterConfig struct { Label string + LabelRe *regexp.Regexp SupportedOperators []string Factory newFilterFactory Autocomplete autocompleteFactory @@ -39,36 +42,42 @@ type filterConfig struct { var AllFilters = []filterConfig{ filterConfig{ Label: "@status", + LabelRe: regexp.MustCompile("^@status$"), SupportedOperators: []string{equalOperator, notEqualOperator}, Factory: newstatusFilter, Autocomplete: statusAutocomplete, }, filterConfig{ Label: "@age", + LabelRe: regexp.MustCompile("^@age$"), SupportedOperators: []string{lessThanOperator, moreThanOperator}, Factory: newAgeFilter, Autocomplete: ageAutocomplete, }, filterConfig{ Label: "@silence_jira", + LabelRe: regexp.MustCompile("^@silence_jira$"), SupportedOperators: []string{regexpOperator, negativeRegexOperator, equalOperator, notEqualOperator}, Factory: newSilenceJiraFilter, Autocomplete: sinceJiraIDAutocomplete, }, filterConfig{ Label: "@silence_author", + LabelRe: regexp.MustCompile("^@silence_author$"), SupportedOperators: []string{regexpOperator, negativeRegexOperator, equalOperator, notEqualOperator}, Factory: newSilenceAuthorFilter, Autocomplete: sinceAuthorAutocomplete, }, filterConfig{ Label: "@limit", + LabelRe: regexp.MustCompile("^@limit$"), SupportedOperators: []string{equalOperator}, Factory: newLimitFilter, Autocomplete: limitAutocomplete, }, filterConfig{ Label: "[a-zA-Z_][a-zA-Z0-9_]*", + LabelRe: regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$"), SupportedOperators: []string{regexpOperator, negativeRegexOperator, equalOperator, notEqualOperator, lessThanOperator, moreThanOperator}, Factory: newLabelFilter, Autocomplete: labelAutocomplete,