use of software.amazon.awssdk.enhanced.dynamodb.extensions.WriteModification in project aws-sdk-java-v2 by aws.
the class UpdateItemOperation method addExpressionsIfExist.
private UpdateItemRequest.Builder addExpressionsIfExist(WriteModification transformation, Map<String, AttributeValue> filteredAttributeValues, UpdateItemRequest.Builder requestBuilder, TableMetadata tableMetadata) {
Map<String, String> expressionNames = null;
Map<String, AttributeValue> expressionValues = null;
String conditionExpressionString = null;
/* Add update expression for transformed non-key attributes if applicable */
if (!filteredAttributeValues.isEmpty()) {
Expression fullUpdateExpression = generateUpdateExpression(filteredAttributeValues, tableMetadata);
expressionNames = fullUpdateExpression.expressionNames();
expressionValues = fullUpdateExpression.expressionValues();
requestBuilder = requestBuilder.updateExpression(fullUpdateExpression.expression());
}
/* Merge in conditional expression from extension WriteModification if applicable */
if (transformation != null && transformation.additionalConditionalExpression() != null) {
expressionNames = Expression.joinNames(expressionNames, transformation.additionalConditionalExpression().expressionNames());
expressionValues = Expression.joinValues(expressionValues, transformation.additionalConditionalExpression().expressionValues());
conditionExpressionString = transformation.additionalConditionalExpression().expression();
}
/* Merge in conditional expression from specified 'conditionExpression' if applicable */
Expression conditionExpression = request.map(r -> Optional.ofNullable(r.conditionExpression()), r -> Optional.ofNullable(r.conditionExpression())).orElse(null);
if (conditionExpression != null) {
expressionNames = Expression.joinNames(expressionNames, conditionExpression.expressionNames());
expressionValues = Expression.joinValues(expressionValues, conditionExpression.expressionValues());
conditionExpressionString = Expression.joinExpressions(conditionExpressionString, conditionExpression.expression(), " AND ");
}
// Avoiding adding empty collections that the low level SDK will propagate to DynamoDb where it causes error.
if (expressionNames != null && !expressionNames.isEmpty()) {
requestBuilder = requestBuilder.expressionAttributeNames(expressionNames);
}
if (expressionValues != null && !expressionValues.isEmpty()) {
requestBuilder = requestBuilder.expressionAttributeValues(expressionValues);
}
return requestBuilder.conditionExpression(conditionExpressionString);
}
use of software.amazon.awssdk.enhanced.dynamodb.extensions.WriteModification in project aws-sdk-java-v2 by aws.
the class UpdateItemOperation method generateConditionExpressionIfExist.
/**
* Retrieves the ConditionExpression from extensions if existing, and retrieves the ConditionExpression from the request
* if existing. If both exist, they are merged.
*/
private Expression generateConditionExpressionIfExist(WriteModification transformation, Either<UpdateItemEnhancedRequest<T>, TransactUpdateItemEnhancedRequest<T>> request) {
Expression conditionExpression = null;
if (transformation != null && transformation.additionalConditionalExpression() != null) {
conditionExpression = transformation.additionalConditionalExpression();
}
Expression operationConditionExpression = request.map(r -> Optional.ofNullable(r.conditionExpression()), r -> Optional.ofNullable(r.conditionExpression())).orElse(null);
if (operationConditionExpression != null) {
conditionExpression = operationConditionExpression.and(conditionExpression);
}
return conditionExpression;
}
use of software.amazon.awssdk.enhanced.dynamodb.extensions.WriteModification in project aws-sdk-java-v2 by aws.
the class PutItemOperation method generateRequest.
@Override
public PutItemRequest generateRequest(TableSchema<T> tableSchema, OperationContext operationContext, DynamoDbEnhancedClientExtension extension) {
if (!TableMetadata.primaryIndexName().equals(operationContext.indexName())) {
throw new IllegalArgumentException("PutItem cannot be executed against a secondary index.");
}
TableMetadata tableMetadata = tableSchema.tableMetadata();
// Fail fast if required primary partition key does not exist and avoid the call to DynamoDb
tableMetadata.primaryPartitionKey();
boolean alwaysIgnoreNulls = true;
T item = request.map(PutItemEnhancedRequest::item, TransactPutItemEnhancedRequest::item);
Map<String, AttributeValue> itemMap = tableSchema.itemToMap(item, alwaysIgnoreNulls);
WriteModification transformation = extension != null ? extension.beforeWrite(DefaultDynamoDbExtensionContext.builder().items(itemMap).operationContext(operationContext).tableMetadata(tableMetadata).tableSchema(tableSchema).operationName(operationName()).build()) : null;
if (transformation != null && transformation.transformedItem() != null) {
itemMap = transformation.transformedItem();
}
PutItemRequest.Builder requestBuilder = PutItemRequest.builder().tableName(operationContext.tableName()).item(itemMap);
if (request.left().isPresent()) {
requestBuilder = addPlainPutItemParameters(requestBuilder, request.left().get());
}
requestBuilder = addExpressionsIfExist(requestBuilder, transformation);
return requestBuilder.build();
}
use of software.amazon.awssdk.enhanced.dynamodb.extensions.WriteModification in project aws-sdk-java-v2 by aws.
the class UpdateItemOperation method generateRequest.
@Override
public UpdateItemRequest generateRequest(TableSchema<T> tableSchema, OperationContext operationContext, DynamoDbEnhancedClientExtension extension) {
if (!TableMetadata.primaryIndexName().equals(operationContext.indexName())) {
throw new IllegalArgumentException("UpdateItem cannot be executed against a secondary index.");
}
T item = request.map(UpdateItemEnhancedRequest::item, TransactUpdateItemEnhancedRequest::item);
Boolean ignoreNulls = request.map(r -> Optional.ofNullable(r.ignoreNulls()), r -> Optional.ofNullable(r.ignoreNulls())).orElse(null);
Map<String, AttributeValue> itemMap = tableSchema.itemToMap(item, Boolean.TRUE.equals(ignoreNulls));
TableMetadata tableMetadata = tableSchema.tableMetadata();
WriteModification transformation = extension != null ? extension.beforeWrite(DefaultDynamoDbExtensionContext.builder().items(itemMap).operationContext(operationContext).tableMetadata(tableMetadata).tableSchema(tableSchema).operationName(operationName()).build()) : null;
if (transformation != null && transformation.transformedItem() != null) {
itemMap = transformation.transformedItem();
}
Collection<String> primaryKeys = tableSchema.tableMetadata().primaryKeys();
Map<String, AttributeValue> keyAttributes = filterMap(itemMap, entry -> primaryKeys.contains(entry.getKey()));
Map<String, AttributeValue> nonKeyAttributes = filterMap(itemMap, entry -> !primaryKeys.contains(entry.getKey()));
Expression updateExpression = generateUpdateExpressionIfExist(tableMetadata, transformation, nonKeyAttributes);
Expression conditionExpression = generateConditionExpressionIfExist(transformation, request);
Map<String, String> expressionNames = coalesceExpressionNames(updateExpression, conditionExpression);
Map<String, AttributeValue> expressionValues = coalesceExpressionValues(updateExpression, conditionExpression);
UpdateItemRequest.Builder requestBuilder = UpdateItemRequest.builder().tableName(operationContext.tableName()).key(keyAttributes).returnValues(ReturnValue.ALL_NEW);
if (request.left().isPresent()) {
addPlainUpdateItemParameters(requestBuilder, request.left().get());
}
if (updateExpression != null) {
requestBuilder.updateExpression(updateExpression.expression());
}
if (conditionExpression != null) {
requestBuilder.conditionExpression(conditionExpression.expression());
}
if (CollectionUtils.isNotEmpty(expressionNames)) {
requestBuilder = requestBuilder.expressionAttributeNames(expressionNames);
}
if (CollectionUtils.isNotEmpty(expressionValues)) {
requestBuilder = requestBuilder.expressionAttributeValues(expressionValues);
}
return requestBuilder.build();
}
use of software.amazon.awssdk.enhanced.dynamodb.extensions.WriteModification in project aws-sdk-java-v2 by aws.
the class PutItemOperation method addExpressionsIfExist.
private PutItemRequest.Builder addExpressionsIfExist(PutItemRequest.Builder requestBuilder, WriteModification transformation) {
Expression originalConditionExpression = request.map(r -> Optional.ofNullable(r.conditionExpression()), r -> Optional.ofNullable(r.conditionExpression())).orElse(null);
Expression mergedConditionExpression;
if (transformation != null && transformation.additionalConditionalExpression() != null) {
mergedConditionExpression = Expression.join(originalConditionExpression, transformation.additionalConditionalExpression(), " AND ");
} else {
mergedConditionExpression = originalConditionExpression;
}
if (mergedConditionExpression != null) {
requestBuilder = requestBuilder.conditionExpression(mergedConditionExpression.expression());
// Avoiding adding empty collections that the low level SDK will propagate to DynamoDb where it causes error.
if (mergedConditionExpression.expressionValues() != null && !mergedConditionExpression.expressionValues().isEmpty()) {
requestBuilder = requestBuilder.expressionAttributeValues(mergedConditionExpression.expressionValues());
}
if (mergedConditionExpression.expressionNames() != null && !mergedConditionExpression.expressionNames().isEmpty()) {
requestBuilder = requestBuilder.expressionAttributeNames(mergedConditionExpression.expressionNames());
}
}
return requestBuilder;
}
Aggregations