Skip to content

Commit 7c8c7cf

Browse files
committed
Add ability to use different converters via factory
Closes #320
1 parent 415aa88 commit 7c8c7cf

9 files changed

Lines changed: 186 additions & 7 deletions

src/main/java/io/tarantool/driver/core/metadata/RowsMetadataToTarantoolTupleResultConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public TarantoolResult<TarantoolTuple> fromValue(MapValue value) {
5151

5252
@Override
5353
public boolean canConvertValue(MapValue value) {
54-
// [{"metadata" : [...], "rows": [...]}]
54+
// {"metadata" : [...], "rows": [...]}
5555
Map<Value, Value> tupleMap = value.asMapValue().map();
5656
if (!hasRowsAndMetadata(tupleMap)) {
5757
return false;

src/main/java/io/tarantool/driver/mappers/AbstractResultMapper.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,12 @@ public AbstractResultMapper(
5858
valueMapper.registerValueConverterWithoutTargetClass(valueType, resultConverter);
5959
}
6060

61-
public AbstractResultMapper(
61+
public <O> AbstractResultMapper(
6262
MessagePackValueMapper valueMapper,
63-
List<ValueConverterWithInputTypeWrapper<T>> converters,
63+
List<ValueConverterWithInputTypeWrapper<O>> converters,
6464
Class<? extends T> resultClass) {
6565
this.valueMapper = valueMapper;
66-
for (ValueConverterWithInputTypeWrapper<T> converter :
66+
for (ValueConverterWithInputTypeWrapper<O> converter :
6767
converters) {
6868
valueMapper.registerValueConverter(
6969
converter.getValueType(),
@@ -72,11 +72,11 @@ public AbstractResultMapper(
7272
}
7373
}
7474

75-
public AbstractResultMapper(
75+
public <O> AbstractResultMapper(
7676
MessagePackValueMapper valueMapper,
77-
List<ValueConverterWithInputTypeWrapper<T>> converters) {
77+
List<ValueConverterWithInputTypeWrapper<O>> converters) {
7878
this.valueMapper = valueMapper;
79-
for (ValueConverterWithInputTypeWrapper<T> converter :
79+
for (ValueConverterWithInputTypeWrapper<O> converter :
8080
converters) {
8181
valueMapper.registerValueConverterWithoutTargetClass(
8282
converter.getValueType(),

src/main/java/io/tarantool/driver/mappers/factories/ArrayValueToTarantoolTupleResultMapperFactory.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.tarantool.driver.mappers.MessagePackMapper;
66
import io.tarantool.driver.mappers.MessagePackValueMapper;
77
import io.tarantool.driver.mappers.TarantoolResultMapper;
8+
import io.tarantool.driver.mappers.converters.ValueConverterWithInputTypeWrapper;
89
import io.tarantool.driver.mappers.converters.value.ArrayValueToTarantoolTupleConverter;
910
import io.tarantool.driver.mappers.converters.value.ArrayValueToTarantoolTupleResultConverter;
1011
import org.msgpack.value.ValueType;
@@ -49,6 +50,12 @@ public TarantoolResultMapper<TarantoolTuple> withArrayValueToTarantoolTupleResul
4950
new ArrayValueToTarantoolTupleConverter(messagePackMapper, spaceMetadata));
5051
}
5152

53+
public ValueConverterWithInputTypeWrapper<Object> getArrayValueToTarantoolTupleResultConverter(
54+
MessagePackMapper messagePackMapper, TarantoolSpaceMetadata spaceMetadata) {
55+
return getArrayValueToTarantoolTupleResultConverter(
56+
new ArrayValueToTarantoolTupleConverter(messagePackMapper, spaceMetadata));
57+
}
58+
5259
public TarantoolResultMapper<TarantoolTuple> withArrayValueToTarantoolTupleResultConverter(
5360
ArrayValueToTarantoolTupleConverter tupleConverter) {
5461
return withConverterWithoutTargetClass(
@@ -58,6 +65,14 @@ public TarantoolResultMapper<TarantoolTuple> withArrayValueToTarantoolTupleResul
5865
);
5966
}
6067

68+
public ValueConverterWithInputTypeWrapper<Object> getArrayValueToTarantoolTupleResultConverter(
69+
ArrayValueToTarantoolTupleConverter tupleConverter) {
70+
return new ValueConverterWithInputTypeWrapper<>(
71+
ValueType.ARRAY,
72+
new ArrayValueToTarantoolTupleResultConverter(tupleConverter)
73+
);
74+
}
75+
6176
public TarantoolResultMapper<TarantoolTuple> withArrayValueToTarantoolTupleResultConverter(
6277
MessagePackValueMapper valueMapper,
6378
ArrayValueToTarantoolTupleConverter tupleConverter) {

src/main/java/io/tarantool/driver/mappers/factories/ResultMapperFactoryFactory.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package io.tarantool.driver.mappers.factories;
22

3+
import io.tarantool.driver.api.CallResult;
34
import io.tarantool.driver.api.MultiValueCallResult;
45
import io.tarantool.driver.api.SingleValueCallResult;
56
import io.tarantool.driver.api.TarantoolResult;
7+
import io.tarantool.driver.api.metadata.TarantoolSpaceMetadata;
68
import io.tarantool.driver.api.tuple.TarantoolTuple;
9+
import io.tarantool.driver.mappers.CallResultMapper;
10+
import io.tarantool.driver.mappers.MessagePackMapper;
11+
import io.tarantool.driver.mappers.MessagePackValueMapper;
712
import io.tarantool.driver.mappers.TarantoolTupleResultMapperFactory;
813

914
import java.util.List;
@@ -191,4 +196,21 @@ public interface ResultMapperFactoryFactory {
191196
* @return new or existing factory instance
192197
*/
193198
<T> ArrayValueToTarantoolResultMapperFactory<T> rowsMetadataStructureResultMapperFactory();
199+
200+
Builder createMapper();
201+
202+
interface Builder {
203+
204+
Builder withSingleValueConverter(
205+
MessagePackValueMapper messagePackMapper);
206+
207+
Builder withArrayValueToTarantoolTupleResultConverter(
208+
MessagePackMapper messagePackMapper, TarantoolSpaceMetadata spaceMetadata);
209+
210+
MessagePackValueMapper buildMessagePackMapper(MessagePackValueMapper valueMapper);
211+
212+
CallResultMapper buildCallResultMapper(MessagePackValueMapper valueMapper);
213+
Builder withRowsMetadataToTarantoolTupleResultMapper(
214+
MessagePackMapper messagePackMapper, TarantoolSpaceMetadata spaceMetadata);
215+
}
194216
}

src/main/java/io/tarantool/driver/mappers/factories/ResultMapperFactoryFactoryImpl.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,22 @@
33
import io.tarantool.driver.api.MultiValueCallResult;
44
import io.tarantool.driver.api.SingleValueCallResult;
55
import io.tarantool.driver.api.TarantoolResult;
6+
import io.tarantool.driver.api.metadata.TarantoolSpaceMetadata;
67
import io.tarantool.driver.exceptions.TarantoolClientException;
78
import io.tarantool.driver.mappers.CallResultMapper;
89
import io.tarantool.driver.mappers.DefaultMultiValueResultMapper;
910
import io.tarantool.driver.mappers.DefaultSingleValueResultMapper;
1011
import io.tarantool.driver.mappers.MessagePackMapper;
12+
import io.tarantool.driver.mappers.MessagePackValueMapper;
1113
import io.tarantool.driver.mappers.TarantoolTupleResultMapperFactory;
1214
import io.tarantool.driver.mappers.TarantoolTupleResultMapperFactoryImpl;
1315
import io.tarantool.driver.mappers.converters.ValueConverter;
16+
import io.tarantool.driver.mappers.converters.ValueConverterWithInputTypeWrapper;
1417
import io.tarantool.driver.mappers.converters.value.ArrayValueToMultiValueListConverter;
1518
import org.msgpack.value.Value;
1619
import org.msgpack.value.ValueType;
1720

21+
import java.util.ArrayList;
1822
import java.util.List;
1923
import java.util.Optional;
2024
import java.util.function.Supplier;
@@ -121,4 +125,55 @@ private <V extends Value, T> ValueConverter<V, T> getConverter(
121125
}
122126
return converter.get();
123127
}
128+
129+
@Override
130+
public Builder createMapper() {
131+
return new Builder();
132+
}
133+
134+
private class Builder implements ResultMapperFactoryFactory.Builder {
135+
136+
private final List<ValueConverterWithInputTypeWrapper<Object>> mappers;
137+
138+
Builder() {
139+
this.mappers = new ArrayList<>();
140+
}
141+
142+
public Builder withSingleValueConverter(
143+
MessagePackValueMapper messagePackMapper) {
144+
this.mappers.add(
145+
singleValueResultMapperFactory()
146+
.getSingleValueResultConverter(
147+
messagePackMapper
148+
)
149+
);
150+
return this;
151+
}
152+
153+
public Builder withArrayValueToTarantoolTupleResultConverter(
154+
MessagePackMapper messagePackMapper, TarantoolSpaceMetadata spaceMetadata) {
155+
this.mappers.add(
156+
arrayTupleResultMapperFactory()
157+
.getArrayValueToTarantoolTupleResultConverter(messagePackMapper, spaceMetadata)
158+
);
159+
return this;
160+
}
161+
162+
public Builder withRowsMetadataToTarantoolTupleResultMapper(
163+
MessagePackMapper messagePackMapper, TarantoolSpaceMetadata spaceMetadata) {
164+
this.mappers.add(
165+
rowsMetadataTupleResultMapperFactory()
166+
.getRowsMetadataToTarantoolTupleResultConverter(messagePackMapper, spaceMetadata)
167+
);
168+
return this;
169+
}
170+
171+
public MessagePackValueMapper buildMessagePackMapper(MessagePackValueMapper valueMapper) {
172+
return new CallResultMapper(valueMapper, mappers);
173+
}
174+
175+
public CallResultMapper buildCallResultMapper(MessagePackValueMapper valueMapper) {
176+
return new CallResultMapper(valueMapper, mappers);
177+
}
178+
}
124179
}

src/main/java/io/tarantool/driver/mappers/factories/RowsMetadataToTarantoolTupleResultMapperFactory.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.tarantool.driver.mappers.MessagePackMapper;
77
import io.tarantool.driver.mappers.MessagePackValueMapper;
88
import io.tarantool.driver.mappers.TarantoolResultMapper;
9+
import io.tarantool.driver.mappers.converters.ValueConverterWithInputTypeWrapper;
910
import io.tarantool.driver.mappers.converters.value.ArrayValueToTarantoolTupleConverter;
1011
import org.msgpack.value.ValueType;
1112

@@ -49,6 +50,12 @@ public TarantoolResultMapper<TarantoolTuple> withRowsMetadataToTarantoolTupleRes
4950
new ArrayValueToTarantoolTupleConverter(messagePackMapper, spaceMetadata));
5051
}
5152

53+
public ValueConverterWithInputTypeWrapper<Object> getRowsMetadataToTarantoolTupleResultConverter(
54+
MessagePackMapper messagePackMapper, TarantoolSpaceMetadata spaceMetadata) {
55+
return getRowsMetadataToTarantoolTupleResultConverter(
56+
new ArrayValueToTarantoolTupleConverter(messagePackMapper, spaceMetadata));
57+
}
58+
5259
public TarantoolResultMapper<TarantoolTuple> withRowsMetadataToTarantoolTupleResultConverter(
5360
ArrayValueToTarantoolTupleConverter tupleConverter) {
5461
return withConverterWithoutTargetClass(
@@ -58,6 +65,14 @@ public TarantoolResultMapper<TarantoolTuple> withRowsMetadataToTarantoolTupleRes
5865
);
5966
}
6067

68+
public ValueConverterWithInputTypeWrapper<Object> getRowsMetadataToTarantoolTupleResultConverter(
69+
ArrayValueToTarantoolTupleConverter tupleConverter) {
70+
return new ValueConverterWithInputTypeWrapper<>(
71+
ValueType.MAP,
72+
new RowsMetadataToTarantoolTupleResultConverter(tupleConverter)
73+
);
74+
}
75+
6176
public TarantoolResultMapper<TarantoolTuple> withRowsMetadataToTarantoolTupleResultConverter(
6277
MessagePackValueMapper valueMapper,
6378
ArrayValueToTarantoolTupleConverter tupleConverter) {

src/main/java/io/tarantool/driver/mappers/factories/SingleValueResultMapperFactory.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
import io.tarantool.driver.mappers.MessagePackMapper;
66
import io.tarantool.driver.mappers.MessagePackValueMapper;
77
import io.tarantool.driver.mappers.converters.ValueConverter;
8+
import io.tarantool.driver.mappers.converters.ValueConverterWithInputTypeWrapper;
89
import io.tarantool.driver.mappers.converters.value.ArrayValueToSingleValueCallResultConverter;
910
import io.tarantool.driver.mappers.converters.value.ArrayValueToSingleValueCallResultSimpleConverter;
1011
import org.msgpack.value.Value;
12+
import org.msgpack.value.ValueType;
1113

1214
/**
1315
* Factory for {@link CallResultMapper} instances used for handling Lua call results resulting in two possible
@@ -106,4 +108,12 @@ public CallResultMapper<T, SingleValueCallResult<T>> withSingleValueResultConver
106108
messagePackMapper.copy(), new ArrayValueToSingleValueCallResultConverter<>(structureValueMapper),
107109
resultClass);
108110
}
111+
112+
public ValueConverterWithInputTypeWrapper<Object> getSingleValueResultConverter(
113+
MessagePackValueMapper structureValueMapper) {
114+
return new ValueConverterWithInputTypeWrapper<>(
115+
ValueType.ARRAY,
116+
new ArrayValueToSingleValueCallResultConverter<>(structureValueMapper)
117+
);
118+
}
109119
}

src/test/java/io/tarantool/driver/integration/ProxyTarantoolClientIT.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import io.tarantool.driver.api.tuple.DefaultTarantoolTupleFactory;
1717
import io.tarantool.driver.api.tuple.TarantoolTuple;
1818
import io.tarantool.driver.api.tuple.TarantoolTupleFactory;
19+
import io.tarantool.driver.api.tuple.TarantoolTupleResult;
1920
import io.tarantool.driver.api.tuple.operations.TupleOperations;
2021
import io.tarantool.driver.auth.SimpleTarantoolCredentials;
2122
import io.tarantool.driver.auth.TarantoolCredentials;
@@ -26,13 +27,15 @@
2627
import io.tarantool.driver.core.ClusterTarantoolTupleClient;
2728
import io.tarantool.driver.core.ProxyTarantoolTupleClient;
2829
import io.tarantool.driver.core.RetryingTarantoolTupleClient;
30+
import io.tarantool.driver.core.TarantoolTupleResultImpl;
2931
import io.tarantool.driver.core.tuple.TarantoolTupleImpl;
3032
import io.tarantool.driver.exceptions.TarantoolInternalException;
3133
import io.tarantool.driver.exceptions.TarantoolNoSuchProcedureException;
3234
import io.tarantool.driver.mappers.CallResultMapper;
3335
import io.tarantool.driver.mappers.MessagePackMapper;
3436
import io.tarantool.driver.mappers.MessagePackValueMapper;
3537
import io.tarantool.driver.mappers.factories.DefaultMessagePackMapperFactory;
38+
import io.tarantool.driver.mappers.factories.ResultMapperFactoryFactory;
3639
import io.tarantool.driver.mappers.factories.ResultMapperFactoryFactoryImpl;
3740
import org.junit.jupiter.api.BeforeAll;
3841
import org.junit.jupiter.api.BeforeEach;
@@ -426,6 +429,53 @@ public void test_crudMetadataResponse_shouldReturnTuple_withoutDDLMetadata()
426429
assertEquals(field4, tuple.getObject("field4").orElse(null));
427430
}
428431

432+
@Test
433+
public void test_universalConverter_shouldWorkWithBoxAndCrudCorrectly() {
434+
Integer id = 123000;
435+
String field1 = "Jane Doe";
436+
Integer field2 = 999;
437+
438+
List<Object> values = Arrays.asList(id, null, field1, field2);
439+
TarantoolTuple tarantoolTuple = tupleFactory.create(values);
440+
client.space("test_space").insert(tarantoolTuple).join();
441+
442+
MessagePackMapper valueMapper = client.getConfig().getMessagePackMapper();
443+
444+
ResultMapperFactoryFactory factory =
445+
client.getResultMapperFactoryFactory();
446+
CallResultMapper callReturnMapper = factory.createMapper()
447+
.withSingleValueConverter(
448+
factory.createMapper()
449+
.withArrayValueToTarantoolTupleResultConverter(valueMapper, null)
450+
.withRowsMetadataToTarantoolTupleResultMapper(valueMapper, null)
451+
.buildMessagePackMapper(valueMapper.copy())
452+
)
453+
.buildCallResultMapper(valueMapper.copy());
454+
455+
Object crudResult =
456+
client.call("crud.select", Collections.singletonList("test_space"), callReturnMapper).join();
457+
458+
assertTrue(crudResult instanceof TarantoolTupleResultImpl);
459+
TarantoolTupleResultImpl tarantoolResult = (TarantoolTupleResultImpl) crudResult;
460+
assertEquals(1, tarantoolResult.size());
461+
TarantoolTuple tuple = tarantoolResult.get(0);
462+
assertEquals(id, tuple.getObject("id").orElse(null));
463+
assertEquals(field1, tuple.getObject("field1").orElse(null));
464+
assertEquals(field2, tuple.getObject("field2").orElse(null));
465+
466+
Object boxResult =
467+
client.call("select_router_space", new ArrayList<>(), callReturnMapper).join();
468+
469+
assertTrue(boxResult instanceof TarantoolTupleResultImpl);
470+
tarantoolResult = (TarantoolTupleResultImpl) boxResult;
471+
assertEquals(1, tarantoolResult.size());
472+
tuple = tarantoolResult.get(0);
473+
assertEquals(1, tuple.getObject(0).orElse(null));
474+
475+
Object primitiveObject = client.call("returning_number", new ArrayList<>(), callReturnMapper).join();
476+
assertEquals(2, primitiveObject);
477+
}
478+
429479
@Test
430480
public void clusterUpsertTest() throws ExecutionException, InterruptedException {
431481
TarantoolSpaceOperations<TarantoolTuple, TarantoolResult<TarantoolTuple>> profileSpace =

src/test/resources/cartridge/app/roles/api_router.lua

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,10 @@ local function create_restricted_user()
197197
box.schema.user.grant("restricted_user", "execute", "function", "returning_number", { if_not_exists = true })
198198
end
199199

200+
local function select_router_space()
201+
return box.space.router_space:select()
202+
end
203+
200204
local function init()
201205
patch_crud_methods_for_tests()
202206

@@ -206,6 +210,13 @@ local function init()
206210
})
207211
box.space.request_counters:create_index('id', { parts = { 'id' }, if_not_exists = true })
208212

213+
local router_space = box.schema.space.create('router_space', {
214+
format = { { 'id', 'unsigned' } },
215+
if_not_exists = true
216+
})
217+
router_space:create_index('id', { parts = { 'id' }, if_not_exists = true })
218+
router_space:replace({1})
219+
209220
rawset(_G, 'truncate_space', truncate_space)
210221

211222
rawset(_G, 'ddl', { get_schema = get_schema })
@@ -234,6 +245,7 @@ local function init()
234245
rawset(_G, 'test_no_such_procedure', test_no_such_procedure)
235246
rawset(_G, 'get_other_storage_bucket_id', crud_utils.get_other_storage_bucket_id)
236247
rawset(_G, 'get_composite_data_with_crud', crud_utils.get_composite_data_with_crud)
248+
rawset(_G, 'select_router_space', select_router_space)
237249
rawset(_G, 'vshard', vshard)
238250

239251
create_restricted_user()

0 commit comments

Comments
 (0)