CavalliumDBEngine/src/main/java/it/cavallium/dbengine/database/disk/LLIndexSearcher.java

104 lines
3.2 KiB
Java
Raw Normal View History

2021-09-18 18:34:21 +02:00
package it.cavallium.dbengine.database.disk;
import io.net5.buffer.api.Drop;
import io.net5.buffer.api.Owned;
import io.net5.buffer.api.internal.ResourceSupport;
import java.io.IOException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.SearcherManager;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LLIndexSearcher extends ResourceSupport<LLIndexSearcher, LLIndexSearcher> {
private static final Logger logger = LoggerFactory.getLogger(LLIndexSearcher.class);
2021-09-21 02:01:02 +02:00
private final boolean ownsIndexSearcher;
2021-09-18 18:34:21 +02:00
private IndexSearcher indexSearcher;
private SearcherManager associatedSearcherManager;
public LLIndexSearcher(IndexSearcher indexSearcher,
@Nullable SearcherManager associatedSearcherManager,
2021-09-21 02:01:02 +02:00
boolean ownsIndexSearcher,
2021-09-18 18:34:21 +02:00
Drop<LLIndexSearcher> drop) {
super(new LLIndexSearcher.CloseOnDrop(drop));
this.indexSearcher = indexSearcher;
this.associatedSearcherManager = associatedSearcherManager;
2021-09-21 02:01:02 +02:00
this.ownsIndexSearcher = ownsIndexSearcher;
2021-09-18 18:34:21 +02:00
}
public IndexReader getIndexReader() {
if (!isOwned()) {
throw attachTrace(new IllegalStateException("CachedIndexSearcher must be owned to be used"));
}
return indexSearcher.getIndexReader();
}
public IndexSearcher getIndexSearcher() {
if (!isOwned()) {
throw attachTrace(new IllegalStateException("CachedIndexSearcher must be owned to be used"));
}
return indexSearcher;
}
public LLIndexSearcher copy(Drop<LLIndexSearcher> drop) {
if (!isOwned()) {
throw attachTrace(new IllegalStateException("CachedIndexSearcher must be owned to be used"));
}
var copyIndexSearcher = this.indexSearcher;
2021-09-21 02:01:02 +02:00
boolean ownsIndexSearcher;
if (this.ownsIndexSearcher && associatedSearcherManager != null) {
2021-09-18 18:34:21 +02:00
copyIndexSearcher.getIndexReader().incRef();
2021-09-21 02:01:02 +02:00
ownsIndexSearcher = true;
} else {
ownsIndexSearcher = false;
2021-09-18 18:34:21 +02:00
}
2021-09-21 02:01:02 +02:00
return new LLIndexSearcher(copyIndexSearcher, associatedSearcherManager, ownsIndexSearcher, drop);
2021-09-18 18:34:21 +02:00
}
@Override
protected RuntimeException createResourceClosedException() {
return new IllegalStateException("Closed");
}
@Override
protected Owned<LLIndexSearcher> prepareSend() {
var indexSearcher = this.indexSearcher;
var associatedSearcherManager = this.associatedSearcherManager;
makeInaccessible();
2021-09-21 02:01:02 +02:00
return drop -> new LLIndexSearcher(indexSearcher, associatedSearcherManager, ownsIndexSearcher, drop);
2021-09-18 18:34:21 +02:00
}
private void makeInaccessible() {
this.indexSearcher = null;
this.associatedSearcherManager = null;
}
private static class CloseOnDrop implements Drop<LLIndexSearcher> {
private final Drop<LLIndexSearcher> delegate;
public CloseOnDrop(Drop<LLIndexSearcher> drop) {
this.delegate = drop;
}
@Override
public void drop(LLIndexSearcher obj) {
try {
2021-09-21 02:01:02 +02:00
if (obj.associatedSearcherManager != null && obj.ownsIndexSearcher) {
2021-09-18 18:34:21 +02:00
if (obj.indexSearcher.getIndexReader().getRefCount() > 0) {
obj.associatedSearcherManager.release(obj.indexSearcher);
}
}
2021-09-19 19:59:37 +02:00
delegate.drop(obj);
2021-09-18 18:34:21 +02:00
} catch (IOException e) {
logger.error("Failed to drop CachedIndexSearcher", e);
2021-09-19 19:59:37 +02:00
} finally {
obj.makeInaccessible();
2021-09-18 18:34:21 +02:00
}
}
}
}