List of usage examples for org.apache.lucene.index LeafReader getReaderCacheHelper
public abstract CacheHelper getReaderCacheHelper();
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)); }