package it.cavallium.dbengine.database.collections; import it.cavallium.dbengine.client.CompositeSnapshot; import java.util.Objects; import java.util.function.Function; import org.jetbrains.annotations.Nullable; import reactor.core.publisher.Mono; public interface DatabaseStage extends DatabaseStageWithEntry { default Mono get(@Nullable CompositeSnapshot snapshot) { return get(snapshot, false); } Mono get(@Nullable CompositeSnapshot snapshot, boolean existsAlmostCertainly); default Mono getOrDefault(@Nullable CompositeSnapshot snapshot, Mono defaultValue, boolean existsAlmostCertainly) { return get(snapshot, existsAlmostCertainly).switchIfEmpty(defaultValue).single(); } default Mono getOrDefault(@Nullable CompositeSnapshot snapshot, Mono defaultValue) { return getOrDefault(snapshot, defaultValue, false); } default Mono set(T value) { return setAndGetChanged(value).then(); } Mono setAndGetPrevious(T value); default Mono setAndGetChanged(T value) { return setAndGetPrevious(value).map(oldValue -> !Objects.equals(oldValue, value)).defaultIfEmpty(value != null); } Mono update(Function<@Nullable T, @Nullable T> updater, boolean existsAlmostCertainly); default Mono update(Function<@Nullable T, @Nullable T> updater) { return update(updater, false); } default Mono clear() { return clearAndGetStatus().then(); } Mono clearAndGetPrevious(); default Mono clearAndGetStatus() { return clearAndGetPrevious().map(Objects::nonNull).defaultIfEmpty(false); } void release(); default Mono close() { return Mono.empty(); } /** * 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); } }