Package org.apache.lucene.index

# Interface IndexReader.CacheHelper

All Known Implementing Classes:
  `FilterDirectoryReader.DelegatingCacheHelper`

Enclosing class:
  `IndexReader`

public static interface IndexReader.CacheHelper
A utility class that gives hooks in order to help build a cache based on the data that is contained in this index.

Example: cache the number of documents that match a query per reader.

     public class QueryCountCache {

       private final Query query;
       private final Map<IndexReader.CacheKey, Integer> counts = new ConcurrentHashMap<>();

       // Create a cache of query counts for the given query
       public QueryCountCache(Query query) {
         this.query = query;
       }

       // Count the number of matches of the query on the given IndexSearcher
       public int count(IndexSearcher searcher) throws IOException {
         IndexReader.CacheHelper cacheHelper = searcher.getIndexReader().getReaderCacheHelper();
         if (cacheHelper == null) {
           // reader doesn't support caching
           return searcher.count(query);
         } else {
           // make sure the cache entry is cleared when the reader is closed
           cacheHelper.addClosedListener(counts::remove);
           return counts.computeIfAbsent(cacheHelper.getKey(), cacheKey -> {
             try {
               return searcher.count(query);
             } catch (IOException e) {
               throw new UncheckedIOException(e);
             }
           });
         }
       }

     }

WARNING: This API is experimental and might change in incompatible ways in the next release.

## Method Summary

Modifier and Type
Method
Description
`void`
`addClosedListener(IndexReader.ClosedListener listener)`
Add a `IndexReader.ClosedListener` which will be called when the resource guarded by `getKey()` is closed.
`IndexReader.CacheKey`
`getKey()`
Get a key that the resource can be cached on.

## Method Details

### getKey

IndexReader.CacheKey getKey()
Get a key that the resource can be cached on. The given entry can be compared using identity, ie. `Object.equals(java.lang.Object)` is implemented as `==` and `Object.hashCode()` is implemented as `System.identityHashCode(java.lang.Object)`.

### addClosedListener

void addClosedListener(IndexReader.ClosedListener listener)
Add a `IndexReader.ClosedListener` which will be called when the resource guarded by `getKey()` is closed.