code: func (q *IntentionQueryRequest) CacheInfo() cache.RequestInfo {
  	// We only support caching Match queries, so if Match isn't set,
  	// then return an empty info object which will cause a pass-through
  	// (and likely fail).
  	if q.Match == nil {
  		return cache.RequestInfo{}
  	}
  
  	info := cache.RequestInfo{
  		Token:      q.Token,
  		Datacenter: q.Datacenter,
  		MinIndex:   q.MinQueryIndex,
  		Timeout:    q.MaxQueryTime,
  	}
  
  	// Calculate the cache key via just hashing the Match struct. This
  	// has been configured so things like ordering of entries has no
  	// effect (via struct tags).
  	v, err := hashstructure.Hash(q.Match, nil)
  	if err == nil {
  		// If there is an error, we don't set the key. A blank key forces
  		// no cache for this request so the request is forwarded directly
  		// to the server.
  		info.Key = strconv.FormatUint(v, 16)
  	}
  
  	return info
  }
docs: // CacheInfo implements cache.Request