List of usage examples for org.apache.lucene.index IndexReader.ReaderClosedListener IndexReader.ReaderClosedListener
IndexReader.ReaderClosedListener
From source file:org.elasticsearch.index.shard.IndexSearcherWrapperTests.java
License:Apache License
public void testReaderCloseListenerIsCalled() throws IOException { Directory dir = newDirectory();/*from w w w. j a v a 2s .c o m*/ IndexWriterConfig iwc = newIndexWriterConfig(); IndexWriter writer = new IndexWriter(dir, iwc); Document doc = new Document(); doc.add(new StringField("id", "1", random().nextBoolean() ? Field.Store.YES : Field.Store.NO)); doc.add(new TextField("field", "doc", random().nextBoolean() ? Field.Store.YES : Field.Store.NO)); writer.addDocument(doc); final DirectoryReader open = ElasticsearchDirectoryReader.wrap(DirectoryReader.open(writer, true), new ShardId("foo", 1)); IndexSearcher searcher = new IndexSearcher(open); assertEquals(1, searcher.search(new TermQuery(new Term("field", "doc")), 1).totalHits); final AtomicInteger closeCalls = new AtomicInteger(0); IndexSearcherWrapper wrapper = new IndexSearcherWrapper() { @Override public DirectoryReader wrap(DirectoryReader reader) throws IOException { return new FieldMaskingReader("field", reader, closeCalls); } @Override public IndexSearcher wrap(EngineConfig engineConfig, IndexSearcher searcher) throws EngineException { return searcher; } }; final int sourceRefCount = open.getRefCount(); final AtomicInteger count = new AtomicInteger(); final AtomicInteger outerCount = new AtomicInteger(); try (Engine.Searcher engineSearcher = new Engine.Searcher("foo", searcher)) { final Engine.Searcher wrap = new IndexSearcherWrappingService(Collections.singleton(wrapper)) .wrap(ENGINE_CONFIG, engineSearcher); assertEquals(1, wrap.reader().getRefCount()); ElasticsearchDirectoryReader.addReaderCloseListener(wrap.getDirectoryReader(), new IndexReader.ReaderClosedListener() { @Override public void onClose(IndexReader reader) throws IOException { if (reader == open) { count.incrementAndGet(); } outerCount.incrementAndGet(); } }); assertEquals(0, wrap.searcher().search(new TermQuery(new Term("field", "doc")), 1).totalHits); wrap.close(); assertFalse("wrapped reader is closed", wrap.reader().tryIncRef()); assertEquals(sourceRefCount, open.getRefCount()); } assertEquals(1, closeCalls.get()); IOUtils.close(open, writer, dir); assertEquals(1, outerCount.get()); assertEquals(1, count.get()); assertEquals(0, open.getRefCount()); assertEquals(1, closeCalls.get()); }
From source file:org.elasticsearch.index.shard.IndexSearcherWrapperTests.java
License:Apache License
public void testIsCacheable() throws IOException { Directory dir = newDirectory();//www . j a va2s .c o m IndexWriterConfig iwc = newIndexWriterConfig(); IndexWriter writer = new IndexWriter(dir, iwc); Document doc = new Document(); doc.add(new StringField("id", "1", random().nextBoolean() ? Field.Store.YES : Field.Store.NO)); doc.add(new TextField("field", "doc", random().nextBoolean() ? Field.Store.YES : Field.Store.NO)); writer.addDocument(doc); DirectoryReader open = ElasticsearchDirectoryReader.wrap(DirectoryReader.open(writer, true), new ShardId("foo", 1)); IndexSearcher searcher = new IndexSearcher(open); assertEquals(1, searcher.search(new TermQuery(new Term("field", "doc")), 1).totalHits); searcher.setSimilarity(iwc.getSimilarity()); final AtomicInteger closeCalls = new AtomicInteger(0); IndexSearcherWrapper wrapper = new IndexSearcherWrapper() { @Override public DirectoryReader wrap(DirectoryReader reader) throws IOException { return new FieldMaskingReader("field", reader, closeCalls); } @Override public IndexSearcher wrap(EngineConfig engineConfig, IndexSearcher searcher) throws EngineException { return searcher; } }; final ConcurrentHashMap<Object, TopDocs> cache = new ConcurrentHashMap<>(); try (Engine.Searcher engineSearcher = new Engine.Searcher("foo", searcher)) { try (final Engine.Searcher wrap = new IndexSearcherWrappingService(Collections.singleton(wrapper)) .wrap(ENGINE_CONFIG, engineSearcher)) { ElasticsearchDirectoryReader.addReaderCloseListener(wrap.getDirectoryReader(), new IndexReader.ReaderClosedListener() { @Override public void onClose(IndexReader reader) throws IOException { cache.remove(reader.getCoreCacheKey()); } }); TopDocs search = wrap.searcher().search(new TermQuery(new Term("field", "doc")), 1); cache.put(wrap.reader().getCoreCacheKey(), search); } } assertEquals(1, closeCalls.get()); assertEquals(1, cache.size()); IOUtils.close(open, writer, dir); assertEquals(0, cache.size()); assertEquals(1, closeCalls.get()); }