Example usage for org.apache.lucene.index LeafReader getReaderCacheHelper

List of usage examples for org.apache.lucene.index LeafReader getReaderCacheHelper

Introduction

In this page you can find the example usage for org.apache.lucene.index LeafReader getReaderCacheHelper.

Prototype

public abstract CacheHelper getReaderCacheHelper();

Source Link

Document

Optional method: Return a CacheHelper that can be used to cache based on the content of this reader.

Usage

From source file:org.elasticsearch.xpack.core.security.authz.accesscontrol.DocumentSubsetReader.java

License:Open Source License

/**
 * Like {@link #computeNumDocs} but caches results.
 *///from w  w w .  j ava2 s  .  co m
private static int getNumDocs(LeafReader reader, Query roleQuery, BitSet roleQueryBits)
        throws IOException, ExecutionException {
    IndexReader.CacheHelper cacheHelper = reader.getReaderCacheHelper(); // this one takes deletes into account
    if (cacheHelper == null) {
        throw new IllegalStateException("Reader " + reader + " does not support caching");
    }
    final boolean[] added = new boolean[] { false };
    Cache<Query, Integer> perReaderCache = NUM_DOCS_CACHE.computeIfAbsent(cacheHelper.getKey(), key -> {
        added[0] = true;
        return CacheBuilder.<Query, Integer>builder()
                // Not configurable, this limit only exists so that if a role query is updated
                // then we won't risk OOME because of old role queries that are not used anymore
                .setMaximumWeight(1000).weigher((k, v) -> 1) // just count
                .build();
    });
    if (added[0]) {
        IndexReader.ClosedListener closedListener = NUM_DOCS_CACHE::remove;
        try {
            cacheHelper.addClosedListener(closedListener);
        } catch (AlreadyClosedException e) {
            closedListener.onClose(cacheHelper.getKey());
            throw e;
        }
    }
    return perReaderCache.computeIfAbsent(roleQuery, q -> computeNumDocs(reader, roleQuery, roleQueryBits));
}