2021-05-08 03:09:00 +02:00
|
|
|
package it.cavallium.dbengine.database.collections;
|
|
|
|
|
2021-09-17 16:56:28 +02:00
|
|
|
import io.net5.buffer.api.Buffer;
|
|
|
|
import io.net5.buffer.api.BufferAllocator;
|
2021-09-23 02:15:58 +02:00
|
|
|
import io.net5.buffer.api.CompositeBuffer;
|
2021-09-17 16:56:28 +02:00
|
|
|
import io.net5.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;
|
2021-09-22 18:33:28 +02:00
|
|
|
import java.util.Objects;
|
2021-05-08 03:09:00 +02:00
|
|
|
import org.jetbrains.annotations.NotNull;
|
2021-09-22 18:33:28 +02:00
|
|
|
import org.jetbrains.annotations.Nullable;
|
2021-05-08 03:09:00 +02:00
|
|
|
|
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-22 18:33:28 +02:00
|
|
|
public @NotNull DeserializationResult<Entry<X, Y>> deserialize(@Nullable Send<Buffer> serializedToReceive)
|
2021-09-01 00:01:56 +02:00
|
|
|
throws SerializationException {
|
2021-09-22 18:33:28 +02:00
|
|
|
Objects.requireNonNull(serializedToReceive);
|
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-09-23 02:15:58 +02:00
|
|
|
public @NotNull Send<Buffer> serialize(@NotNull Entry<X, Y> deserialized) throws SerializationException {
|
2021-09-22 18:33:28 +02:00
|
|
|
var keySuffix = keySuffixSerializer.serialize(deserialized.getKey());
|
|
|
|
var value = valueSerializer.serialize(deserialized.getValue());
|
2021-09-23 02:15:58 +02:00
|
|
|
return LLUtils.compositeBuffer(allocator, keySuffix, value).send();
|
2021-05-08 03:09:00 +02:00
|
|
|
}
|
|
|
|
}
|