From 2fa599d2cf21edb871b461bd82e4a8de4cae426a Mon Sep 17 00:00:00 2001 From: aromanova Date: Sat, 22 Oct 2022 13:54:48 +0300 Subject: [PATCH 01/12] long array mapper --- .../DefaultMessagePackMapperFactory.java | 48 ++++--------------- ...DefaultLongArrayToArrayValueConverter.java | 24 ++++++++++ ...DefaultArrayValueToLongArrayConverter.java | 27 +++++++++++ 3 files changed, 59 insertions(+), 40 deletions(-) create mode 100644 src/main/java/io/tarantool/driver/mappers/converters/object/DefaultLongArrayToArrayValueConverter.java create mode 100644 src/main/java/io/tarantool/driver/mappers/converters/value/DefaultArrayValueToLongArrayConverter.java diff --git a/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapperFactory.java b/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapperFactory.java index bd021542..343d5355 100644 --- a/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapperFactory.java +++ b/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapperFactory.java @@ -1,42 +1,8 @@ package io.tarantool.driver.mappers; -import io.tarantool.driver.mappers.converters.object.DefaultNilValueToNullConverter; -import io.tarantool.driver.mappers.converters.object.DefaultBigDecimalToExtensionValueConverter; -import io.tarantool.driver.mappers.converters.object.DefaultBooleanToBooleanValueConverter; -import io.tarantool.driver.mappers.converters.object.DefaultByteArrayToBinaryValueConverter; -import io.tarantool.driver.mappers.converters.object.DefaultCharacterToStringValueConverter; -import io.tarantool.driver.mappers.converters.object.DefaultDoubleToFloatValueConverter; -import io.tarantool.driver.mappers.converters.object.DefaultFloatToFloatValueConverter; -import io.tarantool.driver.mappers.converters.object.DefaultIntegerToIntegerValueConverter; -import io.tarantool.driver.mappers.converters.object.DefaultLongToIntegerValueConverter; -import io.tarantool.driver.mappers.converters.object.DefaultPackableObjectConverter; -import io.tarantool.driver.mappers.converters.object.DefaultShortToIntegerValueConverter; -import io.tarantool.driver.mappers.converters.object.DefaultStringToStringValueConverter; -import io.tarantool.driver.mappers.converters.object.DefaultUUIDToExtensionValueConverter; -import io.tarantool.driver.mappers.converters.value.DefaultBinaryValueToByteArrayConverter; -import io.tarantool.driver.mappers.converters.value.DefaultBooleanValueToBooleanConverter; -import io.tarantool.driver.mappers.converters.value.DefaultExtensionValueToBigDecimalConverter; -import io.tarantool.driver.mappers.converters.value.DefaultExtensionValueToUUIDConverter; -import io.tarantool.driver.mappers.converters.value.DefaultFloatValueToDoubleConverter; -import io.tarantool.driver.mappers.converters.value.DefaultFloatValueToFloatConverter; -import io.tarantool.driver.mappers.converters.value.DefaultFloatValueToIntegerConverter; -import io.tarantool.driver.mappers.converters.value.DefaultFloatValueToLongConverter; -import io.tarantool.driver.mappers.converters.value.DefaultFloatValueToShortConverter; -import io.tarantool.driver.mappers.converters.value.DefaultIntegerValueToIntegerConverter; -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.DefaultIntegerValueToShortConverter; -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; -import org.msgpack.value.BooleanValue; -import org.msgpack.value.ExtensionValue; -import org.msgpack.value.FloatValue; -import org.msgpack.value.IntegerValue; -import org.msgpack.value.StringValue; -import org.msgpack.value.ValueType; +import io.tarantool.driver.mappers.converters.object.*; +import io.tarantool.driver.mappers.converters.value.*; +import org.msgpack.value.*; import java.math.BigDecimal; import java.util.UUID; @@ -62,12 +28,12 @@ private DefaultMessagePackMapperFactory() { .withValueConverter(ValueType.STRING, byte[].class, new DefaultStringValueToByteArrayConverter()) .withValueConverter(ValueType.STRING, Character.class, new DefaultStringValueToCharacterConverter()) .withValueConverter(ValueType.STRING, String.class, new DefaultStringValueToStringConverter()) - .withValueConverter(ValueType.INTEGER, Short.class, new DefaultIntegerValueToShortConverter()) .withValueConverter(ValueType.INTEGER, Float.class, new DefaultIntegerValueToFloatConverter()) .withValueConverter(ValueType.INTEGER, Double.class, new DefaultIntegerValueToDoubleConverter()) .withValueConverter(ValueType.INTEGER, Long.class, new DefaultIntegerValueToLongConverter()) .withValueConverter(ValueType.INTEGER, Integer.class, new DefaultIntegerValueToIntegerConverter()) .withValueConverter(ValueType.BINARY, byte[].class, new DefaultBinaryValueToByteArrayConverter()) + .withValueConverter(ValueType.ARRAY, long[].class, new DefaultArrayValueToLongArrayConverter()) .withValueConverter(ValueType.BOOLEAN, Boolean.class, new DefaultBooleanValueToBooleanConverter()) .withValueConverter(ValueType.FLOAT, Short.class, new DefaultFloatValueToShortConverter()) .withValueConverter(ValueType.FLOAT, Long.class, new DefaultFloatValueToLongConverter()) @@ -78,13 +44,15 @@ private DefaultMessagePackMapperFactory() { .withValueConverter(ValueType.EXTENSION, BigDecimal.class, new DefaultExtensionValueToBigDecimalConverter()) .withValueConverter(ValueType.NIL, Object.class, new DefaultNilValueToNullConverter()) - //TODO: Potential issue https://github.com/tarantool/cartridge-java/issues/118 + //TODO: add this when will it be resolved https://github.com/tarantool/cartridge-java/issues/118 + // .withValueConverter(ValueType.INTEGER, Short.class, new DefaultIntegerValueToShortConverter()) + // .withObjectConverter(Short.class, new DefaultShortToIntegerObjectConverter()) .withObjectConverter(Character.class, StringValue.class, new DefaultCharacterToStringValueConverter()) .withObjectConverter(String.class, StringValue.class, new DefaultStringToStringValueConverter()) .withObjectConverter(Long.class, IntegerValue.class, new DefaultLongToIntegerValueConverter()) - .withObjectConverter(Short.class, IntegerValue.class, new DefaultShortToIntegerValueConverter()) .withObjectConverter(Integer.class, IntegerValue.class, new DefaultIntegerToIntegerValueConverter()) .withObjectConverter(byte[].class, BinaryValue.class, new DefaultByteArrayToBinaryValueConverter()) + .withObjectConverter(long[].class, ArrayValue.class, new DefaultLongArrayToArrayValueConverter()) .withObjectConverter(Boolean.class, BooleanValue.class, new DefaultBooleanToBooleanValueConverter()) .withObjectConverter(Float.class, FloatValue.class, new DefaultFloatToFloatValueConverter()) .withObjectConverter(Double.class, FloatValue.class, new DefaultDoubleToFloatValueConverter()) diff --git a/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultLongArrayToArrayValueConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultLongArrayToArrayValueConverter.java new file mode 100644 index 00000000..436a73f1 --- /dev/null +++ b/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultLongArrayToArrayValueConverter.java @@ -0,0 +1,24 @@ +package io.tarantool.driver.mappers.converters.object; + +import io.tarantool.driver.mappers.converters.ObjectConverter; +import org.msgpack.value.ArrayValue; +import org.msgpack.value.Value; +import org.msgpack.value.ValueFactory; +import org.msgpack.value.impl.ImmutableLongValueImpl; + +import java.util.Arrays; + +/** + * Default {@code long[]} to {@link ArrayValue} converter + */ +public class DefaultLongArrayToArrayValueConverter implements ObjectConverter { + + @Override + public ArrayValue toValue(long[] object) { + return ValueFactory.newArray(toNumberValue(object), true); + } + + private Value[] toNumberValue(long[] object) { + return Arrays.stream(object).mapToObj(ImmutableLongValueImpl::new).toArray(Value[]::new); + } +} diff --git a/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultArrayValueToLongArrayConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultArrayValueToLongArrayConverter.java new file mode 100644 index 00000000..3991ddc0 --- /dev/null +++ b/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultArrayValueToLongArrayConverter.java @@ -0,0 +1,27 @@ +package io.tarantool.driver.mappers.converters.value; + +import io.tarantool.driver.mappers.converters.ValueConverter; +import org.msgpack.value.ArrayValue; +import org.msgpack.value.Value; + +/** + * Default {@link ArrayValue} to {@code long[]} converter + * + */ +public class DefaultArrayValueToLongArrayConverter implements ValueConverter { + + @Override + public long[] fromValue(ArrayValue value) { + long[] values = new long[value.size()]; + for (int i = 0; i < value.size(); i++) { + values[i] = value.list().get(i).asNumberValue().toLong(); + } + return values; + } + + @Override + public boolean canConvertValue(ArrayValue value) { + return value.list().stream().allMatch(Value::isNumberValue); + } + +} From 952a1fdad4910d7597e97eea74b74b2e9bca8406 Mon Sep 17 00:00:00 2001 From: aromanova Date: Mon, 24 Oct 2022 12:35:43 +0300 Subject: [PATCH 02/12] long array mapper fix & test --- .../DefaultMessagePackMapperFactory.java | 49 ++++++++++++++++--- ...DefaultLongArrayToArrayValueConverter.java | 4 +- ...DefaultArrayValueToLongArrayConverter.java | 5 +- .../DefaultLongArrayConverterTest.java | 47 ++++++++++++++++++ 4 files changed, 96 insertions(+), 9 deletions(-) create mode 100644 src/test/java/io/tarantool/driver/mappers/DefaultLongArrayConverterTest.java diff --git a/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapperFactory.java b/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapperFactory.java index 343d5355..22f7cb75 100644 --- a/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapperFactory.java +++ b/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapperFactory.java @@ -1,8 +1,45 @@ package io.tarantool.driver.mappers; -import io.tarantool.driver.mappers.converters.object.*; -import io.tarantool.driver.mappers.converters.value.*; -import org.msgpack.value.*; +import io.tarantool.driver.mappers.converters.object.DefaultNilValueToNullConverter; +import io.tarantool.driver.mappers.converters.object.DefaultBigDecimalToExtensionValueConverter; +import io.tarantool.driver.mappers.converters.object.DefaultLongArrayToArrayValueConverter; +import io.tarantool.driver.mappers.converters.object.DefaultBooleanToBooleanValueConverter; +import io.tarantool.driver.mappers.converters.object.DefaultByteArrayToBinaryValueConverter; +import io.tarantool.driver.mappers.converters.object.DefaultCharacterToStringValueConverter; +import io.tarantool.driver.mappers.converters.object.DefaultDoubleToFloatValueConverter; +import io.tarantool.driver.mappers.converters.object.DefaultFloatToFloatValueConverter; +import io.tarantool.driver.mappers.converters.object.DefaultIntegerToIntegerValueConverter; +import io.tarantool.driver.mappers.converters.object.DefaultLongToIntegerValueConverter; +import io.tarantool.driver.mappers.converters.object.DefaultPackableObjectConverter; +import io.tarantool.driver.mappers.converters.object.DefaultShortToIntegerValueConverter; +import io.tarantool.driver.mappers.converters.object.DefaultStringToStringValueConverter; +import io.tarantool.driver.mappers.converters.object.DefaultUUIDToExtensionValueConverter; +import io.tarantool.driver.mappers.converters.value.DefaultArrayValueToLongArrayConverter; +import io.tarantool.driver.mappers.converters.value.DefaultBinaryValueToByteArrayConverter; +import io.tarantool.driver.mappers.converters.value.DefaultBooleanValueToBooleanConverter; +import io.tarantool.driver.mappers.converters.value.DefaultExtensionValueToBigDecimalConverter; +import io.tarantool.driver.mappers.converters.value.DefaultExtensionValueToUUIDConverter; +import io.tarantool.driver.mappers.converters.value.DefaultFloatValueToDoubleConverter; +import io.tarantool.driver.mappers.converters.value.DefaultFloatValueToFloatConverter; +import io.tarantool.driver.mappers.converters.value.DefaultFloatValueToIntegerConverter; +import io.tarantool.driver.mappers.converters.value.DefaultFloatValueToLongConverter; +import io.tarantool.driver.mappers.converters.value.DefaultFloatValueToShortConverter; +import io.tarantool.driver.mappers.converters.value.DefaultIntegerValueToIntegerConverter; +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.DefaultIntegerValueToShortConverter; +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.ArrayValue; +import org.msgpack.value.BinaryValue; +import org.msgpack.value.BooleanValue; +import org.msgpack.value.ExtensionValue; +import org.msgpack.value.FloatValue; +import org.msgpack.value.IntegerValue; +import org.msgpack.value.StringValue; +import org.msgpack.value.ValueType; import java.math.BigDecimal; import java.util.UUID; @@ -28,6 +65,7 @@ private DefaultMessagePackMapperFactory() { .withValueConverter(ValueType.STRING, byte[].class, new DefaultStringValueToByteArrayConverter()) .withValueConverter(ValueType.STRING, Character.class, new DefaultStringValueToCharacterConverter()) .withValueConverter(ValueType.STRING, String.class, new DefaultStringValueToStringConverter()) + .withValueConverter(ValueType.INTEGER, Short.class, new DefaultIntegerValueToShortConverter()) .withValueConverter(ValueType.INTEGER, Float.class, new DefaultIntegerValueToFloatConverter()) .withValueConverter(ValueType.INTEGER, Double.class, new DefaultIntegerValueToDoubleConverter()) .withValueConverter(ValueType.INTEGER, Long.class, new DefaultIntegerValueToLongConverter()) @@ -44,12 +82,11 @@ private DefaultMessagePackMapperFactory() { .withValueConverter(ValueType.EXTENSION, BigDecimal.class, new DefaultExtensionValueToBigDecimalConverter()) .withValueConverter(ValueType.NIL, Object.class, new DefaultNilValueToNullConverter()) - //TODO: add this when will it be resolved https://github.com/tarantool/cartridge-java/issues/118 - // .withValueConverter(ValueType.INTEGER, Short.class, new DefaultIntegerValueToShortConverter()) - // .withObjectConverter(Short.class, new DefaultShortToIntegerObjectConverter()) + //TODO: Potential issue https://github.com/tarantool/cartridge-java/issues/118 .withObjectConverter(Character.class, StringValue.class, new DefaultCharacterToStringValueConverter()) .withObjectConverter(String.class, StringValue.class, new DefaultStringToStringValueConverter()) .withObjectConverter(Long.class, IntegerValue.class, new DefaultLongToIntegerValueConverter()) + .withObjectConverter(Short.class, IntegerValue.class, new DefaultShortToIntegerValueConverter()) .withObjectConverter(Integer.class, IntegerValue.class, new DefaultIntegerToIntegerValueConverter()) .withObjectConverter(byte[].class, BinaryValue.class, new DefaultByteArrayToBinaryValueConverter()) .withObjectConverter(long[].class, ArrayValue.class, new DefaultLongArrayToArrayValueConverter()) diff --git a/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultLongArrayToArrayValueConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultLongArrayToArrayValueConverter.java index 436a73f1..1db51cfb 100644 --- a/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultLongArrayToArrayValueConverter.java +++ b/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultLongArrayToArrayValueConverter.java @@ -15,10 +15,10 @@ public class DefaultLongArrayToArrayValueConverter implements ObjectConverter Date: Tue, 25 Oct 2022 11:18:39 +0300 Subject: [PATCH 03/12] fix & test message pack --- ...DefaultLongArrayToArrayValueConverter.java | 2 ++ ...DefaultArrayValueToLongArrayConverter.java | 7 ++++-- .../DefaultLongArrayConverterTest.java | 22 ++++++++++++---- .../mappers/DefaultMessagePackMapperTest.java | 25 +++++++++++++++++++ 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultLongArrayToArrayValueConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultLongArrayToArrayValueConverter.java index 1db51cfb..1d449552 100644 --- a/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultLongArrayToArrayValueConverter.java +++ b/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultLongArrayToArrayValueConverter.java @@ -10,6 +10,8 @@ /** * Default {@code long[]} to {@link ArrayValue} converter + * + * @author Anastasiia Romanova */ public class DefaultLongArrayToArrayValueConverter implements ObjectConverter { diff --git a/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultArrayValueToLongArrayConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultArrayValueToLongArrayConverter.java index a91e9d7b..a140da40 100644 --- a/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultArrayValueToLongArrayConverter.java +++ b/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultArrayValueToLongArrayConverter.java @@ -2,11 +2,11 @@ import io.tarantool.driver.mappers.converters.ValueConverter; import org.msgpack.value.ArrayValue; -import org.msgpack.value.Value; /** * Default {@link ArrayValue} to {@code long[]} converter * + * @author Anastasiia Romanova */ public class DefaultArrayValueToLongArrayConverter implements ValueConverter { @@ -22,7 +22,10 @@ public long[] fromValue(ArrayValue value) { @Override public boolean canConvertValue(ArrayValue value) { if (value != null) { - return value.list().stream().allMatch(Value::isNumberValue); + if (value.size() > 0) { + return value.get(0).isNumberValue(); + } + return true; } return false; } diff --git a/src/test/java/io/tarantool/driver/mappers/DefaultLongArrayConverterTest.java b/src/test/java/io/tarantool/driver/mappers/DefaultLongArrayConverterTest.java index dc8159ae..82c861a8 100644 --- a/src/test/java/io/tarantool/driver/mappers/DefaultLongArrayConverterTest.java +++ b/src/test/java/io/tarantool/driver/mappers/DefaultLongArrayConverterTest.java @@ -3,13 +3,18 @@ import io.tarantool.driver.mappers.converters.object.DefaultLongArrayToArrayValueConverter; import io.tarantool.driver.mappers.converters.value.DefaultArrayValueToLongArrayConverter; import org.junit.jupiter.api.Test; +import org.msgpack.core.MessageTypeCastException; import org.msgpack.value.ArrayValue; import org.msgpack.value.ImmutableArrayValue; import org.msgpack.value.ValueFactory; import org.msgpack.value.impl.ImmutableLongValueImpl; import org.msgpack.value.impl.ImmutableStringValueImpl; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class DefaultLongArrayConverterTest { @@ -22,7 +27,7 @@ void should_fromValue_returnLongArrayValue() { long[] longs = converter.fromValue(arrayValue); assertEquals(3, longs.length); - assertEquals(1L, longs[0]); + assertArrayEquals(new long[]{1L, 2L, 3L}, longs); } @Test @@ -32,9 +37,16 @@ void should_returnFalse_ifArrayValueIsString() { ImmutableArrayValue arrayValue = ValueFactory.newArray(ValueFactory.newString("notLong")); assertFalse(converter.canConvertValue(arrayValue)); + } - arrayValue = ValueFactory.newArray(new ImmutableLongValueImpl(2L), new ImmutableStringValueImpl("string"), new ImmutableLongValueImpl(3L)); - assertFalse(converter.canConvertValue(arrayValue)); + @Test + void should_throwException_ifArrayValueContainsNotFirstString() { + DefaultArrayValueToLongArrayConverter converter = new DefaultArrayValueToLongArrayConverter(); + + ImmutableArrayValue arrayValue = ValueFactory.newArray(new ImmutableLongValueImpl(2L), new ImmutableStringValueImpl("string"), new ImmutableLongValueImpl(3L)); + assertTrue(converter.canConvertValue(arrayValue)); + + assertThrows(MessageTypeCastException.class, () -> converter.fromValue(arrayValue)); } @Test @@ -42,6 +54,6 @@ void should_fromLongArray_returnArrayValue() { DefaultLongArrayToArrayValueConverter converter = new DefaultLongArrayToArrayValueConverter(); ArrayValue result = converter.toValue(new long[]{1L, 2L, 3L}); - assertEquals(ValueFactory.newArray(new ImmutableLongValueImpl(1L), new ImmutableLongValueImpl(2L),new ImmutableLongValueImpl(3L)), result); + assertEquals(ValueFactory.newArray(new ImmutableLongValueImpl(1L), new ImmutableLongValueImpl(2L), new ImmutableLongValueImpl(3L)), result); } } diff --git a/src/test/java/io/tarantool/driver/mappers/DefaultMessagePackMapperTest.java b/src/test/java/io/tarantool/driver/mappers/DefaultMessagePackMapperTest.java index f28b32d4..a8462cf7 100644 --- a/src/test/java/io/tarantool/driver/mappers/DefaultMessagePackMapperTest.java +++ b/src/test/java/io/tarantool/driver/mappers/DefaultMessagePackMapperTest.java @@ -6,11 +6,14 @@ import io.tarantool.driver.api.tuple.TarantoolTuple; import io.tarantool.driver.mappers.converters.ValueConverter; import org.junit.jupiter.api.Test; +import org.msgpack.core.MessageTypeCastException; import org.msgpack.value.ArrayValue; import org.msgpack.value.MapValue; import org.msgpack.value.Value; import org.msgpack.value.ValueFactory; import org.msgpack.value.ValueType; +import org.msgpack.value.impl.ImmutableLongValueImpl; +import org.msgpack.value.impl.ImmutableStringValueImpl; import java.math.BigDecimal; import java.util.Arrays; @@ -86,6 +89,10 @@ void testDefaultComplexConverters() { ArrayValue expectedValue = ValueFactory.newArray( ValueFactory.newString("Hello"), ValueFactory.newInteger(111)); assertEquals(expectedValue, mapper.toValue(testList)); + + expectedValue = ValueFactory.newArray(new ImmutableLongValueImpl(1L), new ImmutableLongValueImpl(2L)); + assertEquals(expectedValue, mapper.toValue(new long[]{1L, 2L})); + Map testMap = new HashMap<>(); testMap.put(1, "Hello"); testMap.put(2, "World"); @@ -99,6 +106,10 @@ void testDefaultComplexConverters() { ValueFactory.newArray(ValueFactory.newString("Hello"), ValueFactory.newInteger(111)); List expectedList = Arrays.asList("Hello", 111); assertEquals(expectedList, mapper.fromValue(testValue)); + + long[] expectedArray = mapper.fromValue(ValueFactory.newArray(new ImmutableLongValueImpl(4_000_000_000_000L)), long[].class); + assertArrayEquals(new long[]{ 4_000_000_000_000L }, expectedArray); + Map testMap1 = new HashMap<>(); expectedMap.put(ValueFactory.newInteger(1), ValueFactory.newString("Hello")); expectedMap.put(ValueFactory.newInteger(2), ValueFactory.newString("World")); @@ -235,4 +246,18 @@ void should_getObject_throwUnsupportedOperationException_ifValueGreaterThanInteg assertThrows(MessagePackValueMapperException.class, () -> tuple.getObject(0, Integer.class).get()); } + + @Test + void should_getObject_returnLongArray() { + TarantoolTuple tuple = tupleFactory.create(ValueFactory.newArray(new ImmutableLongValueImpl(4_000_000_000_000L))); + + assertEquals(long[].class, tuple.getObject(0, long[].class).get().getClass()); + assertEquals(4_000_000_000_000L, tuple.getObject(0, long[].class).get()[0]); + } + + @Test + void should_getObject_throwMessageTypeCastException_ifArrayValue_ContainsNotLong() { + TarantoolTuple tuple = tupleFactory.create(ValueFactory.newArray(new ImmutableLongValueImpl(1L), new ImmutableStringValueImpl("notLong"))); + assertThrows(MessageTypeCastException.class, () -> tuple.getObject(0, long[].class).get()); + } } From 2ccce356fd1fd9ccce21c90ef7fc05dcd58044bd Mon Sep 17 00:00:00 2001 From: aromanova Date: Wed, 26 Oct 2022 11:03:33 +0300 Subject: [PATCH 04/12] add serialVersion, changelog --- CHANGELOG.md | 2 ++ .../DefaultLongArrayToArrayValueConverter.java | 1 + .../value/DefaultArrayValueToLongArrayConverter.java | 1 + .../mappers/DefaultLongArrayConverterTest.java | 12 ++++++++---- .../driver/mappers/DefaultMessagePackMapperTest.java | 12 ++++++++---- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c30b283a..40f974dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## [Unreleased] +- Adding default mapper for long arrays ([#290](https://github.com/tarantool/cartridge-java/pull/290)) + ## [0.9.1] - 2022-10-13 - Changed TarantoolNullField class to singleton ([#195](https://github.com/tarantool/cartridge-java/pull/275)) diff --git a/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultLongArrayToArrayValueConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultLongArrayToArrayValueConverter.java index 1d449552..9115ca6d 100644 --- a/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultLongArrayToArrayValueConverter.java +++ b/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultLongArrayToArrayValueConverter.java @@ -15,6 +15,7 @@ */ public class DefaultLongArrayToArrayValueConverter implements ObjectConverter { + private static final long serialVersionUID = 20221022L; @Override public ArrayValue toValue(long[] object) { return ValueFactory.newArray(toNumberValueArray(object), true); diff --git a/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultArrayValueToLongArrayConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultArrayValueToLongArrayConverter.java index a140da40..1883db07 100644 --- a/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultArrayValueToLongArrayConverter.java +++ b/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultArrayValueToLongArrayConverter.java @@ -10,6 +10,7 @@ */ public class DefaultArrayValueToLongArrayConverter implements ValueConverter { + private static final long serialVersionUID = 20221022L; @Override public long[] fromValue(ArrayValue value) { long[] values = new long[value.size()]; diff --git a/src/test/java/io/tarantool/driver/mappers/DefaultLongArrayConverterTest.java b/src/test/java/io/tarantool/driver/mappers/DefaultLongArrayConverterTest.java index 82c861a8..a2905dbb 100644 --- a/src/test/java/io/tarantool/driver/mappers/DefaultLongArrayConverterTest.java +++ b/src/test/java/io/tarantool/driver/mappers/DefaultLongArrayConverterTest.java @@ -22,7 +22,9 @@ class DefaultLongArrayConverterTest { void should_fromValue_returnLongArrayValue() { DefaultArrayValueToLongArrayConverter converter = new DefaultArrayValueToLongArrayConverter(); - ImmutableArrayValue arrayValue = ValueFactory.newArray(new ImmutableLongValueImpl(1L), new ImmutableLongValueImpl(2L), new ImmutableLongValueImpl(3L)); + ImmutableArrayValue arrayValue = ValueFactory.newArray( + new ImmutableLongValueImpl(1L), new ImmutableLongValueImpl(2L), new ImmutableLongValueImpl(3L) + ); assertTrue(converter.canConvertValue(arrayValue)); long[] longs = converter.fromValue(arrayValue); @@ -43,7 +45,9 @@ void should_returnFalse_ifArrayValueIsString() { void should_throwException_ifArrayValueContainsNotFirstString() { DefaultArrayValueToLongArrayConverter converter = new DefaultArrayValueToLongArrayConverter(); - ImmutableArrayValue arrayValue = ValueFactory.newArray(new ImmutableLongValueImpl(2L), new ImmutableStringValueImpl("string"), new ImmutableLongValueImpl(3L)); + ImmutableArrayValue arrayValue = ValueFactory.newArray( + new ImmutableLongValueImpl(2L), new ImmutableStringValueImpl("string"), new ImmutableLongValueImpl(3L) + ); assertTrue(converter.canConvertValue(arrayValue)); assertThrows(MessageTypeCastException.class, () -> converter.fromValue(arrayValue)); @@ -53,7 +57,7 @@ void should_throwException_ifArrayValueContainsNotFirstString() { void should_fromLongArray_returnArrayValue() { DefaultLongArrayToArrayValueConverter converter = new DefaultLongArrayToArrayValueConverter(); - ArrayValue result = converter.toValue(new long[]{1L, 2L, 3L}); - assertEquals(ValueFactory.newArray(new ImmutableLongValueImpl(1L), new ImmutableLongValueImpl(2L), new ImmutableLongValueImpl(3L)), result); + ArrayValue result = converter.toValue(new long[]{1L, 2L}); + assertEquals(ValueFactory.newArray(new ImmutableLongValueImpl(1L), new ImmutableLongValueImpl(2L)), result); } } diff --git a/src/test/java/io/tarantool/driver/mappers/DefaultMessagePackMapperTest.java b/src/test/java/io/tarantool/driver/mappers/DefaultMessagePackMapperTest.java index a8462cf7..be790559 100644 --- a/src/test/java/io/tarantool/driver/mappers/DefaultMessagePackMapperTest.java +++ b/src/test/java/io/tarantool/driver/mappers/DefaultMessagePackMapperTest.java @@ -107,7 +107,8 @@ void testDefaultComplexConverters() { List expectedList = Arrays.asList("Hello", 111); assertEquals(expectedList, mapper.fromValue(testValue)); - long[] expectedArray = mapper.fromValue(ValueFactory.newArray(new ImmutableLongValueImpl(4_000_000_000_000L)), long[].class); + long[] expectedArray = + mapper.fromValue(ValueFactory.newArray(new ImmutableLongValueImpl(4_000_000_000_000L)), long[].class); assertArrayEquals(new long[]{ 4_000_000_000_000L }, expectedArray); Map testMap1 = new HashMap<>(); @@ -249,15 +250,18 @@ void should_getObject_throwUnsupportedOperationException_ifValueGreaterThanInteg @Test void should_getObject_returnLongArray() { - TarantoolTuple tuple = tupleFactory.create(ValueFactory.newArray(new ImmutableLongValueImpl(4_000_000_000_000L))); - + TarantoolTuple tuple = tupleFactory.create( + ValueFactory.newArray(new ImmutableLongValueImpl(4_000_000_000_000L)) + ); assertEquals(long[].class, tuple.getObject(0, long[].class).get().getClass()); assertEquals(4_000_000_000_000L, tuple.getObject(0, long[].class).get()[0]); } @Test void should_getObject_throwMessageTypeCastException_ifArrayValue_ContainsNotLong() { - TarantoolTuple tuple = tupleFactory.create(ValueFactory.newArray(new ImmutableLongValueImpl(1L), new ImmutableStringValueImpl("notLong"))); + TarantoolTuple tuple = tupleFactory.create(ValueFactory.newArray( + new ImmutableLongValueImpl(1L), new ImmutableStringValueImpl("notLong") + )); assertThrows(MessageTypeCastException.class, () -> tuple.getObject(0, long[].class).get()); } } From d2e67abd3871d789e6c52992e282d4a89c8ef1a2 Mon Sep 17 00:00:00 2001 From: aromanova Date: Tue, 25 Oct 2022 15:32:36 +0300 Subject: [PATCH 05/12] instant coverter --- .../DefaultMessagePackMapperFactory.java | 5 ++ ...faultInstantToExtensionValueConverter.java | 31 ++++++++++ ...faultExtensionValueToInstantConverter.java | 31 ++++++++++ .../mappers/DefaultInstantConverterTest.java | 56 +++++++++++++++++++ 4 files changed, 123 insertions(+) create mode 100644 src/main/java/io/tarantool/driver/mappers/converters/object/DefaultInstantToExtensionValueConverter.java create mode 100644 src/main/java/io/tarantool/driver/mappers/converters/value/DefaultExtensionValueToInstantConverter.java create mode 100644 src/test/java/io/tarantool/driver/mappers/DefaultInstantConverterTest.java diff --git a/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapperFactory.java b/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapperFactory.java index 22f7cb75..bcfa2081 100644 --- a/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapperFactory.java +++ b/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapperFactory.java @@ -1,5 +1,6 @@ package io.tarantool.driver.mappers; +import io.tarantool.driver.mappers.converters.object.DefaultInstantToExtensionValueConverter; import io.tarantool.driver.mappers.converters.object.DefaultNilValueToNullConverter; import io.tarantool.driver.mappers.converters.object.DefaultBigDecimalToExtensionValueConverter; import io.tarantool.driver.mappers.converters.object.DefaultLongArrayToArrayValueConverter; @@ -18,6 +19,7 @@ import io.tarantool.driver.mappers.converters.value.DefaultBinaryValueToByteArrayConverter; import io.tarantool.driver.mappers.converters.value.DefaultBooleanValueToBooleanConverter; import io.tarantool.driver.mappers.converters.value.DefaultExtensionValueToBigDecimalConverter; +import io.tarantool.driver.mappers.converters.value.DefaultExtensionValueToInstantConverter; import io.tarantool.driver.mappers.converters.value.DefaultExtensionValueToUUIDConverter; import io.tarantool.driver.mappers.converters.value.DefaultFloatValueToDoubleConverter; import io.tarantool.driver.mappers.converters.value.DefaultFloatValueToFloatConverter; @@ -42,6 +44,7 @@ import org.msgpack.value.ValueType; import java.math.BigDecimal; +import java.time.Instant; import java.util.UUID; /** @@ -81,6 +84,7 @@ private DefaultMessagePackMapperFactory() { .withValueConverter(ValueType.EXTENSION, UUID.class, new DefaultExtensionValueToUUIDConverter()) .withValueConverter(ValueType.EXTENSION, BigDecimal.class, new DefaultExtensionValueToBigDecimalConverter()) + .withValueConverter(ValueType.EXTENSION, Instant.class, new DefaultExtensionValueToInstantConverter()) .withValueConverter(ValueType.NIL, Object.class, new DefaultNilValueToNullConverter()) //TODO: Potential issue https://github.com/tarantool/cartridge-java/issues/118 .withObjectConverter(Character.class, StringValue.class, new DefaultCharacterToStringValueConverter()) @@ -96,6 +100,7 @@ private DefaultMessagePackMapperFactory() { .withObjectConverter(UUID.class, ExtensionValue.class, new DefaultUUIDToExtensionValueConverter()) .withObjectConverter(BigDecimal.class, ExtensionValue.class, new DefaultBigDecimalToExtensionValueConverter()) + .withObjectConverter(Instant.class, ExtensionValue.class, new DefaultInstantToExtensionValueConverter()) .build(); } diff --git a/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultInstantToExtensionValueConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultInstantToExtensionValueConverter.java new file mode 100644 index 00000000..333d39dc --- /dev/null +++ b/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultInstantToExtensionValueConverter.java @@ -0,0 +1,31 @@ +package io.tarantool.driver.mappers.converters.object; + +import io.tarantool.driver.mappers.converters.ObjectConverter; +import org.msgpack.value.ExtensionValue; +import org.msgpack.value.ValueFactory; + +import java.nio.ByteBuffer; +import java.time.Instant; + +/** + * Default {@link java.time.Instant} to {@link ExtensionValue} converter + * + * @author + */ +public class DefaultInstantToExtensionValueConverter implements ObjectConverter { + + private static final long serialVersionUID = 20220418L; + + private static final byte DATETIME_TYPE = 0x04; + + private byte[] toBytes(Instant value) { + ByteBuffer buffer = ByteBuffer.wrap(new byte[16]); + buffer.putLong(0, value.getEpochSecond()); + return buffer.array(); + } + + @Override + public ExtensionValue toValue(Instant object) { + return ValueFactory.newExtension(DATETIME_TYPE, toBytes(object)); + } +} diff --git a/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultExtensionValueToInstantConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultExtensionValueToInstantConverter.java new file mode 100644 index 00000000..5f6db5ab --- /dev/null +++ b/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultExtensionValueToInstantConverter.java @@ -0,0 +1,31 @@ +package io.tarantool.driver.mappers.converters.value; + +import io.tarantool.driver.mappers.converters.ValueConverter; +import org.msgpack.value.ExtensionValue; + +import java.nio.ByteBuffer; +import java.time.Instant; + +/** + * Default {@link ExtensionValue} to {@link java.time.Instant} converter + * + * @author + */ +public class DefaultExtensionValueToInstantConverter implements ValueConverter { + private static final byte DATETIME_TYPE = 0x04; + + private Instant fromBytes(byte[] bytes) { + ByteBuffer buffer = ByteBuffer.wrap(bytes); + return Instant.ofEpochSecond(buffer.getLong()); + } + + @Override + public Instant fromValue(ExtensionValue value) { + return fromBytes(value.getData()); + } + + @Override + public boolean canConvertValue(ExtensionValue value) { + return value.getType() == DATETIME_TYPE; + } +} diff --git a/src/test/java/io/tarantool/driver/mappers/DefaultInstantConverterTest.java b/src/test/java/io/tarantool/driver/mappers/DefaultInstantConverterTest.java new file mode 100644 index 00000000..48ffb51f --- /dev/null +++ b/src/test/java/io/tarantool/driver/mappers/DefaultInstantConverterTest.java @@ -0,0 +1,56 @@ +package io.tarantool.driver.mappers; + +import io.tarantool.driver.mappers.converters.object.DefaultInstantToExtensionValueConverter; +import io.tarantool.driver.mappers.converters.object.DefaultUUIDToExtensionValueConverter; +import io.tarantool.driver.mappers.converters.value.DefaultExtensionValueToInstantConverter; +import io.tarantool.driver.mappers.converters.value.DefaultExtensionValueToUUIDConverter; +import org.junit.jupiter.api.Test; +import org.msgpack.core.MessageBufferPacker; +import org.msgpack.core.MessagePack; +import org.msgpack.core.MessagePacker; +import org.msgpack.value.ExtensionValue; +import org.msgpack.value.ImmutableExtensionValue; +import org.msgpack.value.ValueFactory; + +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.util.Base64; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class DefaultInstantConverterTest { + @Test + void toValue() throws IOException { + DefaultInstantToExtensionValueConverter converter = new DefaultInstantToExtensionValueConverter(); + MessagePacker packer = MessagePack.newDefaultBufferPacker(); + Base64.Encoder encoder = Base64.getEncoder(); + Instant instant = LocalDateTime.parse("2022-10-25T12:03:58").toInstant(ZoneOffset.UTC); + byte[] result = ((MessageBufferPacker) packer.packValue(converter.toValue(instant))).toByteArray(); + assertEquals("2AQAAAAAY1fQrgAAAAAAAAAA", encoder.encodeToString(result)); + } + + @Test + void fromValue() throws IOException { + DefaultExtensionValueToInstantConverter converter = new DefaultExtensionValueToInstantConverter(); + Base64.Decoder base64decoder = Base64.getDecoder(); + Instant instant = LocalDateTime.parse("2022-10-25T12:03:58").toInstant(ZoneOffset.UTC); + byte[] packed = base64decoder.decode("2AQAAAAAY1fQrgAAAAAAAAAA"); + ExtensionValue value = MessagePack.newDefaultUnpacker(packed).unpackValue().asExtensionValue(); + assertEquals(instant, converter.fromValue(value)); + } + + @Test + void canConvertValue() { + DefaultExtensionValueToInstantConverter converter = new DefaultExtensionValueToInstantConverter(); + assertFalse(converter.canConvertValue(ValueFactory.newExtension((byte) 100, new byte[]{0}))); + assertFalse(converter.canConvertValue(ValueFactory.newExtension((byte) 0x01, new byte[]{0}))); + ImmutableExtensionValue value = ValueFactory.newExtension((byte) 0x04, new byte[]{0}); + assertTrue(converter.canConvertValue(value)); + } +} From 0252fa72485149153ea9190b2a105c86c8846626 Mon Sep 17 00:00:00 2001 From: aromanova Date: Tue, 25 Oct 2022 18:08:04 +0300 Subject: [PATCH 06/12] instant converter add test --- .../object/DefaultInstantToExtensionValueConverter.java | 2 +- .../value/DefaultExtensionValueToInstantConverter.java | 2 +- .../driver/mappers/DefaultMessagePackMapperTest.java | 9 ++++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultInstantToExtensionValueConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultInstantToExtensionValueConverter.java index 333d39dc..a02d0ccb 100644 --- a/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultInstantToExtensionValueConverter.java +++ b/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultInstantToExtensionValueConverter.java @@ -10,7 +10,7 @@ /** * Default {@link java.time.Instant} to {@link ExtensionValue} converter * - * @author + * @author Anastasiia Romanova */ public class DefaultInstantToExtensionValueConverter implements ObjectConverter { diff --git a/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultExtensionValueToInstantConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultExtensionValueToInstantConverter.java index 5f6db5ab..b06921c0 100644 --- a/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultExtensionValueToInstantConverter.java +++ b/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultExtensionValueToInstantConverter.java @@ -9,7 +9,7 @@ /** * Default {@link ExtensionValue} to {@link java.time.Instant} converter * - * @author + * @author Anastasiia Romanova */ public class DefaultExtensionValueToInstantConverter implements ValueConverter { private static final byte DATETIME_TYPE = 0x04; diff --git a/src/test/java/io/tarantool/driver/mappers/DefaultMessagePackMapperTest.java b/src/test/java/io/tarantool/driver/mappers/DefaultMessagePackMapperTest.java index be790559..b9c5563e 100644 --- a/src/test/java/io/tarantool/driver/mappers/DefaultMessagePackMapperTest.java +++ b/src/test/java/io/tarantool/driver/mappers/DefaultMessagePackMapperTest.java @@ -2,8 +2,8 @@ import io.tarantool.driver.CustomTuple; import io.tarantool.driver.api.tuple.DefaultTarantoolTupleFactory; -import io.tarantool.driver.api.tuple.TarantoolTupleFactory; import io.tarantool.driver.api.tuple.TarantoolTuple; +import io.tarantool.driver.api.tuple.TarantoolTupleFactory; import io.tarantool.driver.mappers.converters.ValueConverter; import org.junit.jupiter.api.Test; import org.msgpack.core.MessageTypeCastException; @@ -16,6 +16,9 @@ import org.msgpack.value.impl.ImmutableStringValueImpl; import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneOffset; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -76,6 +79,10 @@ void getDefaultConverter() throws MessagePackValueMapperException { UUID uuid = UUID.fromString("84b56906-aeed-11ea-b3de-0242ac130004"); assertEquals(uuid, mapper.fromValue(mapper.toValue(uuid))); + //instant + Instant instant = LocalDateTime.parse("2022-10-25T12:03:58").toInstant(ZoneOffset.UTC); + assertEquals(instant, mapper.fromValue(mapper.toValue(instant))); + // null assertEquals(ValueFactory.newNil(), mapper.toValue(null)); } From 0994dc8a3a551f90441a06e0c7c0d6c26a74fa4c Mon Sep 17 00:00:00 2001 From: aromanova Date: Wed, 26 Oct 2022 12:23:53 +0300 Subject: [PATCH 07/12] add serialVersion, changelog, tests --- CHANGELOG.md | 1 + .../driver/api/tuple/TarantoolTuple.java | 53 ++++++++++++------- .../driver/core/tuple/TarantoolTupleImpl.java | 11 ++++ ...faultInstantToExtensionValueConverter.java | 4 +- ...faultExtensionValueToInstantConverter.java | 2 + .../io/tarantool/driver/TarantoolUtils.java | 4 ++ .../ConvertersWithClusterClientIT.java | 18 +++++++ .../ConvertersWithProxyClientIT.java | 18 +++++++ .../mappers/DefaultInstantConverterTest.java | 4 +- 9 files changed, 93 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40f974dd..0900f8e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## [Unreleased] - Adding default mapper for long arrays ([#290](https://github.com/tarantool/cartridge-java/pull/290)) +- Support Datetime type ([#293](https://github.com/tarantool/cartridge-java/pull/293)) ## [0.9.1] - 2022-10-13 diff --git a/src/main/java/io/tarantool/driver/api/tuple/TarantoolTuple.java b/src/main/java/io/tarantool/driver/api/tuple/TarantoolTuple.java index ac1b3476..87d5878c 100644 --- a/src/main/java/io/tarantool/driver/api/tuple/TarantoolTuple.java +++ b/src/main/java/io/tarantool/driver/api/tuple/TarantoolTuple.java @@ -3,6 +3,7 @@ import io.tarantool.driver.protocol.Packable; import java.math.BigDecimal; +import java.time.Instant; import java.util.List; import java.util.Map; import java.util.Optional; @@ -16,7 +17,7 @@ public interface TarantoolTuple extends Iterable, Packable { /** * Get a tuple field by its position - * @param fieldPosition the field position from the the tuple start, starting from 0 + * @param fieldPosition the field position from the tuple start, starting from 0 * @return field or empty optional if the field position is out of tuple length */ Optional getField(int fieldPosition); @@ -38,7 +39,7 @@ public interface TarantoolTuple extends Iterable, Packable { /** * Get a tuple field value by its position specifying the target value type - * @param fieldPosition field position from the the tuple start, starting from 0 + * @param fieldPosition field position from the tuple start, starting from 0 * @param objectClass target value type class * @param target value type * @return nullable value of a field wrapped in Optional, possibly converted to a Java type @@ -47,7 +48,7 @@ public interface TarantoolTuple extends Iterable, Packable { /** * Check if a tuple field exists and can be converted to the target value type - * @param fieldPosition field position from the the tuple start, starting from 0 + * @param fieldPosition field position from the tuple start, starting from 0 * @param objectClass target value type class * @return true, if the field exists and can be converted to the given type, false otherwise */ @@ -72,7 +73,7 @@ public interface TarantoolTuple extends Iterable, Packable { /** * Get a tuple field value as a raw object - * @param fieldPosition field position from the the tuple start, starting from 0 + * @param fieldPosition field position from the tuple start, starting from 0 * @return nullable value of a field wrapped in Optional */ Optional getObject(int fieldPosition); @@ -94,7 +95,7 @@ public interface TarantoolTuple extends Iterable, Packable { /** * Set a tuple field by field position * - * @param fieldPosition the field position from the the tuple start, starting from 0 + * @param fieldPosition the field position from the tuple start, starting from 0 * @param field new field */ void setField(int fieldPosition, TarantoolField field); @@ -110,7 +111,7 @@ public interface TarantoolTuple extends Iterable, Packable { /** * Set a tuple field value from an object by field position * - * @param fieldPosition the field position from the the tuple start, starting from 0 + * @param fieldPosition the field position from the tuple start, starting from 0 * @param value new field value */ void putObject(int fieldPosition, Object value); @@ -126,7 +127,7 @@ public interface TarantoolTuple extends Iterable, Packable { /** * Get the field value converted to {@code byte[]} * - * @param fieldPosition the field position from the the tuple start, starting from 0 + * @param fieldPosition the field position from the tuple start, starting from 0 * @return value */ byte[] getByteArray(int fieldPosition); @@ -142,7 +143,7 @@ public interface TarantoolTuple extends Iterable, Packable { /** * Get the field value converted to {@code Boolean} * - * @param fieldPosition the field position from the the tuple start, starting from 0 + * @param fieldPosition the field position from the tuple start, starting from 0 * @return value */ Boolean getBoolean(int fieldPosition); @@ -158,7 +159,7 @@ public interface TarantoolTuple extends Iterable, Packable { /** * Get the field value converted to {@code Double} * - * @param fieldPosition the field position from the the tuple start, starting from 0 + * @param fieldPosition the field position from the tuple start, starting from 0 * @return value */ Double getDouble(int fieldPosition); @@ -174,7 +175,7 @@ public interface TarantoolTuple extends Iterable, Packable { /** * Get the field value converted to {@code Float} * - * @param fieldPosition the field position from the the tuple start, starting from 0 + * @param fieldPosition the field position from the tuple start, starting from 0 * @return value */ Float getFloat(int fieldPosition); @@ -190,7 +191,7 @@ public interface TarantoolTuple extends Iterable, Packable { /** * Get the field value converted to {@code Integer} * - * @param fieldPosition the field position from the the tuple start, starting from 0 + * @param fieldPosition the field position from the tuple start, starting from 0 * @return value */ Integer getInteger(int fieldPosition); @@ -206,7 +207,7 @@ public interface TarantoolTuple extends Iterable, Packable { /** * Get the field value converted to {@code Long} * - * @param fieldPosition the field position from the the tuple start, starting from 0 + * @param fieldPosition the field position from the tuple start, starting from 0 * @return value */ Long getLong(int fieldPosition); @@ -222,7 +223,7 @@ public interface TarantoolTuple extends Iterable, Packable { /** * Get the field value converted to {@code String} * - * @param fieldPosition the field position from the the tuple start, starting from 0 + * @param fieldPosition the field position from the tuple start, starting from 0 * @return value */ String getString(int fieldPosition); @@ -238,7 +239,7 @@ public interface TarantoolTuple extends Iterable, Packable { /** * Get the field value converted to {@code Character} * - * @param fieldPosition the field position from the the tuple start, starting from 0 + * @param fieldPosition the field position from the tuple start, starting from 0 * @return value */ Character getCharacter(int fieldPosition); @@ -254,7 +255,7 @@ public interface TarantoolTuple extends Iterable, Packable { /** * Get the field value converted to {@link UUID} * - * @param fieldPosition the field position from the the tuple start, starting from 0 + * @param fieldPosition the field position from the tuple start, starting from 0 * @return value */ UUID getUUID(int fieldPosition); @@ -267,10 +268,26 @@ public interface TarantoolTuple extends Iterable, Packable { */ UUID getUUID(String fieldName); + /** + * Get the field value converted to {@link Instant} + * + * @param fieldPosition the field position from the tuple start, starting from 0 + * @return value + */ + Instant getInstant(int fieldPosition); + + /** + * Get the field value converted to {@link Instant} + * + * @param fieldName the field name, must not be null + * @return value + */ + Instant getInstant(String fieldName); + /** * Get the field value converted to {@link BigDecimal} * - * @param fieldPosition the field position from the the tuple start, starting from 0 + * @param fieldPosition the field position from the tuple start, starting from 0 * @return value */ BigDecimal getDecimal(int fieldPosition); @@ -286,7 +303,7 @@ public interface TarantoolTuple extends Iterable, Packable { /** * Get the field value converted to {@link List} * - * @param fieldPosition the field position from the the tuple start, starting from 0 + * @param fieldPosition the field position from the tuple start, starting from 0 * @return value */ List getList(int fieldPosition); @@ -302,7 +319,7 @@ public interface TarantoolTuple extends Iterable, Packable { /** * Get the field value converted to {@link Map} * - * @param fieldPosition the field position from the the tuple start, starting from 0 + * @param fieldPosition the field position from the tuple start, starting from 0 * @return value */ Map getMap(int fieldPosition); diff --git a/src/main/java/io/tarantool/driver/core/tuple/TarantoolTupleImpl.java b/src/main/java/io/tarantool/driver/core/tuple/TarantoolTupleImpl.java index 681299f8..30108639 100644 --- a/src/main/java/io/tarantool/driver/core/tuple/TarantoolTupleImpl.java +++ b/src/main/java/io/tarantool/driver/core/tuple/TarantoolTupleImpl.java @@ -18,6 +18,7 @@ import java.io.IOException; import java.math.BigDecimal; +import java.time.Instant; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -361,6 +362,16 @@ public UUID getUUID(String fieldName) { return getObject(fieldName, UUID.class).orElse(null); } + @Override + public Instant getInstant(int fieldPosition) { + return getObject(fieldPosition, Instant.class).orElse(null); + } + + @Override + public Instant getInstant(String fieldName) { + return getObject(fieldName, Instant.class).orElse(null); + } + @Override public BigDecimal getDecimal(int fieldPosition) { return getObject(fieldPosition, BigDecimal.class).orElse(null); diff --git a/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultInstantToExtensionValueConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultInstantToExtensionValueConverter.java index a02d0ccb..ce8e0dd7 100644 --- a/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultInstantToExtensionValueConverter.java +++ b/src/main/java/io/tarantool/driver/mappers/converters/object/DefaultInstantToExtensionValueConverter.java @@ -14,12 +14,12 @@ */ public class DefaultInstantToExtensionValueConverter implements ObjectConverter { - private static final long serialVersionUID = 20220418L; + private static final long serialVersionUID = 20221025L; private static final byte DATETIME_TYPE = 0x04; private byte[] toBytes(Instant value) { - ByteBuffer buffer = ByteBuffer.wrap(new byte[16]); + ByteBuffer buffer = ByteBuffer.wrap(new byte[8]); buffer.putLong(0, value.getEpochSecond()); return buffer.array(); } diff --git a/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultExtensionValueToInstantConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultExtensionValueToInstantConverter.java index b06921c0..ed37019c 100644 --- a/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultExtensionValueToInstantConverter.java +++ b/src/main/java/io/tarantool/driver/mappers/converters/value/DefaultExtensionValueToInstantConverter.java @@ -12,6 +12,8 @@ * @author Anastasiia Romanova */ public class DefaultExtensionValueToInstantConverter implements ValueConverter { + + private static final long serialVersionUID = 20221025L; private static final byte DATETIME_TYPE = 0x04; private Instant fromBytes(byte[] bytes) { diff --git a/src/test/java/io/tarantool/driver/TarantoolUtils.java b/src/test/java/io/tarantool/driver/TarantoolUtils.java index 8e24d579..c5457eb6 100644 --- a/src/test/java/io/tarantool/driver/TarantoolUtils.java +++ b/src/test/java/io/tarantool/driver/TarantoolUtils.java @@ -31,6 +31,10 @@ public static boolean versionWithUUID() { return versionGreaterThen("2.4"); } + public static boolean versionWithInstant() { + return versionGreaterThen("2.10"); + } + public static boolean versionWithVarbinary() { return versionGreaterThen("2.2.1"); } diff --git a/src/test/java/io/tarantool/driver/integration/ConvertersWithClusterClientIT.java b/src/test/java/io/tarantool/driver/integration/ConvertersWithClusterClientIT.java index aeceb66e..c71ab28e 100644 --- a/src/test/java/io/tarantool/driver/integration/ConvertersWithClusterClientIT.java +++ b/src/test/java/io/tarantool/driver/integration/ConvertersWithClusterClientIT.java @@ -15,6 +15,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIf; +import java.time.Instant; import java.util.UUID; import org.testcontainers.shaded.org.apache.commons.lang.ArrayUtils; @@ -65,6 +66,23 @@ public void test_boxSelect_shouldReturnTupleWithUUID() throws Exception { Assertions.assertEquals(uuid, fields.getUUID("uuid_field")); } + @Test + @EnabledIf("io.tarantool.driver.TarantoolUtils#versionWithInstant") + public void test_boxSelect_shouldReturnTupleWithInstant() throws Exception { + //given + Instant instant = Instant.now(); + client.space("space_with_instant") + .insert(tupleFactory.create(1, instant)).get(); + + //when + TarantoolTuple fields = client + .space("space_with_instant") + .select(Conditions.equals("id", 1)).get().get(0); + + //then + Assertions.assertEquals(instant, fields.getInstant("instant_field")); + } + @Test @EnabledIf("io.tarantool.driver.TarantoolUtils#versionWithVarbinary") public void test_boxOperations_shouldWorkWithVarbinary() throws Exception { diff --git a/src/test/java/io/tarantool/driver/integration/ConvertersWithProxyClientIT.java b/src/test/java/io/tarantool/driver/integration/ConvertersWithProxyClientIT.java index 348de77f..0c0e84a7 100644 --- a/src/test/java/io/tarantool/driver/integration/ConvertersWithProxyClientIT.java +++ b/src/test/java/io/tarantool/driver/integration/ConvertersWithProxyClientIT.java @@ -13,6 +13,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIf; +import java.time.Instant; import java.util.UUID; import org.junit.jupiter.api.Disabled; import org.testcontainers.shaded.org.apache.commons.lang.ArrayUtils; @@ -65,6 +66,23 @@ public void test_crudSelect_shouldReturnTupleWithUUID() throws Exception { Assertions.assertEquals(uuid, fields.getUUID("uuid_field")); } + @Test + @EnabledIf("io.tarantool.driver.TarantoolUtils#versionWithInstant") + public void test_crudSelect_shouldReturnTupleWithInstant() throws Exception { + //given + Instant instant = Instant.now(); + client.space("space_with_instant") + .insert(tupleFactory.create(1, instant)).get(); + + //when + TarantoolTuple fields = client + .space("space_with_instant") + .select(Conditions.equals("id", 1)).get().get(0); + + //then + Assertions.assertEquals(instant, fields.getInstant("instant_field")); + } + @Test @Disabled("Until https://github.com/tarantool/tarantool/issues/1629 is fixed") @EnabledIf("io.tarantool.driver.TarantoolUtils#versionWithVarbinary") diff --git a/src/test/java/io/tarantool/driver/mappers/DefaultInstantConverterTest.java b/src/test/java/io/tarantool/driver/mappers/DefaultInstantConverterTest.java index 48ffb51f..8a649c4d 100644 --- a/src/test/java/io/tarantool/driver/mappers/DefaultInstantConverterTest.java +++ b/src/test/java/io/tarantool/driver/mappers/DefaultInstantConverterTest.java @@ -32,7 +32,7 @@ void toValue() throws IOException { Base64.Encoder encoder = Base64.getEncoder(); Instant instant = LocalDateTime.parse("2022-10-25T12:03:58").toInstant(ZoneOffset.UTC); byte[] result = ((MessageBufferPacker) packer.packValue(converter.toValue(instant))).toByteArray(); - assertEquals("2AQAAAAAY1fQrgAAAAAAAAAA", encoder.encodeToString(result)); + assertEquals("1wQAAAAAY1fQrg==", encoder.encodeToString(result)); } @Test @@ -40,7 +40,7 @@ void fromValue() throws IOException { DefaultExtensionValueToInstantConverter converter = new DefaultExtensionValueToInstantConverter(); Base64.Decoder base64decoder = Base64.getDecoder(); Instant instant = LocalDateTime.parse("2022-10-25T12:03:58").toInstant(ZoneOffset.UTC); - byte[] packed = base64decoder.decode("2AQAAAAAY1fQrgAAAAAAAAAA"); + byte[] packed = base64decoder.decode("1wQAAAAAY1fQrg=="); ExtensionValue value = MessagePack.newDefaultUnpacker(packed).unpackValue().asExtensionValue(); assertEquals(instant, converter.fromValue(value)); } From 03185931f3478517ac77ecc03b0e5a66f33a70f9 Mon Sep 17 00:00:00 2001 From: aromanova Date: Wed, 26 Oct 2022 21:12:35 +0300 Subject: [PATCH 08/12] add space --- .../cartridge/app/roles/api_storage.lua | 17 +++++++++++++++++ .../org/testcontainers/containers/server.lua | 14 ++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/test/resources/cartridge/app/roles/api_storage.lua b/src/test/resources/cartridge/app/roles/api_storage.lua index e9cdcb0d..dc2f50c8 100644 --- a/src/test/resources/cartridge/app/roles/api_storage.lua +++ b/src/test/resources/cartridge/app/roles/api_storage.lua @@ -145,6 +145,23 @@ local function init_space() space_with_varbinary:create_index('bucket_id', { parts = { 'bucket_id' }, unique = false, if_not_exists = true, }) end + if major >= 2 and minor >= 10 and patch > 1 then + -- test space for check instant + local space_with_instant = box.schema.space.create( + 'space_with_instant', + { + format = { + { 'id', 'unsigned' }, + { 'instant_field', 'instant',}, + { 'bucket_id', 'unsigned' }, + }, + if_not_exists = true, + } + ) + space_with_instant:create_index('id', { parts = { 'id' }, if_not_exists = true, }) + space_with_instant: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', { diff --git a/src/test/resources/org/testcontainers/containers/server.lua b/src/test/resources/org/testcontainers/containers/server.lua index 3743828b..5d1a626c 100755 --- a/src/test/resources/org/testcontainers/containers/server.lua +++ b/src/test/resources/org/testcontainers/containers/server.lua @@ -107,6 +107,20 @@ if major >= 2 and minor >= 2 and patch > 1 then ) space_with_varbinary:create_index('id', { parts = { 'id' }, if_not_exists = true, }) end +if major >= 2 and minor >= 10 and patch > 1 then + -- test space for check instant + local space_with_instant = box.schema.space.create( + 'space_with_instant', + { + format = { + { 'id', 'unsigned' }, + { 'instant_field', 'instant',}, + }, + if_not_exists = true, + } + ) + space_with_instant:create_index('id', { parts = { 'id' }, if_not_exists = true, }) +end --functions From 452de0d12a7f1c2457a7b004738b667b94e41403 Mon Sep 17 00:00:00 2001 From: aromanova Date: Wed, 26 Oct 2022 22:06:37 +0300 Subject: [PATCH 09/12] add space --- .github/workflows/tests-ce.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests-ce.yml b/.github/workflows/tests-ce.yml index de0d9dc0..ff523350 100644 --- a/.github/workflows/tests-ce.yml +++ b/.github/workflows/tests-ce.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - tarantool-version: [ "1.10", "2.8" ] + tarantool-version: [ "1.10", "2.8", "2.10" ] fail-fast: false steps: - uses: actions/checkout@v2 From 58611f7f78258aace010cd20975a1e1a89598a16 Mon Sep 17 00:00:00 2001 From: aromanova Date: Wed, 26 Oct 2022 22:19:58 +0300 Subject: [PATCH 10/12] add space --- src/test/resources/cartridge/app/roles/api_storage.lua | 2 +- src/test/resources/org/testcontainers/containers/server.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/resources/cartridge/app/roles/api_storage.lua b/src/test/resources/cartridge/app/roles/api_storage.lua index dc2f50c8..9a04e93c 100644 --- a/src/test/resources/cartridge/app/roles/api_storage.lua +++ b/src/test/resources/cartridge/app/roles/api_storage.lua @@ -152,7 +152,7 @@ local function init_space() { format = { { 'id', 'unsigned' }, - { 'instant_field', 'instant',}, + { 'instant_field', 'datetime',}, { 'bucket_id', 'unsigned' }, }, if_not_exists = true, diff --git a/src/test/resources/org/testcontainers/containers/server.lua b/src/test/resources/org/testcontainers/containers/server.lua index 5d1a626c..96f7dbc8 100755 --- a/src/test/resources/org/testcontainers/containers/server.lua +++ b/src/test/resources/org/testcontainers/containers/server.lua @@ -114,7 +114,7 @@ if major >= 2 and minor >= 10 and patch > 1 then { format = { { 'id', 'unsigned' }, - { 'instant_field', 'instant',}, + { 'instant_field', 'datetime',}, }, if_not_exists = true, } From 41c950fc6e6b3bdf409eca698f8469bed29fe869 Mon Sep 17 00:00:00 2001 From: Alexey Kuzin Date: Thu, 27 Oct 2022 00:22:57 +0200 Subject: [PATCH 11/12] W/A for not available 2.10 version in installer --- .github/workflows/tests-ce.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests-ce.yml b/.github/workflows/tests-ce.yml index ff523350..a46a2ee5 100644 --- a/.github/workflows/tests-ce.yml +++ b/.github/workflows/tests-ce.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - tarantool-version: [ "1.10", "2.8", "2.10" ] + tarantool-version: [ "1.10", "2.8", "2" ] fail-fast: false steps: - uses: actions/checkout@v2 From 0e30464631b19c67a7ef1e1408ec7215eeeadfc6 Mon Sep 17 00:00:00 2001 From: aromanova Date: Thu, 27 Oct 2022 10:47:27 +0300 Subject: [PATCH 12/12] add space --- .github/workflows/tests-ce.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests-ce.yml b/.github/workflows/tests-ce.yml index a46a2ee5..c05d3eea 100644 --- a/.github/workflows/tests-ce.yml +++ b/.github/workflows/tests-ce.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - tarantool-version: [ "1.10", "2.8", "2" ] + tarantool-version: [ "1.10", "2.8", "2.10.3" ] fail-fast: false steps: - uses: actions/checkout@v2