sg/internal/engine/query_cache.go (42 lines of code) (raw):

package engine import ( "fmt" "sync" "github.com/Azure/ShieldGuard/sg/internal/result" ) func (k queryCacheKey) cacheKey() string { return fmt.Sprintf( "%s:%d:%s", k.compilerKey, k.parsedInput.Hash(), k.query, ) } type noopQueryCacheT struct{} func (noopQueryCacheT) set(_ queryCacheKey, _ []result.Result) {} func (noopQueryCacheT) get(_ queryCacheKey) ([]result.Result, bool) { return nil, false } var noopQueryCache = noopQueryCacheT{} type queryCache struct { mu *sync.RWMutex items map[string][]result.Result } // NewQueryCache creates a new QueryCache. func NewQueryCache() QueryCache { return &queryCache{ mu: &sync.RWMutex{}, items: make(map[string][]result.Result), } } var _ QueryCache = (*queryCache)(nil) func (qc *queryCache) set(key queryCacheKey, value []result.Result) { qc.mu.Lock() defer qc.mu.Unlock() qc.items[key.cacheKey()] = value } func (qc *queryCache) get(key queryCacheKey) ([]result.Result, bool) { qc.mu.RLock() defer qc.mu.RUnlock() rv, ok := qc.items[key.cacheKey()] return rv, ok }