Skip to content

Commit

Permalink
Optimize instantiation of static result mappers
Browse files Browse the repository at this point in the history
For TarantoolSpace and TarantoolSpaceMetadata classes we have static
mappers that should be really instantiated once, as well as the
suppliers for them. At the call sites we use references to the methods
returning mappers, so they will be optimized further by JVM.
  • Loading branch information
akudiyar committed Oct 8, 2023
1 parent 914255c commit e2c4ff3
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,11 @@ public class ProxyMetadataProvider implements TarantoolMetadataProvider {

private final String metadataFunctionName;
private final TarantoolCallOperations client;
private final CallResultMapper<TarantoolMetadataContainer, SingleValueCallResult<TarantoolMetadataContainer>>
metadataMapper;
private final
Supplier<CallResultMapper<TarantoolMetadataContainer, SingleValueCallResult<TarantoolMetadataContainer>>>
mapperSupplier;
metadataMapperSupplier;

/**
* Basic constructor
Expand All @@ -42,14 +44,15 @@ public ProxyMetadataProvider(
Class<? extends SingleValueCallResult<TarantoolMetadataContainer>> resultClass) {
this.metadataFunctionName = metadataFunctionName;
this.client = client;
this.mapperSupplier = () -> client.getResultMapperFactoryFactory()
this.metadataMapper = client.getResultMapperFactoryFactory()
.<TarantoolMetadataContainer>singleValueResultMapperFactory()
.withSingleValueResultConverter(metadataConverter, resultClass);
this.metadataMapperSupplier = () -> metadataMapper;
}

@Override
public CompletableFuture<TarantoolMetadataContainer> getMetadata() {
return client.callForSingleResult(metadataFunctionName, mapperSupplier)
return client.callForSingleResult(metadataFunctionName, metadataMapperSupplier)
.exceptionally(ex -> {
if (ex.getCause() != null && ex.getCause() instanceof TarantoolClientException) {
throw new TarantoolMetadataRequestException(metadataFunctionName, ex);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,9 @@
import io.tarantool.driver.exceptions.TarantoolClientException;
import io.tarantool.driver.mappers.CallResultMapper;
import io.tarantool.driver.mappers.MessagePackMapper;
import io.tarantool.driver.mappers.converters.ValueConverter;
import org.msgpack.value.ArrayValue;

import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;

/**
* Provides spaces and index metadata via requests to the system spaces in the Tarantool server instance
Expand All @@ -29,7 +28,23 @@ public class SpacesMetadataProvider implements TarantoolMetadataProvider {

private final TarantoolCallOperations client;
private final VSpaceToTarantoolSpaceMetadataConverter spaceMetadataMapper;
private final
CallResultMapper<TarantoolResult<TarantoolSpaceMetadata>,
SingleValueCallResult<TarantoolResult<TarantoolSpaceMetadata>>>
spaceMetadataResultMapper;
private final
Supplier<CallResultMapper<TarantoolResult<TarantoolSpaceMetadata>,
SingleValueCallResult<TarantoolResult<TarantoolSpaceMetadata>>>>
spaceMetadataResultMapperSupplier;
private final TarantoolIndexMetadataConverter indexMetadataMapper;
private final
CallResultMapper<TarantoolResult<TarantoolIndexMetadata>,
SingleValueCallResult<TarantoolResult<TarantoolIndexMetadata>>>
indexMetadataResultMapper;
private final
Supplier<CallResultMapper<TarantoolResult<TarantoolIndexMetadata>,
SingleValueCallResult<TarantoolResult<TarantoolIndexMetadata>>>>
indexMetadataResultMapperSupplier;

/**
* Basic constructor
Expand All @@ -42,28 +57,33 @@ public SpacesMetadataProvider(
MessagePackMapper messagePackMapper) {
this.client = client;
this.spaceMetadataMapper = VSpaceToTarantoolSpaceMetadataConverter.getInstance();
this.spaceMetadataResultMapper = client
.getResultMapperFactoryFactory().<TarantoolSpaceMetadata>singleValueTarantoolResultMapperFactory()
.withSingleValueArrayTarantoolResultConverter(spaceMetadataMapper, TarantoolSpaceMetadataResult.class);
this.spaceMetadataResultMapperSupplier = () -> spaceMetadataResultMapper;
this.indexMetadataMapper = new TarantoolIndexMetadataConverter(messagePackMapper);
this.indexMetadataResultMapper = client
.getResultMapperFactoryFactory().<TarantoolIndexMetadata>singleValueTarantoolResultMapperFactory()
.withSingleValueArrayTarantoolResultConverter(indexMetadataMapper, TarantoolIndexMetadataResult.class);
this.indexMetadataResultMapperSupplier = () -> indexMetadataResultMapper;
}

@Override
public CompletableFuture<TarantoolMetadataContainer> getMetadata() throws TarantoolClientException {

CompletableFuture<TarantoolResult<TarantoolSpaceMetadata>> spaces =
select(VSPACE_SELECT_CMD, spaceMetadataMapper, TarantoolSpaceMetadataResult.class);
select(VSPACE_SELECT_CMD, spaceMetadataResultMapperSupplier, TarantoolSpaceMetadata.class);
CompletableFuture<TarantoolResult<TarantoolIndexMetadata>> indexes =
select(VINDEX_SELECT_CMD, indexMetadataMapper, TarantoolIndexMetadataResult.class);
select(VINDEX_SELECT_CMD, indexMetadataResultMapperSupplier, TarantoolIndexMetadata.class);

return spaces.thenCombine(indexes, SpacesTarantoolMetadataContainer::new);
}

private <T> CompletableFuture<TarantoolResult<T>> select(
String selectCmd,
ValueConverter<ArrayValue, T> resultConverter,
Class<? extends SingleValueCallResult<TarantoolResult<T>>> resultClass)
Supplier<CallResultMapper<TarantoolResult<T>, SingleValueCallResult<TarantoolResult<T>>>> resultMapperSupplier,
Class<T> resultClass)
throws TarantoolClientException {
CallResultMapper<TarantoolResult<T>, SingleValueCallResult<TarantoolResult<T>>> resultMapper =
client.getResultMapperFactoryFactory().<T>singleValueTarantoolResultMapperFactory()
.withSingleValueArrayTarantoolResultConverter(resultConverter, resultClass);
return client.call(selectCmd, () -> resultMapper);
return client.call(selectCmd, resultMapperSupplier);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ public class ProxyTarantoolTupleSpace

private final TarantoolClientConfig config;
private final TarantoolCallOperations client;
private final
CallResultMapper<TarantoolResult<TarantoolTuple>, SingleValueCallResult<TarantoolResult<TarantoolTuple>>>
rowsMetadataTupleResultMapper;

/**
* Basic constructor
Expand All @@ -43,6 +46,9 @@ public ProxyTarantoolTupleSpace(
super(config, client, mappingConfig, metadataOperations, spaceMetadata);
this.config = config;
this.client = client;
this.rowsMetadataTupleResultMapper = client
.getResultMapperFactoryFactory().getTarantoolTupleResultMapperFactory()
.withSingleValueRowsMetadataToTarantoolTupleResultMapper(config.getMessagePackMapper(), getMetadata());
}

@Override
Expand All @@ -53,8 +59,7 @@ protected TupleOperations makeOperationsFromTuple(TarantoolTuple tuple) {
@Override
protected CallResultMapper<TarantoolResult<TarantoolTuple>, SingleValueCallResult<TarantoolResult<TarantoolTuple>>>
rowsMetadataTupleResultMapper() {
return client.getResultMapperFactoryFactory().getTarantoolTupleResultMapperFactory()
.withSingleValueRowsMetadataToTarantoolTupleResultMapper(config.getMessagePackMapper(), getMetadata());
return rowsMetadataTupleResultMapper;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public class TarantoolTupleSpace extends

private final TarantoolCallOperations client;
private final TarantoolClientConfig config;
private final MessagePackValueMapper arrayTupleResultMapper;

/**
* Basic constructor
Expand All @@ -42,6 +43,8 @@ public TarantoolTupleSpace(
super(config, connectionManager, metadataOperations, spaceMetadata);
this.client = client;
this.config = config;
this.arrayTupleResultMapper = client.getResultMapperFactoryFactory().getTarantoolTupleResultMapperFactory()
.withArrayValueToTarantoolTupleResultConverter(config.getMessagePackMapper(), getMetadata());
}

@Override
Expand All @@ -51,8 +54,7 @@ protected TupleOperations makeOperationsFromTuple(TarantoolTuple tuple) {

@Override
protected MessagePackValueMapper arrayTupleResultMapper() {
return client.getResultMapperFactoryFactory().getTarantoolTupleResultMapperFactory()
.withArrayValueToTarantoolTupleResultConverter(config.getMessagePackMapper(), getMetadata());
return arrayTupleResultMapper;
}

@Override
Expand Down

0 comments on commit e2c4ff3

Please sign in to comment.