diff --git a/src/main/java/it/cavallium/dbengine/database/indicizer/DatabaseMemoryMode.java b/src/main/java/it/cavallium/dbengine/database/indicizer/DatabaseMemoryMode.java new file mode 100644 index 0000000..3eed69f --- /dev/null +++ b/src/main/java/it/cavallium/dbengine/database/indicizer/DatabaseMemoryMode.java @@ -0,0 +1,5 @@ +package it.cavallium.dbengine.database.indicizer; + +public enum DatabaseMemoryMode { + LOW, NORMAL, HIGH +} diff --git a/src/main/java/it/cavallium/dbengine/database/indicizer/Indicizer.java b/src/main/java/it/cavallium/dbengine/database/indicizer/Indicizer.java new file mode 100644 index 0000000..ccf655c --- /dev/null +++ b/src/main/java/it/cavallium/dbengine/database/indicizer/Indicizer.java @@ -0,0 +1,24 @@ +package it.cavallium.dbengine.database.indicizer; + +import it.cavallium.dbengine.database.LLDocument; +import it.cavallium.dbengine.database.LLTerm; +import java.util.Set; +import org.jetbrains.annotations.NotNull; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.util.function.Tuple2; + +public abstract class Indicizer { + + public abstract @NotNull Mono toDocument(@NotNull T key, @NotNull U value); + + public abstract @NotNull LLTerm toIndex(@NotNull T key); + + public abstract @NotNull String getKeyFieldName(); + + public abstract @NotNull T getKey(String key); + + public Flux>> getMoreLikeThisDocumentFields(U value) { + return Flux.empty(); + } +} diff --git a/src/main/java/it/cavallium/dbengine/database/indicizer/JoinedIndicizerWriter.java b/src/main/java/it/cavallium/dbengine/database/indicizer/JoinedIndicizerWriter.java new file mode 100644 index 0000000..17493e0 --- /dev/null +++ b/src/main/java/it/cavallium/dbengine/database/indicizer/JoinedIndicizerWriter.java @@ -0,0 +1,86 @@ +package it.cavallium.dbengine.database.indicizer; + +import it.cavallium.dbengine.database.LLScoreMode; +import it.cavallium.dbengine.database.LLSearchResult; +import it.cavallium.dbengine.database.LLSort; +import it.cavallium.dbengine.database.collections.Joiner; +import it.cavallium.dbengine.database.collections.Joiner.ValueGetter; +import org.jetbrains.annotations.Nullable; +import it.cavallium.dbengine.client.CompositeSnapshot; +import reactor.core.publisher.Mono; + +public class JoinedIndicizerWriter implements LuceneIndicizerWriter { + + private final LuceneIndicizerWriter indicizerWriter; + private final Joiner joiner; + private final ValueGetter dbValueGetter; + + public JoinedIndicizerWriter(LuceneIndicizerWriter indicizerWriter, + Joiner joiner, + ValueGetter dbValueGetter) { + this.indicizerWriter = indicizerWriter; + this.joiner = joiner; + this.dbValueGetter = dbValueGetter; + } + + @Override + public Mono add(KEY key, DBTYPE value) { + return joiner + .join(dbValueGetter, value) + .flatMap(joinedValue -> this.indicizerWriter.add(key, joinedValue)); + } + + @Override + public Mono remove(KEY key) { + return this.indicizerWriter.remove(key); + } + + @Override + public Mono update(KEY key, DBTYPE value) { + return joiner + .join(dbValueGetter, value) + .flatMap(joinedValue -> this.indicizerWriter.update(key, joinedValue)); + } + + @Override + public Mono clearIndex() { + return this.indicizerWriter.clearIndex(); + } + + @Override + public Mono moreLikeThis(@Nullable CompositeSnapshot snapshot, DBTYPE mltDocumentValue, int limit) { + return joiner + .join(dbValueGetter, mltDocumentValue) + .flatMap(val -> this.indicizerWriter.moreLikeThis(snapshot, val, limit)); + } + + @Override + public Mono search(@Nullable CompositeSnapshot snapshot, + String query, + int limit, + @Nullable LLSort sort, + LLScoreMode scoreMode) { + return this.indicizerWriter + .search(snapshot, query, limit, sort, scoreMode); + } + + @Override + public Mono count(@Nullable CompositeSnapshot snapshot, String query) { + return this.indicizerWriter.count(snapshot, query); + } + + @Override + public Mono close() { + return this.indicizerWriter.close(); + } + + @Override + public Mono getKey(String key) { + return this.indicizerWriter.getKey(key); + } + + @Override + public DatabaseMemoryMode getMemoryMode() { + return this.indicizerWriter.getMemoryMode(); + } +} diff --git a/src/main/java/it/cavallium/dbengine/database/indicizer/LuceneIndicizerWriter.java b/src/main/java/it/cavallium/dbengine/database/indicizer/LuceneIndicizerWriter.java new file mode 100644 index 0000000..83fa986 --- /dev/null +++ b/src/main/java/it/cavallium/dbengine/database/indicizer/LuceneIndicizerWriter.java @@ -0,0 +1,48 @@ +package it.cavallium.dbengine.database.indicizer; + +import it.cavallium.dbengine.client.CompositeSnapshot; +import it.cavallium.dbengine.database.LLScoreMode; +import it.cavallium.dbengine.database.LLSearchResult; +import it.cavallium.dbengine.database.LLSort; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.util.function.Tuple2; + +public interface LuceneIndicizerWriter { + + Mono add(T key, U value); + + default Mono addMulti(@NotNull Flux> values) { + return values.flatMap(tuple -> this.add(tuple.getT1(), tuple.getT2())).then(); + } + + Mono remove(T key); + + Mono update(T key, U value); + + default Mono updateMulti(@NotNull Flux> values) { + return values.flatMap(tuple -> this.update(tuple.getT1(), tuple.getT2())).then(); + } + + Mono clearIndex(); + + Mono moreLikeThis(@Nullable CompositeSnapshot snapshot, + U mltDocumentValue, + int limit); + + Mono search(@Nullable CompositeSnapshot snapshot, + String query, + int limit, + @Nullable LLSort sort, + LLScoreMode scoreMode); + + Mono count(@Nullable CompositeSnapshot snapshot, String query); + + Mono close(); + + Mono getKey(String key); + + DatabaseMemoryMode getMemoryMode(); +} diff --git a/src/main/java/it/cavallium/dbengine/database/indicizer/StandardLuceneIndicizerWriter.java b/src/main/java/it/cavallium/dbengine/database/indicizer/StandardLuceneIndicizerWriter.java new file mode 100644 index 0000000..8007301 --- /dev/null +++ b/src/main/java/it/cavallium/dbengine/database/indicizer/StandardLuceneIndicizerWriter.java @@ -0,0 +1,92 @@ +package it.cavallium.dbengine.database.indicizer; + +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 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, + String 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, String 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; + } +}