2021-01-30 20:16:14 +01:00
|
|
|
package it.cavallium.dbengine.database.collections;
|
|
|
|
|
2021-06-26 02:35:33 +02:00
|
|
|
import it.cavallium.dbengine.client.BadBlock;
|
2021-01-30 20:16:14 +01:00
|
|
|
import it.cavallium.dbengine.client.CompositeSnapshot;
|
2021-05-08 03:09:00 +02:00
|
|
|
import it.cavallium.dbengine.database.Delta;
|
|
|
|
import it.cavallium.dbengine.database.LLUtils;
|
|
|
|
import it.cavallium.dbengine.database.UpdateReturnMode;
|
2021-08-22 21:23:22 +02:00
|
|
|
import it.cavallium.dbengine.database.serialization.SerializationFunction;
|
2021-01-30 20:16:14 +01:00
|
|
|
import java.util.Objects;
|
2023-02-09 23:34:25 +01:00
|
|
|
import java.util.stream.Stream;
|
2021-01-30 20:16:14 +01:00
|
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
|
2023-02-09 23:34:25 +01:00
|
|
|
public interface DatabaseStage<T> extends DatabaseStageWithEntry<T> {
|
2021-01-30 20:16:14 +01:00
|
|
|
|
2023-02-09 23:34:25 +01:00
|
|
|
@Nullable T get(@Nullable CompositeSnapshot snapshot);
|
2021-03-18 16:19:41 +01:00
|
|
|
|
2023-02-09 23:34:25 +01:00
|
|
|
default T getOrDefault(@Nullable CompositeSnapshot snapshot, T defaultValue, boolean existsAlmostCertainly) {
|
|
|
|
return Objects.requireNonNullElse(get(snapshot), defaultValue);
|
2021-03-18 16:19:41 +01:00
|
|
|
}
|
2021-01-30 20:16:14 +01:00
|
|
|
|
2023-02-09 23:34:25 +01:00
|
|
|
default T getOrDefault(@Nullable CompositeSnapshot snapshot, T defaultValue) {
|
2021-03-18 16:19:41 +01:00
|
|
|
return getOrDefault(snapshot, defaultValue, false);
|
2021-01-30 20:16:14 +01:00
|
|
|
}
|
|
|
|
|
2023-02-09 23:34:25 +01:00
|
|
|
default void set(@Nullable T value) {
|
|
|
|
this.setAndGetChanged(value);
|
2021-01-30 20:16:14 +01:00
|
|
|
}
|
|
|
|
|
2023-02-09 23:34:25 +01:00
|
|
|
@Nullable T setAndGetPrevious(@Nullable T value);
|
2021-01-30 20:16:14 +01:00
|
|
|
|
2023-02-09 23:34:25 +01:00
|
|
|
default boolean setAndGetChanged(@Nullable T value) {
|
|
|
|
T oldValue = this.setAndGetPrevious(value);
|
|
|
|
if (oldValue != null) {
|
|
|
|
return !Objects.equals(oldValue, value);
|
|
|
|
} else {
|
|
|
|
return value != null;
|
|
|
|
}
|
2021-01-30 20:16:14 +01:00
|
|
|
}
|
|
|
|
|
2023-02-09 23:34:25 +01:00
|
|
|
default @Nullable T update(SerializationFunction<@Nullable T, @Nullable T> updater, UpdateReturnMode updateReturnMode) {
|
|
|
|
return LLUtils.resolveDelta(this.updateAndGetDelta(updater), updateReturnMode);
|
2021-05-08 03:09:00 +02:00
|
|
|
}
|
|
|
|
|
2023-02-09 23:34:25 +01:00
|
|
|
Delta<T> updateAndGetDelta(SerializationFunction<@Nullable T, @Nullable T> updater);
|
2021-02-06 19:21:31 +01:00
|
|
|
|
2023-02-09 23:34:25 +01:00
|
|
|
default void clear() {
|
|
|
|
clearAndGetStatus();
|
2021-01-30 20:16:14 +01:00
|
|
|
}
|
|
|
|
|
2023-02-09 23:34:25 +01:00
|
|
|
@Nullable T clearAndGetPrevious();
|
2021-01-30 20:16:14 +01:00
|
|
|
|
2023-02-09 23:34:25 +01:00
|
|
|
default boolean clearAndGetStatus() {
|
|
|
|
return clearAndGetPrevious() != null;
|
2021-01-30 20:16:14 +01:00
|
|
|
}
|
|
|
|
|
2021-02-24 16:43:07 +01:00
|
|
|
/**
|
|
|
|
* 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
|
|
|
|
*/
|
2023-02-09 23:34:25 +01:00
|
|
|
long leavesCount(@Nullable CompositeSnapshot snapshot, boolean fast);
|
2021-01-30 20:16:14 +01:00
|
|
|
|
2023-02-09 23:34:25 +01:00
|
|
|
default boolean isEmpty(@Nullable CompositeSnapshot snapshot) {
|
|
|
|
return leavesCount(snapshot, false) <= 0;
|
2021-01-30 20:16:14 +01:00
|
|
|
}
|
2021-06-26 02:35:33 +02:00
|
|
|
|
2023-02-09 23:34:25 +01:00
|
|
|
Stream<BadBlock> badBlocks();
|
2021-01-30 20:16:14 +01:00
|
|
|
}
|