From 8cb486f24a2713cb2e5cfd289f92a8f1d05c2087 Mon Sep 17 00:00:00 2001 From: Gani Georgiev Date: Fri, 28 Aug 2026 12:28:16 +0300 Subject: [PATCH] optimized filter params replacement to use strings.Replacer for a single pass --- tools/search/filter.go | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/tools/search/filter.go b/tools/search/filter.go index 48983bb8..3025624d 100644 --- a/tools/search/filter.go +++ b/tools/search/filter.go @@ -56,27 +56,36 @@ func (f FilterData) BuildExprWithLimit( raw := string(f) // replace the placeholder params in the raw string filter - for _, p := range placeholderReplacements { - for key, value := range p { - var replacement string - switch v := value.(type) { - case nil: - replacement = "null" - case bool, float64, float32, int, int64, int32, int16, int8, uint, uint64, uint32, uint16, uint8: - replacement = cast.ToString(v) - default: - replacement = cast.ToString(v) + if len(placeholderReplacements) > 0 { + replacements := make([]string, 0, len(placeholderReplacements[0])*2) - // try to json serialize as fallback - if replacement == "" { - raw, _ := json.Marshal(v, json.Deterministic(true)) - replacement = string(raw) + for _, p := range placeholderReplacements { + for key, value := range p { + var replacement string + + switch v := value.(type) { + case nil: + replacement = "null" + case bool, float64, float32, int, int64, int32, int16, int8, uint, uint64, uint32, uint16, uint8: + replacement = cast.ToString(v) + default: + replacement = cast.ToString(v) + + // try to json serialize as fallback + if replacement == "" { + raw, _ := json.Marshal(v, json.Deterministic(true)) + replacement = string(raw) + } + + replacement = strconv.Quote(replacement) } - replacement = strconv.Quote(replacement) + replacements = append(replacements, "{:"+key+"}", replacement) } - raw = strings.ReplaceAll(raw, "{:"+key+"}", replacement) } + + replacer := strings.NewReplacer(replacements...) + raw = replacer.Replace(raw) } cacheKey := raw + "/" + strconv.Itoa(maxExpressions)