package it.cavallium.dbengine.database.collections; import io.netty5.buffer.api.Resource; import it.cavallium.dbengine.client.BadBlock; import it.cavallium.dbengine.client.CompositeSnapshot; import it.cavallium.dbengine.database.Delta; import it.cavallium.dbengine.database.LLUtils; import it.cavallium.dbengine.database.UpdateReturnMode; import it.cavallium.dbengine.database.serialization.SerializationFunction; import java.util.Objects; import org.jetbrains.annotations.Nullable; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; public interface DatabaseStage extends DatabaseStageWithEntry, Resource> { Mono get(@Nullable CompositeSnapshot snapshot); default Mono getOrDefault(@Nullable CompositeSnapshot snapshot, Mono defaultValue, boolean existsAlmostCertainly) { return get(snapshot).switchIfEmpty(defaultValue).single(); } default Mono getOrDefault(@Nullable CompositeSnapshot snapshot, Mono defaultValue) { return getOrDefault(snapshot, defaultValue, false); } default Mono set(T value) { return this .setAndGetChanged(value) .then(); } Mono setAndGetPrevious(T value); default Mono setAndGetChanged(T value) { return this .setAndGetPrevious(value) .map(oldValue -> !Objects.equals(oldValue, value)) .switchIfEmpty(Mono.fromSupplier(() -> value != null)); } default Mono update(SerializationFunction<@Nullable T, @Nullable T> updater, UpdateReturnMode updateReturnMode) { return this .updateAndGetDelta(updater) .transform(prev -> LLUtils.resolveDelta(prev, updateReturnMode)); } Mono> updateAndGetDelta(SerializationFunction<@Nullable T, @Nullable T> updater); default Mono clear() { return clearAndGetStatus().then(); } Mono clearAndGetPrevious(); default Mono clearAndGetStatus() { return clearAndGetPrevious().map(Objects::nonNull).defaultIfEmpty(false); } /** * Count all the elements. * If it's a nested collection the count will include all the children recursively * @param fast true to return an approximate value */ Mono leavesCount(@Nullable CompositeSnapshot snapshot, boolean fast); default Mono isEmpty(@Nullable CompositeSnapshot snapshot) { return leavesCount(snapshot, false).map(size -> size <= 0); } Flux badBlocks(); }