netdata/netdata

View on GitHub
src/go/collectors/go.d.plugin/pkg/matcher/cache.go

Summary

Maintainability
A
0 mins
Test Coverage
// SPDX-License-Identifier: GPL-3.0-or-later

package matcher

import "sync"

type (
    cachedMatcher struct {
        matcher Matcher

        mux   sync.RWMutex
        cache map[string]bool
    }
)

// WithCache adds cache to the matcher.
func WithCache(m Matcher) Matcher {
    switch m {
    case TRUE(), FALSE():
        return m
    default:
        return &cachedMatcher{matcher: m, cache: make(map[string]bool)}
    }
}

func (m *cachedMatcher) Match(b []byte) bool {
    s := string(b)
    if result, ok := m.fetch(s); ok {
        return result
    }
    result := m.matcher.Match(b)
    m.put(s, result)
    return result
}

func (m *cachedMatcher) MatchString(s string) bool {
    if result, ok := m.fetch(s); ok {
        return result
    }
    result := m.matcher.MatchString(s)
    m.put(s, result)
    return result
}

func (m *cachedMatcher) fetch(key string) (result bool, ok bool) {
    m.mux.RLock()
    result, ok = m.cache[key]
    m.mux.RUnlock()
    return
}

func (m *cachedMatcher) put(key string, result bool) {
    m.mux.Lock()
    m.cache[key] = result
    m.mux.Unlock()
}