CavalliumDBEngine/src/main/java/it/cavallium/dbengine/database/collections/ValueWithHashSerializer.java

51 lines
2.0 KiB
Java
Raw Normal View History

2021-05-08 03:09:00 +02:00
package it.cavallium.dbengine.database.collections;
2021-09-04 02:19:10 +02:00
import io.netty5.buffer.api.Buffer;
import io.netty5.buffer.api.BufferAllocator;
import io.netty5.buffer.api.Send;
2021-05-08 03:09:00 +02:00
import it.cavallium.dbengine.database.LLUtils;
2021-08-22 21:23:22 +02:00
import it.cavallium.dbengine.database.serialization.SerializationException;
2021-05-08 03:09:00 +02:00
import it.cavallium.dbengine.database.serialization.Serializer;
import java.util.Map;
import java.util.Map.Entry;
import org.jetbrains.annotations.NotNull;
2021-09-01 00:01:56 +02:00
class ValueWithHashSerializer<X, Y> implements Serializer<Entry<X, Y>> {
2021-05-08 03:09:00 +02:00
2021-08-29 23:18:03 +02:00
private final BufferAllocator allocator;
2021-09-01 00:01:56 +02:00
private final Serializer<X> keySuffixSerializer;
private final Serializer<Y> valueSerializer;
2021-05-08 03:09:00 +02:00
2021-08-29 23:18:03 +02:00
ValueWithHashSerializer(BufferAllocator allocator,
2021-09-01 00:01:56 +02:00
Serializer<X> keySuffixSerializer,
Serializer<Y> valueSerializer) {
2021-05-08 03:09:00 +02:00
this.allocator = allocator;
this.keySuffixSerializer = keySuffixSerializer;
this.valueSerializer = valueSerializer;
}
@Override
2021-09-01 00:01:56 +02:00
public @NotNull DeserializationResult<Entry<X, Y>> deserialize(@NotNull Send<Buffer> serializedToReceive)
throws SerializationException {
2021-08-29 23:18:03 +02:00
try (var serialized = serializedToReceive.receive()) {
2021-09-01 00:01:56 +02:00
DeserializationResult<X> deserializedKey = keySuffixSerializer.deserialize(serialized.copy().send());
2021-09-02 17:15:40 +02:00
DeserializationResult<Y> deserializedValue = valueSerializer.deserialize(serialized
.copy(serialized.readerOffset() + deserializedKey.bytesRead(),
serialized.readableBytes() - deserializedKey.bytesRead()
)
.send());
2021-09-01 00:01:56 +02:00
return new DeserializationResult<>(Map.entry(deserializedKey.deserializedData(),
deserializedValue.deserializedData()), deserializedKey.bytesRead() + deserializedValue.bytesRead());
2021-05-08 03:09:00 +02:00
}
}
@Override
2021-08-29 23:18:03 +02:00
public @NotNull Send<Buffer> serialize(@NotNull Entry<X, Y> deserialized) throws SerializationException {
try (Buffer keySuffix = keySuffixSerializer.serialize(deserialized.getKey()).receive()) {
try (Buffer value = valueSerializer.serialize(deserialized.getValue()).receive()) {
return LLUtils.compositeBuffer(allocator, keySuffix.send(), value.send());
2021-05-08 03:09:00 +02:00
}
}
}
}