package it.cavallium.dbengine.database.indicizer; import it.cavallium.dbengine.database.DatabaseMemoryMode; import it.cavallium.dbengine.database.LLLuceneIndex; import it.cavallium.dbengine.database.LLScoreMode; import it.cavallium.dbengine.database.LLSearchResult; import it.cavallium.dbengine.database.LLSnapshot; import it.cavallium.dbengine.database.LLSort; import it.cavallium.dbengine.database.LLTerm; import it.cavallium.dbengine.lucene.serializer.Query; import java.util.Set; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import it.cavallium.dbengine.client.CompositeSnapshot; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.util.function.Tuple2; public class StandardLuceneIndicizerWriter implements LuceneIndicizerWriter { protected final LLLuceneIndex luceneIndex; protected final Indicizer indicizer; public StandardLuceneIndicizerWriter(@NotNull LLLuceneIndex luceneIndex, @NotNull Indicizer indicizer) { this.luceneIndex = luceneIndex; this.indicizer = indicizer; } private LLSnapshot resolveSnapshot(CompositeSnapshot snapshot) { if (snapshot == null) { return null; } else { return snapshot.getSnapshot(luceneIndex); } } @Override public Mono add(@NotNull T key, @NotNull U value) { LLTerm docKey = indicizer.toIndex(key); return indicizer.toDocument(key, value).flatMap(doc -> luceneIndex.addDocument(docKey, doc)); } @Override public Mono remove(@NotNull T key) { LLTerm term = indicizer.toIndex(key); return luceneIndex.deleteDocument(term); } @Override public Mono update(@NotNull T key, @NotNull U value) { LLTerm term = indicizer.toIndex(key); return indicizer.toDocument(key, value).flatMap(doc -> luceneIndex.updateDocument(term, doc)); } @Override public Mono clearIndex() { return luceneIndex.deleteAll(); } @Override public Mono moreLikeThis(@Nullable CompositeSnapshot snapshot, U mltDocumentValue, int limit) { Flux>> mltDocumentFields = indicizer.getMoreLikeThisDocumentFields(mltDocumentValue); return luceneIndex.moreLikeThis(resolveSnapshot(snapshot), mltDocumentFields, limit, indicizer.getKeyFieldName()); } @Override public Mono search(@Nullable CompositeSnapshot snapshot, Query query, int limit, @Nullable LLSort sort, LLScoreMode scoreMode) { return luceneIndex.search(resolveSnapshot(snapshot), query, limit, sort, scoreMode, indicizer.getKeyFieldName()); } @Override public Mono count(@Nullable CompositeSnapshot snapshot, Query query) { return luceneIndex.count(resolveSnapshot(snapshot), query); } @Override public Mono close() { return luceneIndex.close(); } @Override public Mono getKey(String key) { return Mono.just(indicizer.getKey(key)); } @Override public DatabaseMemoryMode getMemoryMode() { return luceneIndex.isLowMemoryMode() ? DatabaseMemoryMode.LOW : DatabaseMemoryMode.NORMAL; } }