diff --git a/src/main/java/it/cavallium/dbengine/database/collections/DatabaseSetDictionaryHashed.java b/src/main/java/it/cavallium/dbengine/database/collections/DatabaseSetDictionaryHashed.java index 8d8541e..71f4c05 100644 --- a/src/main/java/it/cavallium/dbengine/database/collections/DatabaseSetDictionaryHashed.java +++ b/src/main/java/it/cavallium/dbengine/database/collections/DatabaseSetDictionaryHashed.java @@ -32,7 +32,7 @@ public class DatabaseSetDictionaryHashed extends DatabaseMapDictionaryHas } public static DatabaseSetDictionaryHashed simple(LLDictionary dictionary, - SerializerFixedBinaryLength keySerializer, + Serializer keySerializer, Function keyHashFunction, SerializerFixedBinaryLength keyHashSerializer) { return new DatabaseSetDictionaryHashed<>(dictionary, @@ -45,7 +45,7 @@ public class DatabaseSetDictionaryHashed extends DatabaseMapDictionaryHas public static DatabaseSetDictionaryHashed tail(LLDictionary dictionary, byte[] prefixKey, - SerializerFixedBinaryLength keySuffixSerializer, + Serializer keySuffixSerializer, Function keyHashFunction, SerializerFixedBinaryLength keyHashSerializer) { return new DatabaseSetDictionaryHashed<>(dictionary, diff --git a/src/main/java/it/cavallium/dbengine/database/collections/SubStageGetterHashMap.java b/src/main/java/it/cavallium/dbengine/database/collections/SubStageGetterHashMap.java new file mode 100644 index 0000000..c261674 --- /dev/null +++ b/src/main/java/it/cavallium/dbengine/database/collections/SubStageGetterHashMap.java @@ -0,0 +1,79 @@ +package it.cavallium.dbengine.database.collections; + +import it.cavallium.dbengine.client.CompositeSnapshot; +import it.cavallium.dbengine.database.LLDictionary; +import it.cavallium.dbengine.database.serialization.Serializer; +import it.cavallium.dbengine.database.serialization.SerializerFixedBinaryLength; +import java.util.Map; +import java.util.function.Function; +import org.jetbrains.annotations.Nullable; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@SuppressWarnings("unused") +public class SubStageGetterHashMap implements + SubStageGetter, DatabaseMapDictionaryHashed> { + + private static final boolean assertsEnabled; + static { + boolean assertsEnabledTmp = false; + //noinspection AssertWithSideEffects + assert assertsEnabledTmp = true; + //noinspection ConstantConditions + assertsEnabled = assertsEnabledTmp; + } + + private final Serializer keySerializer; + private final Serializer valueSerializer; + private final Function keyHashFunction; + private final SerializerFixedBinaryLength keyHashSerializer; + + public SubStageGetterHashMap(Serializer keySerializer, + Serializer valueSerializer, + Function keyHashFunction, + SerializerFixedBinaryLength keyHashSerializer) { + this.keySerializer = keySerializer; + this.valueSerializer = valueSerializer; + this.keyHashFunction = keyHashFunction; + this.keyHashSerializer = keyHashSerializer; + } + + @Override + public Mono> subStage(LLDictionary dictionary, + @Nullable CompositeSnapshot snapshot, + byte[] prefixKey, + Flux debuggingKeyFlux) { + Mono> result = Mono.just(DatabaseMapDictionaryHashed.tail(dictionary, + prefixKey, + keySerializer, + valueSerializer, + keyHashFunction, + keyHashSerializer + )); + if (assertsEnabled) { + return checkKeyFluxConsistency(prefixKey, debuggingKeyFlux).then(result); + } else { + return result; + } + } + + @Override + public boolean isMultiKey() { + return true; + } + + @Override + public boolean needsDebuggingKeyFlux() { + return assertsEnabled; + } + + private Mono checkKeyFluxConsistency(byte[] prefixKey, Flux keyFlux) { + return keyFlux.doOnNext(key -> { + assert key.length == prefixKey.length + getKeyHashBinaryLength(); + }).then(); + } + + public int getKeyHashBinaryLength() { + return keyHashSerializer.getSerializedBinaryLength(); + } +} diff --git a/src/main/java/it/cavallium/dbengine/database/collections/SubStageGetterHashSet.java b/src/main/java/it/cavallium/dbengine/database/collections/SubStageGetterHashSet.java new file mode 100644 index 0000000..f3fbd5b --- /dev/null +++ b/src/main/java/it/cavallium/dbengine/database/collections/SubStageGetterHashSet.java @@ -0,0 +1,76 @@ +package it.cavallium.dbengine.database.collections; + +import it.cavallium.dbengine.client.CompositeSnapshot; +import it.cavallium.dbengine.database.LLDictionary; +import it.cavallium.dbengine.database.collections.DatabaseEmpty.Nothing; +import it.cavallium.dbengine.database.serialization.Serializer; +import it.cavallium.dbengine.database.serialization.SerializerFixedBinaryLength; +import java.util.Map; +import java.util.function.Function; +import org.jetbrains.annotations.Nullable; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@SuppressWarnings("unused") +public class SubStageGetterHashSet implements + SubStageGetter, DatabaseSetDictionaryHashed> { + + private static final boolean assertsEnabled; + static { + boolean assertsEnabledTmp = false; + //noinspection AssertWithSideEffects + assert assertsEnabledTmp = true; + //noinspection ConstantConditions + assertsEnabled = assertsEnabledTmp; + } + + private final Serializer keySerializer; + private final Function keyHashFunction; + private final SerializerFixedBinaryLength keyHashSerializer; + + public SubStageGetterHashSet(Serializer keySerializer, + Function keyHashFunction, + SerializerFixedBinaryLength keyHashSerializer) { + this.keySerializer = keySerializer; + this.keyHashFunction = keyHashFunction; + this.keyHashSerializer = keyHashSerializer; + } + + @Override + public Mono> subStage(LLDictionary dictionary, + @Nullable CompositeSnapshot snapshot, + byte[] prefixKey, + Flux debuggingKeyFlux) { + Mono> result = Mono.just(DatabaseSetDictionaryHashed.tail(dictionary, + prefixKey, + keySerializer, + keyHashFunction, + keyHashSerializer + )); + if (assertsEnabled) { + return checkKeyFluxConsistency(prefixKey, debuggingKeyFlux).then(result); + } else { + return result; + } + } + + @Override + public boolean isMultiKey() { + return true; + } + + @Override + public boolean needsDebuggingKeyFlux() { + return assertsEnabled; + } + + private Mono checkKeyFluxConsistency(byte[] prefixKey, Flux keyFlux) { + return keyFlux.doOnNext(key -> { + assert key.length == prefixKey.length + getKeyHashBinaryLength(); + }).then(); + } + + public int getKeyHashBinaryLength() { + return keyHashSerializer.getSerializedBinaryLength(); + } +}