diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1aa14d0c0..1181df27c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,15 @@
## [Unreleased]
- Use netty part dependencies instead of netty-all ([#295](https://github.com/tarantool/cartridge-java/issues/295))
+- Refactor mappers and split `TarantoolResultConverter` ([#301](https://github.com/tarantool/cartridge-java/pull/301))
+- **[breaking change]** `TarantoolResultConverter` was removed, use `DefaultArrayValueToTarantoolResultConverter` or `DefaultMapValueToTarantoolTupleResultConverter` instead ([#301](https://github.com/tarantool/cartridge-java/pull/301))
+- **[breaking change]** `ConverterWrapper` was moved to converters package ([#301](https://github.com/tarantool/cartridge-java/pull/301))
+- **[breaking change]** `*MapperFactory` classes were moved to separate package ([#301](https://github.com/tarantool/cartridge-java/pull/301))
+- **[breaking change]** `TarantoolTupleMultiResult` was renamed to `MultiValueTarantoolTupleResult` ([#301](https://github.com/tarantool/cartridge-java/pull/301))
+- **[breaking change]** `TarantoolTupleSingleResult` was renamed to `SingleValueTarantoolTupleResult` ([#301](https://github.com/tarantool/cartridge-java/pull/301))
+- **[breaking change]** `*MapperFactory` methods were renamed ([#301](https://github.com/tarantool/cartridge-java/pull/301))
+- **[breaking change]** `*DefaultConverter` converters moved into `mappers.converters.value.defaults` package ([#301](https://github.com/tarantool/cartridge-java/pull/301))
+- **[breaking change]** All converters from `mappers.converters.value.custom` moved into `mappers.converters.value` package ([#301](https://github.com/tarantool/cartridge-java/pull/301))
## [0.9.2] - 2022-11-15
diff --git a/src/main/java/io/tarantool/driver/api/TarantoolCallOperations.java b/src/main/java/io/tarantool/driver/api/TarantoolCallOperations.java
index 9df1f981c..083a12e57 100644
--- a/src/main/java/io/tarantool/driver/api/TarantoolCallOperations.java
+++ b/src/main/java/io/tarantool/driver/api/TarantoolCallOperations.java
@@ -4,8 +4,8 @@
import io.tarantool.driver.mappers.CallResultMapper;
import io.tarantool.driver.mappers.MessagePackMapper;
import io.tarantool.driver.mappers.MessagePackObjectMapper;
-import io.tarantool.driver.mappers.ResultMapperFactoryFactory;
import io.tarantool.driver.mappers.converters.ValueConverter;
+import io.tarantool.driver.mappers.factories.ResultMapperFactoryFactory;
import org.msgpack.value.Value;
import java.util.List;
diff --git a/src/main/java/io/tarantool/driver/api/TarantoolClientBuilder.java b/src/main/java/io/tarantool/driver/api/TarantoolClientBuilder.java
index 364ec3484..a33950827 100644
--- a/src/main/java/io/tarantool/driver/api/TarantoolClientBuilder.java
+++ b/src/main/java/io/tarantool/driver/api/TarantoolClientBuilder.java
@@ -7,6 +7,7 @@
import io.tarantool.driver.auth.TarantoolCredentials;
import io.tarantool.driver.mappers.DefaultMessagePackMapper;
import io.tarantool.driver.mappers.MessagePackMapper;
+import io.tarantool.driver.mappers.factories.DefaultMessagePackMapperFactory;
import java.net.InetSocketAddress;
import java.util.List;
@@ -112,7 +113,7 @@ public interface TarantoolClientBuilder extends TarantoolClientConfigurator
* This method takes a lambda as an argument, where the mapperBuilder is {@link DefaultMessagePackMapper.Builder}.
*
- * see {@link io.tarantool.driver.mappers.DefaultMessagePackMapperFactory}.
+ * see {@link DefaultMessagePackMapperFactory}.
*
* @param mapperBuilder builder provider instance, e.g. a lambda function taking the builder
* for {@link MessagePackMapper} instance
@@ -127,7 +128,7 @@ public interface TarantoolClientBuilder extends TarantoolClientConfigurator target tuple type
* @author Alexey Kuzin
diff --git a/src/main/java/io/tarantool/driver/api/tuple/TarantoolTupleMultiResult.java b/src/main/java/io/tarantool/driver/api/tuple/MultiValueTarantoolTupleResult.java
similarity index 88%
rename from src/main/java/io/tarantool/driver/api/tuple/TarantoolTupleMultiResult.java
rename to src/main/java/io/tarantool/driver/api/tuple/MultiValueTarantoolTupleResult.java
index 2f35b4ff5..7f5d7fe8a 100644
--- a/src/main/java/io/tarantool/driver/api/tuple/TarantoolTupleMultiResult.java
+++ b/src/main/java/io/tarantool/driver/api/tuple/MultiValueTarantoolTupleResult.java
@@ -9,6 +9,6 @@
* @author Alexey Kuzin
* @see TarantoolTupleResult
*/
-public interface TarantoolTupleMultiResult
+public interface MultiValueTarantoolTupleResult
extends MultiValueCallResult> {
}
diff --git a/src/main/java/io/tarantool/driver/api/tuple/TarantoolTupleSingleResult.java b/src/main/java/io/tarantool/driver/api/tuple/SingleValueTarantoolTupleResult.java
similarity index 71%
rename from src/main/java/io/tarantool/driver/api/tuple/TarantoolTupleSingleResult.java
rename to src/main/java/io/tarantool/driver/api/tuple/SingleValueTarantoolTupleResult.java
index 88b10b752..09409b022 100644
--- a/src/main/java/io/tarantool/driver/api/tuple/TarantoolTupleSingleResult.java
+++ b/src/main/java/io/tarantool/driver/api/tuple/SingleValueTarantoolTupleResult.java
@@ -9,5 +9,5 @@
* @author Alexey Kuzin
* @see TarantoolTupleResult
*/
-public interface TarantoolTupleSingleResult extends SingleValueCallResult> {
+public interface SingleValueTarantoolTupleResult extends SingleValueCallResult> {
}
diff --git a/src/main/java/io/tarantool/driver/core/AbstractTarantoolClient.java b/src/main/java/io/tarantool/driver/core/AbstractTarantoolClient.java
index 0a771189a..762585273 100644
--- a/src/main/java/io/tarantool/driver/core/AbstractTarantoolClient.java
+++ b/src/main/java/io/tarantool/driver/core/AbstractTarantoolClient.java
@@ -25,12 +25,12 @@
import io.tarantool.driver.exceptions.TarantoolClientException;
import io.tarantool.driver.exceptions.TarantoolSpaceNotFoundException;
import io.tarantool.driver.mappers.CallResultMapper;
-import io.tarantool.driver.mappers.DefaultResultMapperFactoryFactory;
import io.tarantool.driver.mappers.MessagePackMapper;
import io.tarantool.driver.mappers.MessagePackObjectMapper;
import io.tarantool.driver.mappers.MessagePackValueMapper;
-import io.tarantool.driver.mappers.ResultMapperFactoryFactory;
import io.tarantool.driver.mappers.converters.ValueConverter;
+import io.tarantool.driver.mappers.factories.ResultMapperFactoryFactoryImpl;
+import io.tarantool.driver.mappers.factories.ResultMapperFactoryFactory;
import io.tarantool.driver.protocol.Packable;
import io.tarantool.driver.protocol.TarantoolProtocolException;
import io.tarantool.driver.protocol.requests.TarantoolCallRequest;
@@ -66,7 +66,7 @@ public abstract class AbstractTarantoolClient metadataHolder = new AtomicReference<>();
- private final DefaultResultMapperFactoryFactory mapperFactoryFactory;
+ private final ResultMapperFactoryFactoryImpl mapperFactoryFactory;
private final SpacesMetadataProvider metadataProvider;
private final ScheduledExecutorService timeoutScheduler;
private TarantoolConnectionManager connectionManager;
@@ -110,7 +110,7 @@ public AbstractTarantoolClient(TarantoolClientConfig config, TarantoolConnection
Assert.notNull(listeners, "Tarantool connection listeners must not be null");
this.config = config;
- this.mapperFactoryFactory = new DefaultResultMapperFactoryFactory();
+ this.mapperFactoryFactory = new ResultMapperFactoryFactoryImpl();
this.eventLoopGroup = new NioEventLoopGroup(config.getEventLoopThreadsNumber());
this.bootstrap = new Bootstrap()
.group(eventLoopGroup)
diff --git a/src/main/java/io/tarantool/driver/core/MultiValueCallResultImpl.java b/src/main/java/io/tarantool/driver/core/MultiValueCallResultImpl.java
index 75f2b08f4..53acfced7 100644
--- a/src/main/java/io/tarantool/driver/core/MultiValueCallResultImpl.java
+++ b/src/main/java/io/tarantool/driver/core/MultiValueCallResultImpl.java
@@ -3,6 +3,7 @@
import io.tarantool.driver.api.MultiValueCallResult;
import io.tarantool.driver.exceptions.TarantoolFunctionCallException;
import io.tarantool.driver.exceptions.errors.TarantoolErrorsParser;
+import io.tarantool.driver.mappers.MessagePackValueMapper;
import io.tarantool.driver.mappers.converters.ValueConverter;
import org.msgpack.value.ArrayValue;
import org.msgpack.value.Value;
@@ -14,6 +15,7 @@
* {@code null}, the second is treated as a formatted error or an error message.
*
* @author Alexey Kuzin
+ * @author Artyom Dubinin
*/
public class MultiValueCallResultImpl> implements MultiValueCallResult {
@@ -36,6 +38,23 @@ public MultiValueCallResultImpl(Value result, ValueConverter valu
}
}
+ public MultiValueCallResultImpl(Value result, MessagePackValueMapper valueMapper) {
+ if (result == null) {
+ throw new TarantoolFunctionCallException("Function call result is null");
+ }
+ if (!result.isArrayValue()) {
+ throw new TarantoolFunctionCallException("Function call result is not a MessagePack array");
+ }
+ ArrayValue resultArray = result.asArrayValue();
+ if (resultArray.size() == 2 && (resultArray.get(0).isNilValue() && !resultArray.get(1).isNilValue())) {
+ // [nil, "Error msg..."] or [nil, {str="Error msg...", stack="..."}]
+ throw TarantoolErrorsParser.parse(resultArray.get(1));
+ } else {
+ // result
+ this.value = valueMapper.fromValue(result.asArrayValue());
+ }
+ }
+
@Override
public R value() {
return value;
diff --git a/src/main/java/io/tarantool/driver/core/ProxyTarantoolClient.java b/src/main/java/io/tarantool/driver/core/ProxyTarantoolClient.java
index 9094cdc45..ec2d8c901 100644
--- a/src/main/java/io/tarantool/driver/core/ProxyTarantoolClient.java
+++ b/src/main/java/io/tarantool/driver/core/ProxyTarantoolClient.java
@@ -23,8 +23,8 @@
import io.tarantool.driver.mappers.MessagePackMapper;
import io.tarantool.driver.mappers.MessagePackObjectMapper;
import io.tarantool.driver.mappers.MessagePackValueMapper;
-import io.tarantool.driver.mappers.ResultMapperFactoryFactory;
import io.tarantool.driver.mappers.converters.ValueConverter;
+import io.tarantool.driver.mappers.factories.ResultMapperFactoryFactory;
import io.tarantool.driver.protocol.Packable;
import io.tarantool.driver.utils.Assert;
import org.msgpack.value.Value;
diff --git a/src/main/java/io/tarantool/driver/core/RetryingTarantoolClient.java b/src/main/java/io/tarantool/driver/core/RetryingTarantoolClient.java
index d6aa371e9..e820563d3 100644
--- a/src/main/java/io/tarantool/driver/core/RetryingTarantoolClient.java
+++ b/src/main/java/io/tarantool/driver/core/RetryingTarantoolClient.java
@@ -18,8 +18,8 @@
import io.tarantool.driver.mappers.MessagePackMapper;
import io.tarantool.driver.mappers.MessagePackObjectMapper;
import io.tarantool.driver.mappers.MessagePackValueMapper;
-import io.tarantool.driver.mappers.ResultMapperFactoryFactory;
import io.tarantool.driver.mappers.converters.ValueConverter;
+import io.tarantool.driver.mappers.factories.ResultMapperFactoryFactory;
import io.tarantool.driver.protocol.Packable;
import org.msgpack.value.Value;
diff --git a/src/main/java/io/tarantool/driver/core/SingleValueCallResultImpl.java b/src/main/java/io/tarantool/driver/core/SingleValueCallResultImpl.java
index 3b8432079..7e620fef0 100644
--- a/src/main/java/io/tarantool/driver/core/SingleValueCallResultImpl.java
+++ b/src/main/java/io/tarantool/driver/core/SingleValueCallResultImpl.java
@@ -3,6 +3,7 @@
import io.tarantool.driver.api.SingleValueCallResult;
import io.tarantool.driver.exceptions.TarantoolFunctionCallException;
import io.tarantool.driver.exceptions.errors.TarantoolErrorsParser;
+import io.tarantool.driver.mappers.MessagePackValueMapper;
import io.tarantool.driver.mappers.converters.ValueConverter;
import org.msgpack.value.ArrayValue;
import org.msgpack.value.Value;
@@ -12,6 +13,7 @@
* {@code null}, the second is treated as a formatted error or an error message.
*
* @author Alexey Kuzin
+ * @author Artyom Dubinin
*/
public class SingleValueCallResultImpl implements SingleValueCallResult {
@@ -33,6 +35,22 @@ public SingleValueCallResultImpl(ArrayValue result, ValueConverter val
}
}
+ public SingleValueCallResultImpl(ArrayValue result, MessagePackValueMapper valueMapper) {
+ if (result == null) {
+ throw new TarantoolFunctionCallException("Function call result is null");
+ }
+ if (result.size() == 0 || result.size() == 1 && result.get(0).isNilValue()) {
+ // [nil] or []
+ value = null;
+ } else if (result.size() == 2 && (result.get(0).isNilValue() && !result.get(1).isNilValue())) {
+ // [nil, "Error msg..."] or [nil, {str="Error msg...", stack="..."}]
+ throw TarantoolErrorsParser.parse(result.get(1));
+ } else {
+ // [result]
+ value = valueMapper.fromValue(result.get(0));
+ }
+ }
+
@Override
public T value() {
return value;
diff --git a/src/main/java/io/tarantool/driver/core/TarantoolChannelInitializer.java b/src/main/java/io/tarantool/driver/core/TarantoolChannelInitializer.java
index da5f77584..8fce12308 100644
--- a/src/main/java/io/tarantool/driver/core/TarantoolChannelInitializer.java
+++ b/src/main/java/io/tarantool/driver/core/TarantoolChannelInitializer.java
@@ -16,7 +16,7 @@
import io.tarantool.driver.handlers.TarantoolAuthenticationResponseHandler;
import io.tarantool.driver.handlers.TarantoolRequestHandler;
import io.tarantool.driver.handlers.TarantoolResponseHandler;
-import io.tarantool.driver.mappers.DefaultMessagePackMapperFactory;
+import io.tarantool.driver.mappers.factories.DefaultMessagePackMapperFactory;
import java.util.concurrent.CompletableFuture;
diff --git a/src/main/java/io/tarantool/driver/core/TarantoolResultImpl.java b/src/main/java/io/tarantool/driver/core/TarantoolResultImpl.java
index 2560f5676..87edb0bb7 100644
--- a/src/main/java/io/tarantool/driver/core/TarantoolResultImpl.java
+++ b/src/main/java/io/tarantool/driver/core/TarantoolResultImpl.java
@@ -1,67 +1,42 @@
package io.tarantool.driver.core;
import io.tarantool.driver.api.TarantoolResult;
-import io.tarantool.driver.exceptions.TarantoolClientException;
import io.tarantool.driver.exceptions.TarantoolTupleConversionException;
import io.tarantool.driver.mappers.converters.ValueConverter;
import org.msgpack.core.MessageTypeCastException;
import org.msgpack.value.ArrayValue;
-import org.msgpack.value.StringValue;
-import org.msgpack.value.Value;
-import org.msgpack.value.ValueFactory;
-import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
-import java.util.Map;
import java.util.stream.Collectors;
/**
- * Basic TarantoolResult implementation. Supports two types of the tuple result: a MessagePack array of arrays
- * (as in IPROTO) and a map with format {@code {"rows": [[], ...], "metadata": []}} as returned by tarantool/crud module
+ * Basic TarantoolResult implementation
*
* @param target result tuple type
* @author Alexey Kuzin
+ * @author Artyom Dubinin
*/
public class TarantoolResultImpl implements TarantoolResult {
- private static final StringValue RESULT_META = ValueFactory.newString("metadata");
- private static final StringValue RESULT_ROWS = ValueFactory.newString("rows");
-
- private List tuples;
-
- public TarantoolResultImpl(Value value, ValueConverter tupleConverter) {
- if (value.isArrayValue()) {
- // [[[],...]]
- setTuples(value.asArrayValue(), tupleConverter);
- } else if (value.isMapValue()) {
- // [{"metadata" : [...], "rows": [...]}]
- Map tupleMap = value.asMapValue().map();
- if (!hasRowsAndMetadata(tupleMap)) {
- throw new TarantoolClientException("The received tuple map has wrong format, " +
- "expected {\"metadata\" : [...], \"rows\": [...]}, got %s", value.toString());
- }
- Value tupleArray = tupleMap.get(RESULT_ROWS);
- if (!tupleArray.isArrayValue()) {
- throw new TarantoolClientException("The \"rows\" field must contain a MessagePack array");
- }
- setTuples(tupleArray.asArrayValue(), tupleConverter);
- } else if (value.isNilValue()) {
- // [nil]
- this.tuples = new ArrayList<>();
- } else {
- throw new TarantoolClientException("The received result cannot be converted to an array of tuples: %s",
- value.toString());
- }
- }
-
- private void setTuples(ArrayValue tupleArray, ValueConverter tupleConverter) {
- this.tuples = tupleArray.list().stream()
+ protected List tuples;
+
+ protected TarantoolResultImpl() {
+ }
+
+ public TarantoolResultImpl(ArrayValue value, ValueConverter valueConverter) {
+ // [[[],...]]
+ setItems(value, valueConverter);
+ }
+
+ protected void setItems(ArrayValue itemsArray, ValueConverter valueConverter) {
+ this.tuples = itemsArray.list().stream()
.map(v -> {
try {
- return tupleConverter.fromValue(v.asArrayValue());
+ return valueConverter.fromValue(v.asArrayValue());
} catch (MessageTypeCastException e) {
throw new TarantoolTupleConversionException(v, e);
}
@@ -69,10 +44,6 @@ private void setTuples(ArrayValue tupleArray, ValueConverter tupl
.collect(Collectors.toList());
}
- private static boolean hasRowsAndMetadata(Map valueMap) {
- return valueMap.containsKey(RESULT_META) && valueMap.containsKey(RESULT_ROWS);
- }
-
@Override
public int size() {
return this.tuples.size();
@@ -115,7 +86,7 @@ public boolean remove(Object o) {
@Override
public boolean containsAll(Collection> c) {
- return this.tuples.containsAll(c);
+ return new HashSet<>(this.tuples).containsAll(c);
}
@Override
diff --git a/src/main/java/io/tarantool/driver/core/metadata/SpacesMetadataProvider.java b/src/main/java/io/tarantool/driver/core/metadata/SpacesMetadataProvider.java
index 8aee60122..aa1a6c59e 100644
--- a/src/main/java/io/tarantool/driver/core/metadata/SpacesMetadataProvider.java
+++ b/src/main/java/io/tarantool/driver/core/metadata/SpacesMetadataProvider.java
@@ -63,7 +63,7 @@ private CompletableFuture> select(
throws TarantoolClientException {
CallResultMapper, SingleValueCallResult>> resultMapper =
client.getResultMapperFactoryFactory().singleValueTarantoolResultMapperFactory()
- .withTarantoolResultConverter(resultConverter, resultClass);
+ .withSingleValueArrayTarantoolResultConverter(resultConverter, resultClass);
return client.call(selectCmd, resultMapper);
}
}
diff --git a/src/main/java/io/tarantool/driver/core/space/ProxyTarantoolSpace.java b/src/main/java/io/tarantool/driver/core/space/ProxyTarantoolSpace.java
index 87a5f8a5e..f75bb1381 100644
--- a/src/main/java/io/tarantool/driver/core/space/ProxyTarantoolSpace.java
+++ b/src/main/java/io/tarantool/driver/core/space/ProxyTarantoolSpace.java
@@ -78,7 +78,7 @@ public ProxyTarantoolSpace(
@Override
public CompletableFuture delete(Conditions conditions) throws TarantoolClientException {
- return delete(conditions, tupleResultMapper(), ProxyDeleteOptions.create()
+ return delete(conditions, rowsMetadataTupleResultMapper(), ProxyDeleteOptions.create()
.withTimeout(config.getRequestTimeout())
);
}
@@ -88,7 +88,7 @@ public CompletableFuture delete(Conditions conditions, DeleteOptions options)
if (options == null) {
throw new IllegalArgumentException("Options should not be null");
}
- return delete(conditions, tupleResultMapper(), options);
+ return delete(conditions, rowsMetadataTupleResultMapper(), options);
}
private CompletableFuture delete(
@@ -113,7 +113,7 @@ private CompletableFuture delete(
@Override
public CompletableFuture insert(T tuple) throws TarantoolClientException {
- return insert(tuple, tupleResultMapper(), ProxyInsertOptions.create()
+ return insert(tuple, rowsMetadataTupleResultMapper(), ProxyInsertOptions.create()
.withTimeout(config.getRequestTimeout())
);
}
@@ -123,7 +123,7 @@ public CompletableFuture insert(T tuple, InsertOptions options) throws Tarant
if (options == null) {
throw new IllegalArgumentException("Options should not be null");
}
- return insert(tuple, tupleResultMapper(), options);
+ return insert(tuple, rowsMetadataTupleResultMapper(), options);
}
private CompletableFuture insert(
@@ -146,7 +146,7 @@ private CompletableFuture insert(
@Override
public CompletableFuture insertMany(Collection tuples) {
- return insertMany(tuples, tupleResultMapper(), ProxyInsertManyOptions.create()
+ return insertMany(tuples, rowsMetadataTupleResultMapper(), ProxyInsertManyOptions.create()
.withTimeout(config.getRequestTimeout())
.withStopOnError(true)
.withRollbackOnError(true)
@@ -159,7 +159,7 @@ public CompletableFuture insertMany(Collection tuples, InsertManyOptions o
if (options == null) {
throw new IllegalArgumentException("Options should not be null");
}
- return insertMany(tuples, tupleResultMapper(), options);
+ return insertMany(tuples, rowsMetadataTupleResultMapper(), options);
}
private CompletableFuture insertMany(
@@ -182,7 +182,7 @@ private CompletableFuture insertMany(
@Override
public CompletableFuture replace(T tuple) throws TarantoolClientException {
- return replace(tuple, tupleResultMapper(), ProxyReplaceOptions.create()
+ return replace(tuple, rowsMetadataTupleResultMapper(), ProxyReplaceOptions.create()
.withTimeout(config.getRequestTimeout())
);
}
@@ -192,7 +192,7 @@ public CompletableFuture replace(T tuple, ReplaceOptions options) throws Tara
if (options == null) {
throw new IllegalArgumentException("Options should not be null");
}
- return replace(tuple, tupleResultMapper(), options);
+ return replace(tuple, rowsMetadataTupleResultMapper(), options);
}
private CompletableFuture replace(
@@ -215,7 +215,7 @@ private CompletableFuture replace(
@Override
public CompletableFuture replaceMany(Collection tuples) throws TarantoolClientException {
- return replaceMany(tuples, tupleResultMapper(), ProxyReplaceManyOptions.create()
+ return replaceMany(tuples, rowsMetadataTupleResultMapper(), ProxyReplaceManyOptions.create()
.withTimeout(config.getRequestTimeout())
.withStopOnError(true)
.withRollbackOnError(true)
@@ -227,7 +227,7 @@ public CompletableFuture replaceMany(Collection tuples, ReplaceManyOptions
if (options == null) {
throw new IllegalArgumentException("Options should not be null");
}
- return replaceMany(tuples, tupleResultMapper(), options);
+ return replaceMany(tuples, rowsMetadataTupleResultMapper(), options);
}
private CompletableFuture replaceMany(
@@ -250,7 +250,7 @@ private CompletableFuture replaceMany(
@Override
public CompletableFuture select(Conditions conditions) throws TarantoolClientException {
- return select(conditions, tupleResultMapper(), ProxySelectOptions.create()
+ return select(conditions, rowsMetadataTupleResultMapper(), ProxySelectOptions.create()
.withTimeout(config.getRequestTimeout())
);
}
@@ -262,7 +262,7 @@ public CompletableFuture select(
if (options == null) {
throw new IllegalArgumentException("Options should not be null");
}
- return select(conditions, tupleResultMapper(), options);
+ return select(conditions, rowsMetadataTupleResultMapper(), options);
}
private CompletableFuture select(
@@ -286,8 +286,9 @@ private CompletableFuture select(
@Override
public CompletableFuture update(Conditions conditions, T tuple) {
- return update(conditions, makeOperationsFromTuple(tuple), tupleResultMapper(), ProxyUpdateOptions.create()
- .withTimeout(config.getRequestTimeout())
+ return update(conditions, makeOperationsFromTuple(tuple), rowsMetadataTupleResultMapper(),
+ ProxyUpdateOptions.create()
+ .withTimeout(config.getRequestTimeout())
);
}
@@ -296,7 +297,7 @@ public CompletableFuture update(Conditions conditions, T tuple, UpdateOptions
if (options == null) {
throw new IllegalArgumentException("Options should not be null");
}
- return update(conditions, makeOperationsFromTuple(tuple), tupleResultMapper(), options);
+ return update(conditions, makeOperationsFromTuple(tuple), rowsMetadataTupleResultMapper(), options);
}
/**
@@ -309,7 +310,7 @@ public CompletableFuture update(Conditions conditions, T tuple, UpdateOptions
@Override
public CompletableFuture update(Conditions conditions, TupleOperations operations) {
- return update(conditions, operations, tupleResultMapper(), ProxyUpdateOptions.create()
+ return update(conditions, operations, rowsMetadataTupleResultMapper(), ProxyUpdateOptions.create()
.withTimeout(config.getRequestTimeout())
);
}
@@ -319,7 +320,7 @@ public CompletableFuture update(Conditions conditions, TupleOperations operat
if (options == null) {
throw new IllegalArgumentException("Options should not be null");
}
- return update(conditions, operations, tupleResultMapper(), options);
+ return update(conditions, operations, rowsMetadataTupleResultMapper(), options);
}
private CompletableFuture update(
@@ -345,7 +346,7 @@ private CompletableFuture update(
@Override
public CompletableFuture upsert(Conditions conditions, T tuple, TupleOperations operations) {
- return upsert(conditions, tuple, operations, tupleResultMapper(), ProxyUpsertOptions.create()
+ return upsert(conditions, tuple, operations, rowsMetadataTupleResultMapper(), ProxyUpsertOptions.create()
.withTimeout(config.getRequestTimeout())
);
}
@@ -357,7 +358,7 @@ public CompletableFuture upsert(
if (options == null) {
throw new IllegalArgumentException("Options should not be null");
}
- return upsert(conditions, tuple, operations, tupleResultMapper(), options);
+ return upsert(conditions, tuple, operations, rowsMetadataTupleResultMapper(), options);
}
private CompletableFuture upsert(
@@ -404,7 +405,7 @@ public CompletableFuture truncate() throws TarantoolClientException {
*
* @return configured mapper with {@link ArrayValue} to {@code T} converter
*/
- protected abstract CallResultMapper> tupleResultMapper();
+ protected abstract CallResultMapper> rowsMetadataTupleResultMapper();
private CompletableFuture executeOperation(ProxyOperation operation) {
return operation.execute();
diff --git a/src/main/java/io/tarantool/driver/core/space/ProxyTarantoolTupleSpace.java b/src/main/java/io/tarantool/driver/core/space/ProxyTarantoolTupleSpace.java
index dcf29e42a..63d09b5b2 100644
--- a/src/main/java/io/tarantool/driver/core/space/ProxyTarantoolTupleSpace.java
+++ b/src/main/java/io/tarantool/driver/core/space/ProxyTarantoolTupleSpace.java
@@ -52,9 +52,9 @@ protected TupleOperations makeOperationsFromTuple(TarantoolTuple tuple) {
@Override
protected CallResultMapper, SingleValueCallResult>>
- tupleResultMapper() {
- return client.getResultMapperFactoryFactory().defaultTupleSingleResultMapperFactory()
- .withDefaultTupleValueConverter(config.getMessagePackMapper(), getMetadata());
+ rowsMetadataTupleResultMapper() {
+ return client.getResultMapperFactoryFactory().singleValueTupleResultMapperFactory()
+ .withSingleValueRowsMetadataToTarantoolTupleResultMapper(config.getMessagePackMapper(), getMetadata());
}
@Override
diff --git a/src/main/java/io/tarantool/driver/core/space/TarantoolSpace.java b/src/main/java/io/tarantool/driver/core/space/TarantoolSpace.java
index 15a1c53fd..25ac8d9d1 100644
--- a/src/main/java/io/tarantool/driver/core/space/TarantoolSpace.java
+++ b/src/main/java/io/tarantool/driver/core/space/TarantoolSpace.java
@@ -61,7 +61,7 @@ public TarantoolSpace(
@Override
public CompletableFuture delete(Conditions conditions) throws TarantoolClientException {
- return delete(conditions, tupleResultMapper());
+ return delete(conditions, arrayTupleResultMapper());
}
private CompletableFuture delete(Conditions conditions, MessagePackValueMapper resultMapper)
@@ -83,7 +83,7 @@ private CompletableFuture delete(Conditions conditions, MessagePackValueMappe
@Override
public CompletableFuture insert(T tuple) throws TarantoolClientException {
- return insert(tuple, tupleResultMapper());
+ return insert(tuple, arrayTupleResultMapper());
}
@Override
@@ -110,7 +110,7 @@ private CompletableFuture insert(T tuple, MessagePackValueMapper resultMapper
@Override
public CompletableFuture replace(T tuple) throws TarantoolClientException {
- return replace(tuple, tupleResultMapper());
+ return replace(tuple, arrayTupleResultMapper());
}
@Override
@@ -137,7 +137,7 @@ private CompletableFuture replace(T tuple, MessagePackValueMapper resultMappe
@Override
public CompletableFuture select(Conditions conditions) throws TarantoolClientException {
- return select(conditions, tupleResultMapper());
+ return select(conditions, arrayTupleResultMapper());
}
private CompletableFuture select(Conditions conditions, MessagePackValueMapper resultMapper)
@@ -161,7 +161,7 @@ private CompletableFuture select(Conditions conditions, MessagePackValueMappe
@Override
public CompletableFuture update(Conditions conditions, T tuple) {
- return update(conditions, makeOperationsFromTuple(tuple), tupleResultMapper());
+ return update(conditions, makeOperationsFromTuple(tuple), arrayTupleResultMapper());
}
/**
@@ -174,7 +174,7 @@ public CompletableFuture update(Conditions conditions, T tuple) {
@Override
public CompletableFuture update(Conditions conditions, TupleOperations operations) {
- return update(conditions, operations, tupleResultMapper());
+ return update(conditions, operations, arrayTupleResultMapper());
}
private CompletableFuture update(
@@ -207,7 +207,7 @@ private CompletableFuture update(
@Override
public CompletableFuture upsert(Conditions conditions, T tuple, TupleOperations operations) {
- return upsert(conditions, tuple, operations, tupleResultMapper());
+ return upsert(conditions, tuple, operations, arrayTupleResultMapper());
}
private CompletableFuture upsert(
@@ -234,7 +234,7 @@ private CompletableFuture upsert(
@Override
public CompletableFuture truncate() throws TarantoolClientException {
- return truncate(tupleResultMapper());
+ return truncate(arrayTupleResultMapper());
}
private CompletableFuture truncate(MessagePackValueMapper resultMapper)
@@ -257,7 +257,7 @@ private CompletableFuture truncate(MessagePackValueMapper resultMapper)
*
* @return configured mapper with {@link ArrayValue} to {@code T} converter
*/
- protected abstract MessagePackValueMapper tupleResultMapper();
+ protected abstract MessagePackValueMapper arrayTupleResultMapper();
private CompletableFuture sendRequest(TarantoolRequest request, MessagePackValueMapper resultMapper) {
return connectionManager.getConnection().thenCompose(c -> c.sendRequest(request, resultMapper));
diff --git a/src/main/java/io/tarantool/driver/core/space/TarantoolTupleSpace.java b/src/main/java/io/tarantool/driver/core/space/TarantoolTupleSpace.java
index 06b4c0f6a..b9c99b666 100644
--- a/src/main/java/io/tarantool/driver/core/space/TarantoolTupleSpace.java
+++ b/src/main/java/io/tarantool/driver/core/space/TarantoolTupleSpace.java
@@ -50,9 +50,9 @@ protected TupleOperations makeOperationsFromTuple(TarantoolTuple tuple) {
}
@Override
- protected MessagePackValueMapper tupleResultMapper() {
- return client.getResultMapperFactoryFactory().defaultTupleResultMapperFactory()
- .withDefaultTupleValueConverter(config.getMessagePackMapper(), getMetadata());
+ protected MessagePackValueMapper arrayTupleResultMapper() {
+ return client.getResultMapperFactoryFactory().arrayTupleResultMapperFactory()
+ .withArrayValueToTarantoolTupleResultConverter(config.getMessagePackMapper(), getMetadata());
}
@Override
diff --git a/src/main/java/io/tarantool/driver/mappers/AbstractResultMapper.java b/src/main/java/io/tarantool/driver/mappers/AbstractResultMapper.java
index e82aa7d53..844b61e89 100644
--- a/src/main/java/io/tarantool/driver/mappers/AbstractResultMapper.java
+++ b/src/main/java/io/tarantool/driver/mappers/AbstractResultMapper.java
@@ -1,10 +1,11 @@
package io.tarantool.driver.mappers;
import io.tarantool.driver.mappers.converters.ValueConverter;
-import org.msgpack.value.ArrayValue;
+import io.tarantool.driver.mappers.converters.ValueConverterWithInputTypeWrapper;
import org.msgpack.value.Value;
import org.msgpack.value.ValueType;
+import java.util.List;
import java.util.Optional;
/**
@@ -27,12 +28,62 @@ public abstract class AbstractResultMapper implements MessagePackValueMapper
*/
public AbstractResultMapper(
MessagePackValueMapper valueMapper,
- ValueConverter resultConverter,
+ ValueConverter extends Value, ? extends T> resultConverter,
Class extends T> resultClass) {
this.valueMapper = valueMapper;
valueMapper.registerValueConverter(ValueType.ARRAY, resultClass, resultConverter);
}
+ public AbstractResultMapper(
+ MessagePackValueMapper valueMapper,
+ ValueConverter extends Value, ? extends T> resultConverter) {
+ this.valueMapper = valueMapper;
+ valueMapper.registerValueConverterWithoutTargetClass(ValueType.ARRAY, resultConverter);
+ }
+
+ public AbstractResultMapper(
+ MessagePackValueMapper valueMapper,
+ ValueType valueType,
+ ValueConverter extends Value, ? extends T> resultConverter,
+ Class extends T> resultClass) {
+ this.valueMapper = valueMapper;
+ valueMapper.registerValueConverter(valueType, resultClass, resultConverter);
+ }
+
+ public AbstractResultMapper(
+ MessagePackValueMapper valueMapper,
+ ValueType valueType,
+ ValueConverter extends Value, ? extends T> resultConverter) {
+ this.valueMapper = valueMapper;
+ valueMapper.registerValueConverterWithoutTargetClass(valueType, resultConverter);
+ }
+
+ public AbstractResultMapper(
+ MessagePackValueMapper valueMapper,
+ List> converters,
+ Class extends T> resultClass) {
+ this.valueMapper = valueMapper;
+ for (ValueConverterWithInputTypeWrapper converter :
+ converters) {
+ valueMapper.registerValueConverter(
+ converter.getValueType(),
+ resultClass,
+ converter.getValueConverter());
+ }
+ }
+
+ public AbstractResultMapper(
+ MessagePackValueMapper valueMapper,
+ List> converters) {
+ this.valueMapper = valueMapper;
+ for (ValueConverterWithInputTypeWrapper converter :
+ converters) {
+ valueMapper.registerValueConverterWithoutTargetClass(
+ converter.getValueType(),
+ converter.getValueConverter());
+ }
+ }
+
@Override
public O fromValue(V v) throws MessagePackValueMapperException {
return valueMapper.fromValue(v);
@@ -51,6 +102,12 @@ public void registerValueConverter(
valueMapper.registerValueConverter(valueType, objectClass, converter);
}
+ @Override
+ public void registerValueConverterWithoutTargetClass(
+ ValueType valueType, ValueConverter converter) {
+ valueMapper.registerValueConverterWithoutTargetClass(valueType, converter);
+ }
+
@Override
public Optional> getValueConverter(
ValueType valueType,
diff --git a/src/main/java/io/tarantool/driver/mappers/AbstractResultMapperFactory.java b/src/main/java/io/tarantool/driver/mappers/AbstractResultMapperFactory.java
deleted file mode 100644
index 654f70fe7..000000000
--- a/src/main/java/io/tarantool/driver/mappers/AbstractResultMapperFactory.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package io.tarantool.driver.mappers;
-
-import io.tarantool.driver.exceptions.TarantoolClientException;
-import io.tarantool.driver.mappers.converters.ValueConverter;
-import org.msgpack.value.ArrayValue;
-
-/**
- * Base class for result mapper factories.
- *
- * @param target result mapper type
- * @param target result type
- * @author Alexey Kuzin
- */
-public abstract class AbstractResultMapperFactory> {
-
- /**
- * Basic constructor
- */
- public AbstractResultMapperFactory() {
- }
-
- /**
- * Instantiate the mapper for result contents
- *
- * @param valueMapper MessagePack value-to-object mapper for result contents
- * @param valueConverter converter for result contents (an array)
- * @param resultClass result type
- * @return new mapper instance
- */
- protected abstract T createMapper(
- MessagePackValueMapper valueMapper,
- ValueConverter valueConverter,
- Class extends O> resultClass);
-
- /**
- * Create {@link AbstractResultMapper} instance with the passed converter.
- *
- * @param valueMapper MessagePack value-to-object mapper for result contents
- * @param valueConverter entity-to-object converter
- * @return a mapper instance
- */
- public T withConverter(MessagePackValueMapper valueMapper, ValueConverter valueConverter) {
- try {
- return withConverter(
- valueMapper, valueConverter, MapperReflectionUtils.getConverterTargetType(valueConverter));
- } catch (InterfaceParameterClassNotFoundException e) {
- throw new TarantoolClientException(e);
- }
- }
-
- /**
- * Create {@link AbstractResultMapper} instance with the passed converter.
- *
- * @param valueMapper MessagePack value-to-object mapper for result contents
- * @param valueConverter entity-to-object converter
- * @param resultClass target result type class. Necessary for resolving ambiguity when more than one suitable
- * converters are present in the configured mapper
- * @return a mapper instance
- */
- public T withConverter(
- MessagePackValueMapper valueMapper,
- ValueConverter valueConverter,
- Class extends O> resultClass) {
- return createMapper(valueMapper, valueConverter, resultClass);
- }
-
-}
diff --git a/src/main/java/io/tarantool/driver/mappers/CallResultMapper.java b/src/main/java/io/tarantool/driver/mappers/CallResultMapper.java
index 4b11f9cdc..b915119aa 100644
--- a/src/main/java/io/tarantool/driver/mappers/CallResultMapper.java
+++ b/src/main/java/io/tarantool/driver/mappers/CallResultMapper.java
@@ -2,7 +2,11 @@
import io.tarantool.driver.api.CallResult;
import io.tarantool.driver.mappers.converters.ValueConverter;
-import org.msgpack.value.ArrayValue;
+import io.tarantool.driver.mappers.converters.ValueConverterWithInputTypeWrapper;
+import org.msgpack.value.Value;
+import org.msgpack.value.ValueType;
+
+import java.util.List;
/**
* Special tuple mapper for API function call results.
@@ -25,9 +29,36 @@ public class CallResultMapper> extends AbstractResult
* @param resultClass tuple result class
*/
public CallResultMapper(
- MessagePackValueMapper valueMapper,
- ValueConverter resultConverter,
+ MessagePackValueMapper valueMapper, ValueConverter extends Value, ? extends R> resultConverter,
Class extends R> resultClass) {
super(valueMapper, resultConverter, resultClass);
}
+
+ public CallResultMapper(
+ MessagePackValueMapper valueMapper, ValueConverter extends Value, ? extends R> resultConverter) {
+ super(valueMapper, resultConverter);
+ }
+
+ public CallResultMapper(
+ MessagePackValueMapper valueMapper, ValueType valueType,
+ ValueConverter extends Value, ? extends R> resultConverter, Class extends R> resultClass) {
+ super(valueMapper, valueType, resultConverter, resultClass);
+ }
+
+ public CallResultMapper(
+ MessagePackValueMapper valueMapper, ValueType valueType,
+ ValueConverter extends Value, ? extends R> resultConverter) {
+ super(valueMapper, valueType, resultConverter);
+ }
+
+ public CallResultMapper(
+ MessagePackValueMapper valueMapper, List> converters,
+ Class extends R> resultClass) {
+ super(valueMapper, converters, resultClass);
+ }
+
+ public CallResultMapper(
+ MessagePackValueMapper valueMapper, List> converters) {
+ super(valueMapper, converters);
+ }
}
diff --git a/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapper.java b/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapper.java
index 92e3edfe6..eb39c59cc 100644
--- a/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapper.java
+++ b/src/main/java/io/tarantool/driver/mappers/DefaultMessagePackMapper.java
@@ -2,13 +2,14 @@
import io.tarantool.driver.api.MessagePackMapperBuilder;
import io.tarantool.driver.exceptions.TarantoolClientException;
+import io.tarantool.driver.mappers.converters.ConverterWrapper;
import io.tarantool.driver.mappers.converters.ObjectConverter;
import io.tarantool.driver.mappers.converters.ValueConverter;
import io.tarantool.driver.mappers.converters.object.DefaultListToArrayValueConverter;
import io.tarantool.driver.mappers.converters.object.DefaultMapToMapValueConverter;
-import io.tarantool.driver.mappers.converters.value.DefaultArrayValueToListConverter;
-import io.tarantool.driver.mappers.converters.value.DefaultMapValueToMapConverter;
-import io.tarantool.driver.mappers.converters.value.DefaultNullToNilValueConverter;
+import io.tarantool.driver.mappers.converters.value.defaults.DefaultArrayValueToListConverter;
+import io.tarantool.driver.mappers.converters.value.defaults.DefaultMapValueToMapConverter;
+import io.tarantool.driver.mappers.converters.value.defaults.DefaultNullToNilValueConverter;
import org.msgpack.value.NilValue;
import org.msgpack.value.Value;
import org.msgpack.value.ValueType;
@@ -168,6 +169,13 @@ public void registerValueConverter(
converters.add(0, new ConverterWrapper<>(converter, objectClass));
}
+ public void registerValueConverterWithoutTargetClass(ValueType valueType,
+ ValueConverter converter) {
+ List>> converters =
+ valueConverters.computeIfAbsent(valueType, k -> new LinkedList<>());
+ converters.add(0, new ConverterWrapper<>(converter, Object.class));
+ }
+
/**
* Check if the specified converter can convert to the specified object type
*/
diff --git a/src/main/java/io/tarantool/driver/mappers/DefaultMultiValueResultMapper.java b/src/main/java/io/tarantool/driver/mappers/DefaultMultiValueResultMapper.java
index 3093f5e4d..6184e5358 100644
--- a/src/main/java/io/tarantool/driver/mappers/DefaultMultiValueResultMapper.java
+++ b/src/main/java/io/tarantool/driver/mappers/DefaultMultiValueResultMapper.java
@@ -2,7 +2,8 @@
import io.tarantool.driver.api.MultiValueCallResult;
import io.tarantool.driver.mappers.converters.ValueConverter;
-import io.tarantool.driver.mappers.converters.value.custom.MultiValueCallResultConverter;
+import io.tarantool.driver.mappers.converters.value.ArrayValueToMultiValueCallResultSimpleConverter;
+import io.tarantool.driver.mappers.factories.DefaultMessagePackMapperFactory;
import org.msgpack.value.ArrayValue;
import java.util.List;
@@ -34,6 +35,6 @@ private static > Class> getResul
private static > ValueConverter>
defaultValueConverter(MessagePackValueMapper valueMapper) {
- return new MultiValueCallResultConverter<>(valueMapper::fromValue);
+ return new ArrayValueToMultiValueCallResultSimpleConverter<>(valueMapper::fromValue);
}
}
diff --git a/src/main/java/io/tarantool/driver/mappers/DefaultSingleValueResultMapper.java b/src/main/java/io/tarantool/driver/mappers/DefaultSingleValueResultMapper.java
index db71bcc60..2a6a4ad5a 100644
--- a/src/main/java/io/tarantool/driver/mappers/DefaultSingleValueResultMapper.java
+++ b/src/main/java/io/tarantool/driver/mappers/DefaultSingleValueResultMapper.java
@@ -2,7 +2,8 @@
import io.tarantool.driver.api.SingleValueCallResult;
import io.tarantool.driver.mappers.converters.ValueConverter;
-import io.tarantool.driver.mappers.converters.value.custom.SingleValueCallResultConverter;
+import io.tarantool.driver.mappers.converters.value.ArrayValueToSingleValueCallResultSimpleConverter;
+import io.tarantool.driver.mappers.factories.DefaultMessagePackMapperFactory;
import org.msgpack.value.ArrayValue;
/**
@@ -31,6 +32,6 @@ private static Class> getResultClass(Class conte
private static ValueConverter> defaultValueConverter(
MessagePackValueMapper valueMapper) {
- return new SingleValueCallResultConverter<>(valueMapper::fromValue);
+ return new ArrayValueToSingleValueCallResultSimpleConverter<>(valueMapper::fromValue);
}
}
diff --git a/src/main/java/io/tarantool/driver/mappers/MapperReflectionUtils.java b/src/main/java/io/tarantool/driver/mappers/MapperReflectionUtils.java
index cc5f6f5ce..249f1167a 100644
--- a/src/main/java/io/tarantool/driver/mappers/MapperReflectionUtils.java
+++ b/src/main/java/io/tarantool/driver/mappers/MapperReflectionUtils.java
@@ -8,7 +8,7 @@
/**
* Contains helper methods for converter classes lookup and determining its parameters at runtime
*/
-final class MapperReflectionUtils {
+public final class MapperReflectionUtils {
private MapperReflectionUtils() {
}
@@ -23,7 +23,8 @@ private MapperReflectionUtils() {
* cannot be determined or is not found
*/
@SuppressWarnings("unchecked")
- static Class getConverterTargetType(Object converter) throws InterfaceParameterClassNotFoundException {
+ public static Class getConverterTargetType(Object converter)
+ throws InterfaceParameterClassNotFoundException {
Type[] genericInterfaces = getGenericInterfaces(converter);
if (genericInterfaces.length < 1) {
throw new RuntimeException(
diff --git a/src/main/java/io/tarantool/driver/mappers/MessagePackValueMapper.java b/src/main/java/io/tarantool/driver/mappers/MessagePackValueMapper.java
index 9566cb1af..eff854fe7 100644
--- a/src/main/java/io/tarantool/driver/mappers/MessagePackValueMapper.java
+++ b/src/main/java/io/tarantool/driver/mappers/MessagePackValueMapper.java
@@ -52,6 +52,9 @@ void registerValueConverter(
ValueType valueType, Class extends O> objectClass,
ValueConverter converter);
+ void registerValueConverterWithoutTargetClass(
+ ValueType valueType, ValueConverter converter);
+
/**
* Get a converter capable of converting from the source entity class to the target class
*
diff --git a/src/main/java/io/tarantool/driver/mappers/ResultMapperFactoryFactory.java b/src/main/java/io/tarantool/driver/mappers/ResultMapperFactoryFactory.java
deleted file mode 100644
index d299d4857..000000000
--- a/src/main/java/io/tarantool/driver/mappers/ResultMapperFactoryFactory.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package io.tarantool.driver.mappers;
-
-import io.tarantool.driver.api.MultiValueCallResult;
-import io.tarantool.driver.api.SingleValueCallResult;
-import io.tarantool.driver.api.TarantoolResult;
-
-import java.util.List;
-
-/**
- * Provides different factories for creating result mappers
- *
- * @author Alexey Kuzin
- */
-public interface ResultMapperFactoryFactory {
- /**
- * Default factory for call result with a list of tuples.
- * Use this factory for handling default standalone server protocol results.
- *
- * @return default factory for array of tuple results
- */
- TarantoolTupleResultMapperFactory defaultTupleResultMapperFactory();
-
- /**
- * Default factory for single value stored function call result with a list of tuples.
- * Use this factory for handling default proxy function call results like tarantool/crud module API.
- *
- * @return default factory for single value call result with a list of tuples
- */
- TarantoolTupleSingleResultMapperFactory defaultTupleSingleResultMapperFactory();
-
- /**
- * Default factory for multi value stored function call result, where each return item is a tuple.
- * Use this factory for handling proxy function call results which return tuples as a multi-return result.
- *
- * @return default factory for multi value call result, where each item is a tuple
- */
- TarantoolTupleMultiResultMapperFactory defaultTupleMultiResultMapperFactory();
-
- /**
- * Create a factory for mapping Tarantool server protocol result to a list of tuples as {@link TarantoolResult}
- *
- * @param target tuple type
- * @return new or existing factory instance
- */
- TupleResultMapperFactory tupleResultMapperFactory();
-
- /**
- * Create a factory for mapping stored function call results to {@link SingleValueCallResult}
- *
- * @param target result type
- * @return new or existing factory instance
- */
- SingleValueResultMapperFactory singleValueResultMapperFactory();
-
- /**
- * Create a factory for mapping stored function call result to {@link SingleValueCallResult} containing a list
- * of tuples mapped to {@link TarantoolResult}
- *
- * @param target tuple type
- * @return new or existing factory instance
- */
- SingleValueTarantoolResultMapperFactory singleValueTarantoolResultMapperFactory();
-
- /**
- * Create a factory for mapping stored function call results to {@link MultiValueCallResult}
- *
- * @param target result content type
- * @param target result type
- * @return new or existing factory instance
- */
- > MultiValueResultMapperFactory multiValueResultMapperFactory();
-
- /**
- * Create a factory for mapping stored function call result to {@link MultiValueCallResult} containing a list
- * of tuples mapped to {@link TarantoolResult}
- *
- * @param target tuple type
- * @return new or existing factory instance
- */
- MultiValueTarantoolResultMapperFactory multiValueTarantoolResultMapperFactory();
-}
diff --git a/src/main/java/io/tarantool/driver/mappers/TarantoolCallResultMapperFactory.java b/src/main/java/io/tarantool/driver/mappers/TarantoolCallResultMapperFactory.java
deleted file mode 100644
index 13833b725..000000000
--- a/src/main/java/io/tarantool/driver/mappers/TarantoolCallResultMapperFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package io.tarantool.driver.mappers;
-
-import io.tarantool.driver.api.CallResult;
-import io.tarantool.driver.mappers.converters.ValueConverter;
-import org.msgpack.value.ArrayValue;
-
-/**
- * Factory for {@link CallResultMapper} instances used for calling API functions on Tarantool instance
- *
- * @param target result content type
- * @param target result type
- * @author Alexey Kuzin
- */
-public class TarantoolCallResultMapperFactory> extends
- AbstractResultMapperFactory> {
-
- /**
- * Basic constructor
- */
- public TarantoolCallResultMapperFactory() {
- super();
- }
-
- @Override
- protected CallResultMapper createMapper(
- MessagePackValueMapper valueMapper,
- ValueConverter valueConverter,
- Class extends R> resultClass) {
- return new CallResultMapper<>(valueMapper, valueConverter, resultClass);
- }
-}
diff --git a/src/main/java/io/tarantool/driver/mappers/TarantoolResultMapper.java b/src/main/java/io/tarantool/driver/mappers/TarantoolResultMapper.java
index 0822ca9f5..1502f02d5 100644
--- a/src/main/java/io/tarantool/driver/mappers/TarantoolResultMapper.java
+++ b/src/main/java/io/tarantool/driver/mappers/TarantoolResultMapper.java
@@ -2,26 +2,61 @@
import io.tarantool.driver.api.TarantoolResult;
import io.tarantool.driver.mappers.converters.ValueConverter;
-import org.msgpack.value.ArrayValue;
+import io.tarantool.driver.mappers.converters.ValueConverterWithInputTypeWrapper;
+import org.msgpack.value.Value;
+import org.msgpack.value.ValueType;
+
+import java.util.List;
/**
- * Mapper from array of MessagePack tuples to {@link TarantoolResult}
+ * Mapper from array of MessagePack values to {@link TarantoolResult} with specified inner structure
*
* @param target tuple type
* @author Alexey Kuzin
*/
public class TarantoolResultMapper extends AbstractResultMapper> {
+ public TarantoolResultMapper(
+ MessagePackValueMapper valueMapper,
+ ValueConverter extends Value, ? extends TarantoolResult> resultConverter,
+ Class extends TarantoolResult> resultClass) {
+ super(valueMapper, resultConverter, resultClass);
+ }
+
+ public TarantoolResultMapper(
+ MessagePackValueMapper valueMapper,
+ ValueConverter extends Value, ? extends TarantoolResult> resultConverter) {
+ super(valueMapper, resultConverter);
+ }
+
/**
* Basic constructor
*
- * @param valueMapper value mapper to be used for result rows
- * @param tupleConverter MessagePack result array to tuple result converter
- * @param resultClass tuple result class
+ * @param valueMapper value mapper to be used for result rows
+ * @param valueType MessagePack source type
+ * @param resultConverter MessagePack result array to TarantoolResult with inner specified structure
+ * @param resultClass tuple result class
*/
public TarantoolResultMapper(
- MessagePackValueMapper valueMapper,
- ValueConverter> tupleConverter,
+ MessagePackValueMapper valueMapper, ValueType valueType,
+ ValueConverter extends Value, ? extends TarantoolResult> resultConverter,
Class extends TarantoolResult> resultClass) {
- super(valueMapper, tupleConverter, resultClass);
+ super(valueMapper, valueType, resultConverter, resultClass);
+ }
+
+ public TarantoolResultMapper(
+ MessagePackValueMapper valueMapper, ValueType valueType,
+ ValueConverter extends Value, ? extends TarantoolResult> resultConverter) {
+ super(valueMapper, valueType, resultConverter);
+ }
+
+ public TarantoolResultMapper(
+ MessagePackValueMapper valueMapper, List>> converters,
+ Class extends TarantoolResult> resultClass) {
+ super(valueMapper, converters, resultClass);
+ }
+
+ public TarantoolResultMapper(
+ MessagePackValueMapper valueMapper, List>> converters) {
+ super(valueMapper, converters);
}
}
diff --git a/src/main/java/io/tarantool/driver/mappers/TarantoolResultMapperFactory.java b/src/main/java/io/tarantool/driver/mappers/TarantoolResultMapperFactory.java
deleted file mode 100644
index 61399062d..000000000
--- a/src/main/java/io/tarantool/driver/mappers/TarantoolResultMapperFactory.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package io.tarantool.driver.mappers;
-
-import io.tarantool.driver.api.TarantoolResult;
-import io.tarantool.driver.mappers.converters.ValueConverter;
-import org.msgpack.value.ArrayValue;
-
-/**
- * Factory for {@link TarantoolResultMapper} instances used for handling box protocol operation results returning
- * {@link TarantoolResult} (array of tuples)
- *
- * @param target tuple type
- * @author Alexey Kuzin
- */
-public class TarantoolResultMapperFactory extends
- AbstractResultMapperFactory, TarantoolResultMapper> {
-
- /**
- * Basic constructor
- */
- public TarantoolResultMapperFactory() {
- super();
- }
-
- @Override
- protected TarantoolResultMapper createMapper(
- MessagePackValueMapper valueMapper,
- ValueConverter> valueConverter,
- Class extends TarantoolResult> resultClass) {
- return new TarantoolResultMapper<>(valueMapper, valueConverter, resultClass);
- }
-}
diff --git a/src/main/java/io/tarantool/driver/mappers/TarantoolTupleMultiResultMapperFactory.java b/src/main/java/io/tarantool/driver/mappers/TarantoolTupleMultiResultMapperFactory.java
deleted file mode 100644
index 35259e81d..000000000
--- a/src/main/java/io/tarantool/driver/mappers/TarantoolTupleMultiResultMapperFactory.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package io.tarantool.driver.mappers;
-
-import io.tarantool.driver.api.MultiValueCallResult;
-import io.tarantool.driver.api.TarantoolResult;
-import io.tarantool.driver.api.metadata.TarantoolSpaceMetadata;
-import io.tarantool.driver.api.tuple.TarantoolTuple;
-import io.tarantool.driver.api.tuple.TarantoolTupleMultiResult;
-import io.tarantool.driver.mappers.converters.value.custom.TarantoolTupleConverter;
-
-/**
- * Factory for {@link CallResultMapper} instances used for handling results with {@link TarantoolTuple}s as
- * multi-return result items
- *
- * @author Alexey Kuzin
- */
-public class TarantoolTupleMultiResultMapperFactory
- extends MultiValueTarantoolResultMapperFactory {
-
- /**
- * Basic constructor
- */
- public TarantoolTupleMultiResultMapperFactory() {
- super();
- }
-
- /**
- * Basic constructor with mapper
- *
- * @param messagePackMapper MessagePack-to-entity mapper for result contents conversion
- */
- public TarantoolTupleMultiResultMapperFactory(MessagePackMapper messagePackMapper) {
- super(messagePackMapper);
- }
-
- /**
- * Get default {@link TarantoolTuple} converter
- *
- * @param messagePackMapper MessagePack-to-entity mapper for result contents conversion
- * @param spaceMetadata configured {@link TarantoolSpaceMetadata} instance
- * @return default mapper instance configured with {@link TarantoolTupleConverter} instance
- */
- public CallResultMapper,
- MultiValueCallResult>>
- withDefaultTupleValueConverter(MessagePackMapper messagePackMapper, TarantoolSpaceMetadata spaceMetadata) {
- return withTarantoolResultConverter(
- new TarantoolTupleConverter(messagePackMapper, spaceMetadata),
- TarantoolTupleMultiResult.class);
- }
-}
diff --git a/src/main/java/io/tarantool/driver/mappers/TarantoolTupleResultMapperFactory.java b/src/main/java/io/tarantool/driver/mappers/TarantoolTupleResultMapperFactory.java
deleted file mode 100644
index 1b98991d0..000000000
--- a/src/main/java/io/tarantool/driver/mappers/TarantoolTupleResultMapperFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package io.tarantool.driver.mappers;
-
-import io.tarantool.driver.api.metadata.TarantoolSpaceMetadata;
-import io.tarantool.driver.api.tuple.TarantoolTuple;
-import io.tarantool.driver.api.tuple.TarantoolTupleResult;
-import io.tarantool.driver.mappers.converters.value.custom.TarantoolTupleConverter;
-
-/**
- * Factory for {@link TarantoolResultMapper} instances used for handling results with {@link TarantoolTuple}s
- *
- * @author Alexey Kuzin
- */
-public class TarantoolTupleResultMapperFactory extends TupleResultMapperFactory {
-
- /**
- * Basic constructor
- */
- public TarantoolTupleResultMapperFactory() {
- super();
- }
-
- /**
- * Basic constructor with mapper
- *
- * @param messagePackMapper MessagePack-to-object mapper for tuple contents
- */
- public TarantoolTupleResultMapperFactory(MessagePackMapper messagePackMapper) {
- super(messagePackMapper);
- }
-
- /**
- * Get default {@link TarantoolTuple} converter
- *
- * @param messagePackMapper MessagePack-to-entity mapper for result contents conversion
- * @param spaceMetadata configured {@link TarantoolSpaceMetadata} instance
- * @return default mapper instance configured with {@link TarantoolTupleConverter} instance
- */
- public TarantoolResultMapper withDefaultTupleValueConverter(
- MessagePackMapper messagePackMapper, TarantoolSpaceMetadata spaceMetadata) {
- return withTupleValueConverter(
- new TarantoolTupleConverter(messagePackMapper, spaceMetadata), TarantoolTupleResult.class);
- }
-}
diff --git a/src/main/java/io/tarantool/driver/mappers/TarantoolTupleSingleResultMapperFactory.java b/src/main/java/io/tarantool/driver/mappers/TarantoolTupleSingleResultMapperFactory.java
deleted file mode 100644
index a4292fc1b..000000000
--- a/src/main/java/io/tarantool/driver/mappers/TarantoolTupleSingleResultMapperFactory.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package io.tarantool.driver.mappers;
-
-import io.tarantool.driver.api.SingleValueCallResult;
-import io.tarantool.driver.api.TarantoolResult;
-import io.tarantool.driver.api.metadata.TarantoolSpaceMetadata;
-import io.tarantool.driver.api.tuple.TarantoolTuple;
-import io.tarantool.driver.api.tuple.TarantoolTupleSingleResult;
-import io.tarantool.driver.mappers.converters.value.custom.TarantoolTupleConverter;
-
-/**
- * Factory for {@link CallResultMapper} instances used for handling results with {@link TarantoolTuple}s
- *
- * @author Alexey Kuzin
- */
-public class TarantoolTupleSingleResultMapperFactory
- extends SingleValueTarantoolResultMapperFactory {
-
- /**
- * Basic constructor
- */
- public TarantoolTupleSingleResultMapperFactory() {
- super();
- }
-
- /**
- * Basic constructor with mapper
- *
- * @param messagePackMapper mapper for MessagePack entities in tuple fields to Java objects
- */
- public TarantoolTupleSingleResultMapperFactory(MessagePackMapper messagePackMapper) {
- super(messagePackMapper);
- }
-
- /**
- * Get default {@link TarantoolTuple} converter
- *
- * @param messagePackMapper MessagePack-to-entity mapper for result contents conversion
- * @param spaceMetadata configured {@link TarantoolSpaceMetadata} instance
- * @return default mapper instance configured with {@link TarantoolTupleConverter} instance
- */
- public CallResultMapper, SingleValueCallResult>>
- withDefaultTupleValueConverter(MessagePackMapper messagePackMapper, TarantoolSpaceMetadata spaceMetadata) {
- return withTarantoolResultConverter(
- new TarantoolTupleConverter(messagePackMapper, spaceMetadata),
- TarantoolTupleSingleResult.class);
- }
-}
diff --git a/src/main/java/io/tarantool/driver/mappers/TupleResultMapperFactory.java b/src/main/java/io/tarantool/driver/mappers/TupleResultMapperFactory.java
deleted file mode 100644
index d9d57b0df..000000000
--- a/src/main/java/io/tarantool/driver/mappers/TupleResultMapperFactory.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package io.tarantool.driver.mappers;
-
-import io.tarantool.driver.api.TarantoolResult;
-import io.tarantool.driver.mappers.converters.ValueConverter;
-import io.tarantool.driver.mappers.converters.value.custom.TarantoolResultConverter;
-import org.msgpack.value.ArrayValue;
-
-/**
- * Factory for {@link TarantoolResultMapper} instances used for handling results with tuples of any type
- *
- * @author Alexey Kuzin
- */
-public class TupleResultMapperFactory extends TarantoolResultMapperFactory {
-
- private final MessagePackMapper messagePackMapper;
-
- /**
- * Basic constructor
- */
- public TupleResultMapperFactory() {
- this(DefaultMessagePackMapperFactory.getInstance().emptyMapper());
- }
-
- /**
- * Basic constructor with mapper
- *
- * @param messagePackMapper MessagePack-to-object mapper for tuple contents
- */
- public TupleResultMapperFactory(MessagePackMapper messagePackMapper) {
- super();
- this.messagePackMapper = messagePackMapper;
- }
-
- /**
- * Get converter for tuples in {@link TarantoolResult}
- *
- * @param tupleConverter MessagePack-to-entity converter for tuples
- * @return mapper instance
- */
- public TarantoolResultMapper withTupleValueConverter(ValueConverter tupleConverter) {
- return withConverter(messagePackMapper.copy(), new TarantoolResultConverter<>(tupleConverter));
- }
-
- /**
- * Get converter for tuples in {@link TarantoolResult}
- *
- * @param valueMapper MessagePack-to-object mapper for tuple contents
- * @param tupleConverter MessagePack-to-entity converter for tuples
- * @return mapper instance
- */
- public TarantoolResultMapper withTupleValueConverter(
- MessagePackValueMapper valueMapper,
- ValueConverter tupleConverter) {
- return withConverter(valueMapper, new TarantoolResultConverter<>(tupleConverter));
- }
-
- /**
- * Get converter for tuples in {@link TarantoolResult}
- *
- * @param tupleConverter MessagePack-to-entity converter for tuples
- * @param resultClass allows to specify the result type in case if it is impossible to get it via reflection
- * (e.g. lambda)
- * @return mapper instance
- */
- public TarantoolResultMapper withTupleValueConverter(
- ValueConverter tupleConverter,
- Class extends TarantoolResult> resultClass) {
- return withConverter(messagePackMapper.copy(), new TarantoolResultConverter<>(tupleConverter), resultClass);
- }
-
- /**
- * Get converter for tuples in {@link TarantoolResult}
- *
- * @param valueMapper MessagePack-to-object mapper for tuple contents
- * @param tupleConverter MessagePack-to-entity converter for tuples
- * @param resultClass allows to specify the result type in case if it is impossible to get it via reflection
- * (e.g. lambda)
- * @return mapper instance
- */
- public TarantoolResultMapper withTupleValueConverter(
- MessagePackValueMapper valueMapper,
- ValueConverter tupleConverter,
- Class extends TarantoolResult> resultClass) {
- return withConverter(valueMapper, new TarantoolResultConverter<>(tupleConverter), resultClass);
- }
-}
diff --git a/src/main/java/io/tarantool/driver/mappers/ConverterWrapper.java b/src/main/java/io/tarantool/driver/mappers/converters/ConverterWrapper.java
similarity index 68%
rename from src/main/java/io/tarantool/driver/mappers/ConverterWrapper.java
rename to src/main/java/io/tarantool/driver/mappers/converters/ConverterWrapper.java
index 917c24f5e..465f7a6c1 100644
--- a/src/main/java/io/tarantool/driver/mappers/ConverterWrapper.java
+++ b/src/main/java/io/tarantool/driver/mappers/converters/ConverterWrapper.java
@@ -1,8 +1,4 @@
-package io.tarantool.driver.mappers;
-
-import io.tarantool.driver.mappers.converters.Converter;
-import io.tarantool.driver.mappers.converters.ObjectConverter;
-import io.tarantool.driver.mappers.converters.ValueConverter;
+package io.tarantool.driver.mappers.converters;
import java.io.Serializable;
@@ -14,14 +10,14 @@
* @param the converter that returns an instance of this target type from an instance of input type
* @author Artyom Dubinin
*/
-class ConverterWrapper implements Serializable {
+public class ConverterWrapper implements Serializable {
private static final long serialVersionUID = 20220501L;
private final C converter;
private final Class> targetClass;
- ConverterWrapper(C converter, Class> targetClass) {
+ public ConverterWrapper(C converter, Class> targetClass) {
this.converter = converter;
this.targetClass = targetClass;
}
diff --git a/src/main/java/io/tarantool/driver/mappers/converters/ValueConverterWithInputTypeWrapper.java b/src/main/java/io/tarantool/driver/mappers/converters/ValueConverterWithInputTypeWrapper.java
new file mode 100644
index 000000000..589da9256
--- /dev/null
+++ b/src/main/java/io/tarantool/driver/mappers/converters/ValueConverterWithInputTypeWrapper.java
@@ -0,0 +1,26 @@
+package io.tarantool.driver.mappers.converters;
+
+import org.msgpack.value.Value;
+import org.msgpack.value.ValueType;
+
+/**
+ * @author Artyom Dubinin
+ */
+public class ValueConverterWithInputTypeWrapper {
+ private final ValueType valueType;
+ private final ValueConverter extends Value, ? extends O> valueConverter;
+
+ public ValueConverterWithInputTypeWrapper(
+ ValueType valueType, ValueConverter extends Value, ? extends O> valueConverter) {
+ this.valueType = valueType;
+ this.valueConverter = valueConverter;
+ }
+
+ public ValueType getValueType() {
+ return valueType;
+ }
+
+ public ValueConverter extends Value, ? extends O> getValueConverter() {
+ return valueConverter;
+ }
+}
diff --git a/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToMultiValueCallResultConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToMultiValueCallResultConverter.java
new file mode 100644
index 000000000..b694757ef
--- /dev/null
+++ b/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToMultiValueCallResultConverter.java
@@ -0,0 +1,37 @@
+package io.tarantool.driver.mappers.converters.value;
+
+import io.tarantool.driver.api.MultiValueCallResult;
+import io.tarantool.driver.core.MultiValueCallResultImpl;
+import io.tarantool.driver.mappers.MessagePackValueMapper;
+import io.tarantool.driver.mappers.converters.ValueConverter;
+import org.msgpack.value.ArrayValue;
+
+import java.util.List;
+
+/**
+ * Converter of the stored function call result into a {@link MultiValueCallResult} with mapper inside
+ *
+ * @author Alexey Kuzin
+ * @author Artyom Dubinin
+ */
+public class ArrayValueToMultiValueCallResultConverter>
+ implements ValueConverter> {
+
+ private static final long serialVersionUID = 20200708L;
+
+ private final MessagePackValueMapper valueMapper;
+
+ /**
+ * Basic constructor
+ *
+ * @param valueMapper converter of multi-return result items to list
+ */
+ public ArrayValueToMultiValueCallResultConverter(MessagePackValueMapper valueMapper) {
+ this.valueMapper = valueMapper;
+ }
+
+ @Override
+ public MultiValueCallResult fromValue(ArrayValue value) {
+ return new MultiValueCallResultImpl<>(value, valueMapper);
+ }
+}
diff --git a/src/main/java/io/tarantool/driver/mappers/converters/value/custom/MultiValueCallResultConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToMultiValueCallResultSimpleConverter.java
similarity index 62%
rename from src/main/java/io/tarantool/driver/mappers/converters/value/custom/MultiValueCallResultConverter.java
rename to src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToMultiValueCallResultSimpleConverter.java
index 047bb8435..7bf5e045f 100644
--- a/src/main/java/io/tarantool/driver/mappers/converters/value/custom/MultiValueCallResultConverter.java
+++ b/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToMultiValueCallResultSimpleConverter.java
@@ -1,4 +1,4 @@
-package io.tarantool.driver.mappers.converters.value.custom;
+package io.tarantool.driver.mappers.converters.value;
import io.tarantool.driver.api.MultiValueCallResult;
import io.tarantool.driver.core.MultiValueCallResultImpl;
@@ -8,14 +8,15 @@
import java.util.List;
/**
- * Converter for stored function call result to a list of items
+ * Converter of the stored function call result into a {@link MultiValueCallResult} with converter inside
*
* @author Alexey Kuzin
+ * @author Artyom Dubinin
*/
-public class MultiValueCallResultConverter>
+public class ArrayValueToMultiValueCallResultSimpleConverter>
implements ValueConverter> {
- private static final long serialVersionUID = 20200708L;
+ private static final long serialVersionUID = -5298829576218240572L;
private final ValueConverter valueConverter;
@@ -24,7 +25,7 @@ public class MultiValueCallResultConverter>
*
* @param valueConverter converter of multi-return result items to list
*/
- public MultiValueCallResultConverter(ValueConverter valueConverter) {
+ public ArrayValueToMultiValueCallResultSimpleConverter(ValueConverter valueConverter) {
this.valueConverter = valueConverter;
}
diff --git a/src/main/java/io/tarantool/driver/mappers/converters/value/custom/MultiValueListConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToMultiValueListConverter.java
similarity index 76%
rename from src/main/java/io/tarantool/driver/mappers/converters/value/custom/MultiValueListConverter.java
rename to src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToMultiValueListConverter.java
index 72c9808e4..f1e1c0669 100644
--- a/src/main/java/io/tarantool/driver/mappers/converters/value/custom/MultiValueListConverter.java
+++ b/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToMultiValueListConverter.java
@@ -1,4 +1,4 @@
-package io.tarantool.driver.mappers.converters.value.custom;
+package io.tarantool.driver.mappers.converters.value;
import io.tarantool.driver.mappers.converters.ValueConverter;
import org.msgpack.value.ArrayValue;
@@ -13,7 +13,8 @@
*
* @author Alexey Kuzin
*/
-public class MultiValueListConverter, V extends Value> implements ValueConverter {
+public class ArrayValueToMultiValueListConverter, V extends Value>
+ implements ValueConverter {
private static final long serialVersionUID = 20200708L;
@@ -26,7 +27,7 @@ public class MultiValueListConverter, V extends Value> impl
* @param valueConverter converter for result items
* @param containerSupplier supplier for an empty collection of the result type
*/
- public MultiValueListConverter(ValueConverter valueConverter, Supplier containerSupplier) {
+ public ArrayValueToMultiValueListConverter(ValueConverter valueConverter, Supplier containerSupplier) {
this.valueConverter = valueConverter;
this.containerSupplier = containerSupplier;
}
diff --git a/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToSingleValueCallResultConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToSingleValueCallResultConverter.java
new file mode 100644
index 000000000..a32d9abbd
--- /dev/null
+++ b/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToSingleValueCallResultConverter.java
@@ -0,0 +1,30 @@
+package io.tarantool.driver.mappers.converters.value;
+
+import io.tarantool.driver.api.SingleValueCallResult;
+import io.tarantool.driver.core.SingleValueCallResultImpl;
+import io.tarantool.driver.mappers.MessagePackValueMapper;
+import io.tarantool.driver.mappers.converters.ValueConverter;
+import org.msgpack.value.ArrayValue;
+
+/**
+ * Converter of the stored function call result into a {@link SingleValueCallResult} with mapper inside
+ *
+ * @author Alexey Kuzin
+ * @author Artyom Dubinin
+ */
+public class ArrayValueToSingleValueCallResultConverter
+ implements ValueConverter> {
+
+ private static final long serialVersionUID = 7218783308373068532L;
+
+ private final MessagePackValueMapper valueMapper;
+
+ public ArrayValueToSingleValueCallResultConverter(MessagePackValueMapper valueMapper) {
+ this.valueMapper = valueMapper;
+ }
+
+ @Override
+ public SingleValueCallResult fromValue(ArrayValue value) {
+ return new SingleValueCallResultImpl<>(value, valueMapper);
+ }
+}
diff --git a/src/main/java/io/tarantool/driver/mappers/converters/value/custom/SingleValueCallResultConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToSingleValueCallResultSimpleConverter.java
similarity index 58%
rename from src/main/java/io/tarantool/driver/mappers/converters/value/custom/SingleValueCallResultConverter.java
rename to src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToSingleValueCallResultSimpleConverter.java
index c1be99746..e9869d3a8 100644
--- a/src/main/java/io/tarantool/driver/mappers/converters/value/custom/SingleValueCallResultConverter.java
+++ b/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToSingleValueCallResultSimpleConverter.java
@@ -1,4 +1,4 @@
-package io.tarantool.driver.mappers.converters.value.custom;
+package io.tarantool.driver.mappers.converters.value;
import io.tarantool.driver.api.SingleValueCallResult;
import io.tarantool.driver.core.SingleValueCallResultImpl;
@@ -7,17 +7,19 @@
import org.msgpack.value.Value;
/**
- * Converter of the stored function call result into a {@link SingleValueCallResult}
+ * Converter of the stored function call result into a {@link SingleValueCallResult} with converter inside
*
* @author Alexey Kuzin
+ * @author Artyom Dubinin
*/
-public class SingleValueCallResultConverter implements ValueConverter> {
+public class ArrayValueToSingleValueCallResultSimpleConverter
+ implements ValueConverter> {
- private static final long serialVersionUID = 20200708L;
+ private static final long serialVersionUID = 5062622344994604532L;
private final ValueConverter valueConverter;
- public SingleValueCallResultConverter(ValueConverter valueConverter) {
+ public ArrayValueToSingleValueCallResultSimpleConverter(ValueConverter valueConverter) {
this.valueConverter = valueConverter;
}
diff --git a/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToTarantoolResultConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToTarantoolResultConverter.java
new file mode 100644
index 000000000..a2b25bfa2
--- /dev/null
+++ b/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToTarantoolResultConverter.java
@@ -0,0 +1,29 @@
+package io.tarantool.driver.mappers.converters.value;
+
+import io.tarantool.driver.api.TarantoolResult;
+import io.tarantool.driver.core.TarantoolResultImpl;
+import io.tarantool.driver.mappers.converters.ValueConverter;
+import org.msgpack.value.ArrayValue;
+
+/**
+ * @author Artyom Dubinin
+ */
+public class ArrayValueToTarantoolResultConverter
+ implements ValueConverter> {
+
+ private static final long serialVersionUID = -1348387430063097175L;
+
+ private ValueConverter valueConverter;
+
+ public ArrayValueToTarantoolResultConverter() {
+ }
+
+ public ArrayValueToTarantoolResultConverter(ValueConverter valueConverter) {
+ this.valueConverter = valueConverter;
+ }
+
+ @Override
+ public TarantoolResult fromValue(ArrayValue value) {
+ return new TarantoolResultImpl<>(value, valueConverter);
+ }
+}
diff --git a/src/main/java/io/tarantool/driver/mappers/converters/value/custom/TarantoolTupleConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToTarantoolTupleConverter.java
similarity index 75%
rename from src/main/java/io/tarantool/driver/mappers/converters/value/custom/TarantoolTupleConverter.java
rename to src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToTarantoolTupleConverter.java
index 125f667d2..98ad6a1da 100644
--- a/src/main/java/io/tarantool/driver/mappers/converters/value/custom/TarantoolTupleConverter.java
+++ b/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToTarantoolTupleConverter.java
@@ -1,4 +1,4 @@
-package io.tarantool.driver.mappers.converters.value.custom;
+package io.tarantool.driver.mappers.converters.value;
import io.tarantool.driver.api.metadata.TarantoolSpaceMetadata;
import io.tarantool.driver.api.tuple.TarantoolTuple;
@@ -12,14 +12,14 @@
*
* @author Sergey Volgin
*/
-public class TarantoolTupleConverter implements ValueConverter {
+public class ArrayValueToTarantoolTupleConverter implements ValueConverter {
private static final long serialVersionUID = 20220418L;
private final MessagePackMapper mapper;
private final TarantoolSpaceMetadata spaceMetadata;
- public TarantoolTupleConverter(MessagePackMapper mapper, TarantoolSpaceMetadata spaceMetadata) {
+ public ArrayValueToTarantoolTupleConverter(MessagePackMapper mapper, TarantoolSpaceMetadata spaceMetadata) {
this.mapper = mapper;
this.spaceMetadata = spaceMetadata;
}
diff --git a/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToTarantoolTupleResultConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToTarantoolTupleResultConverter.java
new file mode 100644
index 000000000..f33fb2e51
--- /dev/null
+++ b/src/main/java/io/tarantool/driver/mappers/converters/value/ArrayValueToTarantoolTupleResultConverter.java
@@ -0,0 +1,29 @@
+package io.tarantool.driver.mappers.converters.value;
+
+import io.tarantool.driver.api.TarantoolResult;
+import io.tarantool.driver.api.tuple.TarantoolTuple;
+import io.tarantool.driver.core.TarantoolResultImpl;
+import io.tarantool.driver.mappers.converters.ValueConverter;
+import org.msgpack.value.ArrayValue;
+
+/**
+ * @author Artyom Dubinin
+ */
+public class ArrayValueToTarantoolTupleResultConverter
+ implements ValueConverter> {
+
+ private static final long serialVersionUID = -1348387430063097175L;
+
+ private final ValueConverter tupleConverter;
+
+ public ArrayValueToTarantoolTupleResultConverter(
+ ValueConverter tupleConverter) {
+ super();
+ this.tupleConverter = tupleConverter;
+ }
+
+ @Override
+ public TarantoolResult fromValue(ArrayValue value) {
+ return new TarantoolResultImpl<>(value, tupleConverter);
+ }
+}
diff --git a/src/main/java/io/tarantool/driver/mappers/converters/value/RowsMetadataToTarantoolTupleResultConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/value/RowsMetadataToTarantoolTupleResultConverter.java
new file mode 100644
index 000000000..1058e2220
--- /dev/null
+++ b/src/main/java/io/tarantool/driver/mappers/converters/value/RowsMetadataToTarantoolTupleResultConverter.java
@@ -0,0 +1,54 @@
+package io.tarantool.driver.mappers.converters.value;
+
+import io.tarantool.driver.api.TarantoolResult;
+import io.tarantool.driver.api.tuple.TarantoolTuple;
+import io.tarantool.driver.core.TarantoolResultImpl;
+import io.tarantool.driver.mappers.converters.ValueConverter;
+import org.msgpack.value.ArrayValue;
+import org.msgpack.value.MapValue;
+import org.msgpack.value.StringValue;
+import org.msgpack.value.Value;
+import org.msgpack.value.ValueFactory;
+
+import java.util.Map;
+
+/**
+ * @author Artyom Dubinin
+ */
+public class RowsMetadataToTarantoolTupleResultConverter
+ implements ValueConverter> {
+
+ private static final long serialVersionUID = -5228606294087295535L;
+
+ protected static final StringValue RESULT_META = ValueFactory.newString("metadata");
+ protected static final StringValue RESULT_ROWS = ValueFactory.newString("rows");
+
+ private final ArrayValueToTarantoolTupleConverter tupleConverter;
+
+ public RowsMetadataToTarantoolTupleResultConverter(ArrayValueToTarantoolTupleConverter tupleConverter) {
+ super();
+ this.tupleConverter = tupleConverter;
+ }
+
+ @Override
+ public TarantoolResult fromValue(MapValue value) {
+ Map tupleMap = value.asMapValue().map();
+ ArrayValue rawTuples = tupleMap.get(RESULT_ROWS).asArrayValue();
+
+ return new TarantoolResultImpl<>(rawTuples, tupleConverter);
+ }
+
+ @Override
+ public boolean canConvertValue(MapValue value) {
+ // [{"metadata" : [...], "rows": [...]}]
+ Map tupleMap = value.asMapValue().map();
+ if (!hasRowsAndMetadata(tupleMap)) {
+ return false;
+ }
+ return tupleMap.get(RESULT_ROWS).isArrayValue() && tupleMap.get(RESULT_META).isArrayValue();
+ }
+
+ static boolean hasRowsAndMetadata(Map valueMap) {
+ return valueMap.containsKey(RESULT_META) && valueMap.containsKey(RESULT_ROWS);
+ }
+}
diff --git a/src/main/java/io/tarantool/driver/mappers/converters/value/custom/TarantoolResultConverter.java b/src/main/java/io/tarantool/driver/mappers/converters/value/custom/TarantoolResultConverter.java
deleted file mode 100644
index cf266087b..000000000
--- a/src/main/java/io/tarantool/driver/mappers/converters/value/custom/TarantoolResultConverter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package io.tarantool.driver.mappers.converters.value.custom;
-
-import io.tarantool.driver.api.TarantoolResult;
-import io.tarantool.driver.core.TarantoolResultImpl;
-import io.tarantool.driver.mappers.converters.ValueConverter;
-import org.msgpack.value.ArrayValue;
-import org.msgpack.value.Value;
-
-/**
- * @author Alexey Kuzin
- */
-public class TarantoolResultConverter implements ValueConverter> {
-
- private static final long serialVersionUID = 20200708L;
-
- private final ValueConverter tupleConverter;
-
- public TarantoolResultConverter(ValueConverter tupleConverter) {
- this.tupleConverter = tupleConverter;
- }
-
- @Override
- public TarantoolResult