From 8a831d5784b855c37eed7cbd8d90bfd0e601a06b Mon Sep 17 00:00:00 2001 From: Artyom Dubinin Date: Wed, 1 Jun 2022 20:34:21 +0300 Subject: [PATCH] Add StringValueToByteArray converter Closes #230 --- .../DefaultMessagePackMapperFactory.java | 2 ++ ...efaultStringValueToByteArrayConverter.java | 19 +++++++++++++++++++ .../ConvertersWithProxyClientIT.java | 19 +++++++++++++++++++ .../cartridge/app/roles/api_storage.lua | 14 ++++++++++++++ 4 files changed, 54 insertions(+) create mode 100644 src/main/java/io/tarantool/driver/mappers/converters/value/DefaultStringValueToByteArrayConverter.java diff --git a/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapperFactory.java b/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapperFactory.java index 0876656fc..7be920e9f 100644 --- a/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapperFactory.java +++ b/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapperFactory.java @@ -25,6 +25,7 @@ import io.tarantool.driver.mappers.converters.value.DefaultIntegerValueToDoubleConverter; import io.tarantool.driver.mappers.converters.value.DefaultIntegerValueToFloatConverter; import io.tarantool.driver.mappers.converters.value.DefaultIntegerValueToLongConverter; +import io.tarantool.driver.mappers.converters.value.DefaultStringValueToByteArrayConverter; import io.tarantool.driver.mappers.converters.value.DefaultStringValueToCharacterConverter; import io.tarantool.driver.mappers.converters.value.DefaultStringValueToStringConverter; import org.msgpack.value.BinaryValue; @@ -56,6 +57,7 @@ public final class DefaultMessagePackMapperFactory { private DefaultMessagePackMapperFactory() { defaultSimpleTypesMapper = new DefaultMessagePackMapper.Builder() // converters for primitive values + .withValueConverter(ValueType.STRING, byte[].class, new DefaultStringValueToByteArrayConverter()) .withValueConverter(ValueType.STRING, Character.class, new DefaultStringValueToCharacterConverter()) .withValueConverter(ValueType.STRING, String.class, new DefaultStringValueToStringConverter()) .withValueConverter(ValueType.INTEGER, Float.class, new DefaultIntegerValueToFloatConverter()) diff --git a/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultStringValueToByteArrayConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultStringValueToByteArrayConverter.java new file mode 100644 index 000000000..fec6e1617 --- /dev/null +++ b/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultStringValueToByteArrayConverter.java @@ -0,0 +1,19 @@ +package io.tarantool.driver.mappers.converters.value; + +import io.tarantool.driver.mappers.converters.ValueConverter; +import org.msgpack.value.StringValue; + +/** + * Default {@link StringValue} to {@code byte[]} converter + * + * @author Artyom Dubinin + */ +public class DefaultStringValueToByteArrayConverter implements ValueConverter { + + private static final long serialVersionUID = 20220601L; + + @Override + public byte[] fromValue(StringValue value) { + return value.asByteArray(); + } +} diff --git a/src/test/java/io/tarantool/driver/integration/ConvertersWithProxyClientIT.java b/src/test/java/io/tarantool/driver/integration/ConvertersWithProxyClientIT.java index a987b6386..f3c8113fa 100644 --- a/src/test/java/io/tarantool/driver/integration/ConvertersWithProxyClientIT.java +++ b/src/test/java/io/tarantool/driver/integration/ConvertersWithProxyClientIT.java @@ -66,4 +66,23 @@ public void test_crudOperations_shouldWorkWithVarbinary() throws Exception { List byteListFromTarantool = Arrays.asList(ArrayUtils.toObject(bytesFromTarantool)); Assertions.assertEquals(byteList, byteListFromTarantool); } + + @Test + public void test_crudOperations_shouldWorkWithBytesAsString() throws Exception { + //given + byte[] bytes = "hello".getBytes(StandardCharsets.UTF_8); + List byteList = Arrays.asList(ArrayUtils.toObject(bytes)); + client.space("space_with_string") + .insert(tupleFactory.create(1, bytes)).get(); + + //when + TarantoolTuple fields = client + .space("space_with_string") + .select(Conditions.equals("id", 1)).get().get(0); + + //then + byte[] bytesFromTarantool = fields.getByteArray("string_field"); + List byteListFromTarantool = Arrays.asList(ArrayUtils.toObject(bytesFromTarantool)); + Assertions.assertEquals(byteList, byteListFromTarantool); + } } diff --git a/src/test/resources/cartridge/app/roles/api_storage.lua b/src/test/resources/cartridge/app/roles/api_storage.lua index 57659aa53..abcbcc186 100644 --- a/src/test/resources/cartridge/app/roles/api_storage.lua +++ b/src/test/resources/cartridge/app/roles/api_storage.lua @@ -98,6 +98,20 @@ local function init_space() space_with_varbinary:create_index('id', { parts = { 'id' }, if_not_exists = true, }) space_with_varbinary:create_index('bucket_id', { parts = { 'bucket_id' }, unique = false, if_not_exists = true, }) end + local space_with_string = box.schema.space.create( + 'space_with_string', + { + format = { + { 'id', 'unsigned' }, + { 'string_field', 'string',}, + { 'bucket_id', 'unsigned' }, + }, + if_not_exists = true, + } + ) + + space_with_string:create_index('id', { parts = { 'id' }, if_not_exists = true, }) + space_with_string:create_index('bucket_id', { parts = { 'bucket_id' }, unique = false, if_not_exists = true, }) local instances_info = box.schema.space.create( 'instances_info',