2021-02-03 20:13:17 +01:00
|
|
|
package it.cavallium.dbengine.client;
|
|
|
|
|
2021-09-19 19:59:37 +02:00
|
|
|
import io.net5.buffer.api.Send;
|
2021-03-02 01:53:36 +01:00
|
|
|
import it.cavallium.dbengine.client.query.ClientQueryParams;
|
|
|
|
import it.cavallium.dbengine.client.query.current.data.Query;
|
2021-08-04 01:12:39 +02:00
|
|
|
import it.cavallium.dbengine.client.query.current.data.TotalHitsCount;
|
2021-06-07 16:21:12 +02:00
|
|
|
import it.cavallium.dbengine.database.Delta;
|
2021-02-03 20:13:17 +01:00
|
|
|
import it.cavallium.dbengine.database.LLSnapshottable;
|
2021-07-17 11:52:08 +02:00
|
|
|
import it.cavallium.dbengine.database.collections.ValueGetter;
|
|
|
|
import it.cavallium.dbengine.database.collections.ValueTransformer;
|
2021-02-03 20:13:17 +01:00
|
|
|
import java.util.Map.Entry;
|
2021-07-23 15:20:33 +02:00
|
|
|
import java.util.Optional;
|
2021-06-07 16:21:12 +02:00
|
|
|
import org.jetbrains.annotations.NotNull;
|
2021-02-03 20:13:17 +01:00
|
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
import reactor.core.publisher.Flux;
|
|
|
|
import reactor.core.publisher.Mono;
|
2021-07-05 12:05:45 +02:00
|
|
|
import reactor.util.function.Tuple2;
|
2021-07-17 11:52:08 +02:00
|
|
|
import reactor.util.function.Tuple3;
|
|
|
|
import reactor.util.function.Tuples;
|
2021-02-03 20:13:17 +01:00
|
|
|
|
2021-04-03 19:09:06 +02:00
|
|
|
@SuppressWarnings("unused")
|
|
|
|
public interface LuceneIndex<T, U> extends LLSnapshottable {
|
2021-02-03 20:13:17 +01:00
|
|
|
|
2021-04-03 19:09:06 +02:00
|
|
|
Mono<Void> addDocument(T key, U value);
|
2021-02-03 20:13:17 +01:00
|
|
|
|
2021-04-03 19:09:06 +02:00
|
|
|
Mono<Void> addDocuments(Flux<Entry<T, U>> entries);
|
2021-02-03 20:13:17 +01:00
|
|
|
|
2021-04-03 19:09:06 +02:00
|
|
|
Mono<Void> deleteDocument(T key);
|
2021-02-03 20:13:17 +01:00
|
|
|
|
2021-06-07 16:21:12 +02:00
|
|
|
Mono<Void> updateDocument(T key, @NotNull U value);
|
2021-02-03 20:13:17 +01:00
|
|
|
|
2021-04-03 19:09:06 +02:00
|
|
|
Mono<Void> updateDocuments(Flux<Entry<T, U>> entries);
|
2021-02-03 20:13:17 +01:00
|
|
|
|
2021-06-07 16:21:12 +02:00
|
|
|
default Mono<Void> updateOrDeleteDocument(T key, @Nullable U value) {
|
|
|
|
if (value == null) {
|
|
|
|
return deleteDocument(key);
|
|
|
|
} else {
|
|
|
|
return updateDocument(key, value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
default Mono<Void> updateOrDeleteDocumentIfModified(T key, @NotNull Delta<U> delta) {
|
2021-07-17 11:52:08 +02:00
|
|
|
return updateOrDeleteDocumentIfModified(key, delta.current(), delta.isModified());
|
|
|
|
}
|
|
|
|
|
|
|
|
default Mono<Void> updateOrDeleteDocumentIfModified(T key, @Nullable U currentValue, boolean modified) {
|
|
|
|
if (modified) {
|
|
|
|
return updateOrDeleteDocument(key, currentValue);
|
2021-06-07 16:21:12 +02:00
|
|
|
} else {
|
|
|
|
return Mono.empty();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-03 19:09:06 +02:00
|
|
|
Mono<Void> deleteAll();
|
2021-02-03 20:13:17 +01:00
|
|
|
|
2021-09-19 19:59:37 +02:00
|
|
|
Mono<Send<SearchResultKeys<T>>> moreLikeThis(ClientQueryParams<SearchResultKey<T>> queryParams, T key, U mltDocumentValue);
|
2021-07-17 11:52:08 +02:00
|
|
|
|
2021-09-19 19:59:37 +02:00
|
|
|
default Mono<Send<SearchResult<T, U>>> moreLikeThisWithValues(ClientQueryParams<SearchResultItem<T, U>> queryParams,
|
2021-07-17 11:52:08 +02:00
|
|
|
T key,
|
|
|
|
U mltDocumentValue,
|
|
|
|
ValueGetter<T, U> valueGetter) {
|
|
|
|
return this.moreLikeThisWithTransformer(queryParams,
|
|
|
|
key,
|
|
|
|
mltDocumentValue,
|
|
|
|
getValueGetterTransformer(valueGetter));
|
|
|
|
}
|
2021-02-03 20:13:17 +01:00
|
|
|
|
2021-09-19 19:59:37 +02:00
|
|
|
Mono<Send<SearchResult<T, U>>> moreLikeThisWithTransformer(ClientQueryParams<SearchResultItem<T, U>> queryParams,
|
2021-02-06 15:53:10 +01:00
|
|
|
T key,
|
2021-02-03 20:13:17 +01:00
|
|
|
U mltDocumentValue,
|
2021-07-17 11:52:08 +02:00
|
|
|
ValueTransformer<T, U> valueTransformer);
|
|
|
|
|
2021-09-19 19:59:37 +02:00
|
|
|
Mono<Send<SearchResultKeys<T>>> search(ClientQueryParams<SearchResultKey<T>> queryParams);
|
2021-02-03 20:13:17 +01:00
|
|
|
|
2021-09-19 19:59:37 +02:00
|
|
|
default Mono<Send<SearchResult<T, U>>> searchWithValues(ClientQueryParams<SearchResultItem<T, U>> queryParams,
|
2021-07-17 11:52:08 +02:00
|
|
|
ValueGetter<T, U> valueGetter) {
|
2021-09-19 19:59:37 +02:00
|
|
|
return this.searchWithTransformer(queryParams, getValueGetterTransformer(valueGetter));
|
2021-07-17 11:52:08 +02:00
|
|
|
}
|
2021-02-03 20:13:17 +01:00
|
|
|
|
2021-09-19 19:59:37 +02:00
|
|
|
Mono<Send<SearchResult<T, U>>> searchWithTransformer(ClientQueryParams<SearchResultItem<T, U>> queryParams,
|
2021-07-17 11:52:08 +02:00
|
|
|
ValueTransformer<T, U> valueTransformer);
|
2021-02-03 20:13:17 +01:00
|
|
|
|
2021-08-04 01:12:39 +02:00
|
|
|
Mono<TotalHitsCount> count(@Nullable CompositeSnapshot snapshot, Query query);
|
2021-02-03 20:13:17 +01:00
|
|
|
|
2021-04-03 19:09:06 +02:00
|
|
|
boolean isLowMemoryMode();
|
2021-02-03 20:13:17 +01:00
|
|
|
|
2021-04-03 19:09:06 +02:00
|
|
|
Mono<Void> close();
|
2021-02-03 20:13:17 +01:00
|
|
|
|
2021-04-03 19:09:06 +02:00
|
|
|
Mono<Void> flush();
|
2021-02-03 20:13:17 +01:00
|
|
|
|
2021-07-18 19:37:24 +02:00
|
|
|
Mono<Void> refresh(boolean force);
|
2021-07-17 11:52:08 +02:00
|
|
|
|
|
|
|
private static <T, U> ValueTransformer<T, U> getValueGetterTransformer(ValueGetter<T, U> valueGetter) {
|
|
|
|
return new ValueTransformer<T, U>() {
|
|
|
|
@Override
|
2021-07-23 15:20:33 +02:00
|
|
|
public <X> Flux<Tuple3<X, T, Optional<U>>> transform(Flux<Tuple2<X, T>> keys) {
|
2021-07-17 11:52:08 +02:00
|
|
|
return keys.flatMapSequential(key -> valueGetter
|
|
|
|
.get(key.getT2())
|
2021-07-23 15:20:33 +02:00
|
|
|
.map(result -> Tuples.of(key.getT1(), key.getT2(), Optional.of(result)))
|
|
|
|
.switchIfEmpty(Mono.fromSupplier(() -> Tuples.of(key.getT1(), key.getT2(), Optional.empty())))
|
|
|
|
);
|
2021-07-17 11:52:08 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
2021-02-03 20:13:17 +01:00
|
|
|
}
|