All Downloads are FREE. Search and download functionalities are using the official Maven repository.

driven-adapter.dynamo-db.helper.adapter-operations.mustache Maven / Gradle / Ivy

Go to download

Gradle plugin to create a clean application in Java that already works, It follows our best practices!

There is a newer version: 3.20.10
Show newest version
package {{package}}.dynamodb.helper;

import org.reactivecommons.utils.ObjectMapper;
import software.amazon.awssdk.core.pagination.sync.SdkIterable;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbIndex;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
import software.amazon.awssdk.enhanced.dynamodb.Key;
import software.amazon.awssdk.enhanced.dynamodb.TableSchema;
import software.amazon.awssdk.enhanced.dynamodb.model.Page;
import software.amazon.awssdk.enhanced.dynamodb.model.PageIterable;
import software.amazon.awssdk.enhanced.dynamodb.model.QueryEnhancedRequest;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;

import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.function.Function;


public abstract class TemplateAdapterOperations {
    private final Class dataClass;
    private final Function toEntityFn;
    protected ObjectMapper mapper;
    private final DynamoDbTable table;
    private final DynamoDbIndex tableByIndex;

    @SuppressWarnings("unchecked")
    protected TemplateAdapterOperations(DynamoDbEnhancedClient dynamoDbEnhancedClient,
                                        ObjectMapper mapper,
                                        Function toEntityFn,
                                        String tableName,
                                        String... index) {
        this.toEntityFn = toEntityFn;
        this.mapper = mapper;
        ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass();
        this.dataClass = (Class) genericSuperclass.getActualTypeArguments()[2];
        table = dynamoDbEnhancedClient.table(tableName, TableSchema.fromBean(dataClass));
        tableByIndex = index.length > 0 ? table.index(index[0]) : null;
    }

    public E save(E model) {
        V entity = toEntity(model);
        table.putItem(entity);
        return toModel(entity);
    }

    public E getById(K id) {
        return toModel(table.getItem(Key.builder()
                .partitionValue(AttributeValue.builder().s((String) id).build())
                .build())
        );
    }

    public void delete(E model) {
        table.deleteItem(toEntity(model));
    }

    public List query(QueryEnhancedRequest queryExpression) {
        PageIterable pageIterable = table.query(queryExpression);
        return listOfModel(pageIterable);
    }

    public List queryByIndex(QueryEnhancedRequest queryExpression, String... index) {
        DynamoDbIndex queryIndex = index.length > 0 ? table.index(index[0]) : tableByIndex;
        SdkIterable> sdkIterable = queryIndex.query(queryExpression);
        return listOfModel(sdkIterable);
    }

    /**
     * @return Mono>
     * @implNote Bancolombia does not suggest the Scan function for DynamoDB tables due to the low performance resulting
     * from the design of the database engine (Key value). Optimize the query using Query, GetItem or BatchGetItem
     * functions, and if necessary, consider the Single-Table Design pattern for DynamoDB.
     * @deprecated
     */
    @Deprecated(forRemoval = true)
    public List scan() {
        return listOfModel(table.scan());
    }

    private List listOfModel(PageIterable pageIterable) {
        return pageIterable.items().stream().map(this::toModel).toList();
    }

    private List listOfModel(SdkIterable> pageIterable) {
        return pageIterable.stream().flatMap(p -> p.items().stream().map(this::toModel)).toList();
    }

    protected V toEntity(E model) {
        return mapper.map(model, dataClass);
    }

    protected E toModel(V data) {
        return data != null ? toEntityFn.apply(data) : null;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy