Skip to content

Commit ec4c51b

Browse files
authored
Revert "Fixed EnhancedClient UpdateItem operation to make it work on nested attributes as well (#5380)" (#5586)
This reverts commit 79394aa.
1 parent 3d0e8e9 commit ec4c51b

File tree

8 files changed

+9
-480
lines changed

8 files changed

+9
-480
lines changed

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/internal/EnhancedClientUtils.java

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,13 @@
1515

1616
package software.amazon.awssdk.enhanced.dynamodb.internal;
1717

18-
import static software.amazon.awssdk.enhanced.dynamodb.internal.operations.UpdateItemOperation.NESTED_OBJECT_UPDATE;
19-
2018
import java.util.Collections;
2119
import java.util.List;
2220
import java.util.Map;
2321
import java.util.Optional;
2422
import java.util.Set;
2523
import java.util.function.Function;
2624
import java.util.function.Supplier;
27-
import java.util.regex.Pattern;
2825
import java.util.stream.Collectors;
2926
import java.util.stream.Stream;
3027
import software.amazon.awssdk.annotations.SdkInternalApi;
@@ -43,7 +40,6 @@ public final class EnhancedClientUtils {
4340
private static final Set<Character> SPECIAL_CHARACTERS = Stream.of(
4441
'*', '.', '-', '#', '+', ':', '/', '(', ')', ' ',
4542
'&', '<', '>', '?', '=', '!', '@', '%', '$', '|').collect(Collectors.toSet());
46-
private static final Pattern NESTED_OBJECT_PATTERN = Pattern.compile(NESTED_OBJECT_UPDATE);
4743

4844
private EnhancedClientUtils() {
4945

@@ -71,30 +67,18 @@ public static String cleanAttributeName(String key) {
7167
return somethingChanged ? new String(chars) : key;
7268
}
7369

74-
private static boolean isNestedAttribute(String key) {
75-
return key.contains(NESTED_OBJECT_UPDATE);
76-
}
77-
7870
/**
7971
* Creates a key token to be used with an ExpressionNames map.
8072
*/
8173
public static String keyRef(String key) {
82-
String cleanAttributeName = cleanAttributeName(key);
83-
cleanAttributeName = isNestedAttribute(cleanAttributeName) ?
84-
NESTED_OBJECT_PATTERN.matcher(cleanAttributeName).replaceAll(".#AMZN_MAPPED_")
85-
: cleanAttributeName;
86-
return "#AMZN_MAPPED_" + cleanAttributeName;
74+
return "#AMZN_MAPPED_" + cleanAttributeName(key);
8775
}
8876

8977
/**
9078
* Creates a value token to be used with an ExpressionValues map.
9179
*/
9280
public static String valueRef(String value) {
93-
String cleanAttributeName = cleanAttributeName(value);
94-
cleanAttributeName = isNestedAttribute(cleanAttributeName) ?
95-
NESTED_OBJECT_PATTERN.matcher(cleanAttributeName).replaceAll("_")
96-
: cleanAttributeName;
97-
return ":AMZN_MAPPED_" + cleanAttributeName;
81+
return ":AMZN_MAPPED_" + cleanAttributeName(value);
9882
}
9983

10084
public static <T> T readAndTransformSingleItem(Map<String, AttributeValue> itemMap,

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/internal/operations/UpdateItemOperation.java

Lines changed: 3 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,11 @@
1515

1616
package software.amazon.awssdk.enhanced.dynamodb.internal.operations;
1717

18-
import static software.amazon.awssdk.enhanced.dynamodb.internal.EnhancedClientUtils.isNullAttributeValue;
1918
import static software.amazon.awssdk.enhanced.dynamodb.internal.EnhancedClientUtils.readAndTransformSingleItem;
2019
import static software.amazon.awssdk.enhanced.dynamodb.internal.update.UpdateExpressionUtils.operationExpression;
2120
import static software.amazon.awssdk.utils.CollectionUtils.filterMap;
2221

2322
import java.util.Collection;
24-
import java.util.HashMap;
2523
import java.util.List;
2624
import java.util.Map;
2725
import java.util.Optional;
@@ -55,8 +53,7 @@
5553
public class UpdateItemOperation<T>
5654
implements TableOperation<T, UpdateItemRequest, UpdateItemResponse, UpdateItemEnhancedResponse<T>>,
5755
TransactableWriteOperation<T> {
58-
59-
public static final String NESTED_OBJECT_UPDATE = "_NESTED_ATTR_UPDATE_";
56+
6057
private final Either<UpdateItemEnhancedRequest<T>, TransactUpdateItemEnhancedRequest<T>> request;
6158

6259
private UpdateItemOperation(UpdateItemEnhancedRequest<T> request) {
@@ -92,14 +89,8 @@ public UpdateItemRequest generateRequest(TableSchema<T> tableSchema,
9289
Boolean ignoreNulls = request.map(r -> Optional.ofNullable(r.ignoreNulls()),
9390
r -> Optional.ofNullable(r.ignoreNulls()))
9491
.orElse(null);
95-
96-
Map<String, AttributeValue> itemMapImmutable = tableSchema.itemToMap(item, Boolean.TRUE.equals(ignoreNulls));
97-
98-
// If ignoreNulls is set to true, check for nested params to be updated
99-
// If needed, Transform itemMap for it to be able to handle them.
100-
Map<String, AttributeValue> itemMap = Boolean.TRUE.equals(ignoreNulls) ?
101-
transformItemToMapForUpdateExpression(itemMapImmutable) : itemMapImmutable;
102-
92+
93+
Map<String, AttributeValue> itemMap = tableSchema.itemToMap(item, Boolean.TRUE.equals(ignoreNulls));
10394
TableMetadata tableMetadata = tableSchema.tableMetadata();
10495

10596
WriteModification transformation =
@@ -150,58 +141,6 @@ public UpdateItemRequest generateRequest(TableSchema<T> tableSchema,
150141

151142
return requestBuilder.build();
152143
}
153-
154-
/**
155-
* Method checks if a nested object parameter requires an update
156-
* If so flattens out nested params separated by "_NESTED_ATTR_UPDATE_"
157-
* this is consumed by @link EnhancedClientUtils to form the appropriate UpdateExpression
158-
*/
159-
public Map<String, AttributeValue> transformItemToMapForUpdateExpression(Map<String, AttributeValue> itemToMap) {
160-
161-
Map<String, AttributeValue> nestedAttributes = new HashMap<>();
162-
163-
itemToMap.forEach((key, value) -> {
164-
if (value.hasM() && isNotEmptyMap(value.m())) {
165-
nestedAttributes.put(key, value);
166-
}
167-
});
168-
169-
if (!nestedAttributes.isEmpty()) {
170-
Map<String, AttributeValue> itemToMapMutable = new HashMap<>(itemToMap);
171-
nestedAttributes.forEach((key, value) -> {
172-
itemToMapMutable.remove(key);
173-
nestedItemToMap(itemToMapMutable, key, value);
174-
});
175-
return itemToMapMutable;
176-
}
177-
178-
return itemToMap;
179-
}
180-
181-
private Map<String, AttributeValue> nestedItemToMap(Map<String, AttributeValue> itemToMap,
182-
String key,
183-
AttributeValue attributeValue) {
184-
attributeValue.m().forEach((mapKey, mapValue) -> {
185-
String nestedAttributeKey = key + NESTED_OBJECT_UPDATE + mapKey;
186-
if (attributeValueNonNullOrShouldWriteNull(mapValue)) {
187-
if (mapValue.hasM()) {
188-
nestedItemToMap(itemToMap, nestedAttributeKey, mapValue);
189-
} else {
190-
itemToMap.put(nestedAttributeKey, mapValue);
191-
}
192-
}
193-
});
194-
return itemToMap;
195-
}
196-
197-
private boolean isNotEmptyMap(Map<String, AttributeValue> map) {
198-
return !map.isEmpty() && map.values().stream()
199-
.anyMatch(this::attributeValueNonNullOrShouldWriteNull);
200-
}
201-
202-
private boolean attributeValueNonNullOrShouldWriteNull(AttributeValue attributeValue) {
203-
return !isNullAttributeValue(attributeValue);
204-
}
205144

206145
@Override
207146
public UpdateItemEnhancedResponse<T> transformResponse(UpdateItemResponse response,

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/internal/update/UpdateExpressionUtils.java

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,13 @@
1818
import static software.amazon.awssdk.enhanced.dynamodb.internal.EnhancedClientUtils.isNullAttributeValue;
1919
import static software.amazon.awssdk.enhanced.dynamodb.internal.EnhancedClientUtils.keyRef;
2020
import static software.amazon.awssdk.enhanced.dynamodb.internal.EnhancedClientUtils.valueRef;
21-
import static software.amazon.awssdk.enhanced.dynamodb.internal.operations.UpdateItemOperation.NESTED_OBJECT_UPDATE;
2221
import static software.amazon.awssdk.utils.CollectionUtils.filterMap;
2322

2423
import java.util.Arrays;
2524
import java.util.Collections;
2625
import java.util.List;
2726
import java.util.Map;
2827
import java.util.function.Function;
29-
import java.util.regex.Pattern;
3028
import java.util.stream.Collectors;
3129
import software.amazon.awssdk.annotations.SdkInternalApi;
3230
import software.amazon.awssdk.enhanced.dynamodb.TableMetadata;
@@ -41,8 +39,6 @@
4139
@SdkInternalApi
4240
public final class UpdateExpressionUtils {
4341

44-
private static final Pattern PATTERN = Pattern.compile(NESTED_OBJECT_UPDATE);
45-
4642
private UpdateExpressionUtils() {
4743
}
4844

@@ -140,12 +136,9 @@ private static Function<String, String> behaviorBasedValue(UpdateBehavior update
140136
/**
141137
* Simple utility method that can create an ExpressionNames map based on a list of attribute names.
142138
*/
143-
private static Map<String, String> expressionNamesFor(String attributeNames) {
144-
if (attributeNames.contains(NESTED_OBJECT_UPDATE)) {
145-
return Arrays.stream(PATTERN.split(attributeNames)).distinct()
146-
.collect(Collectors.toMap(EnhancedClientUtils::keyRef, Function.identity()));
147-
}
148-
149-
return Collections.singletonMap(keyRef(attributeNames), attributeNames);
139+
private static Map<String, String> expressionNamesFor(String... attributeNames) {
140+
return Arrays.stream(attributeNames)
141+
.collect(Collectors.toMap(EnhancedClientUtils::keyRef, Function.identity()));
150142
}
143+
151144
}

0 commit comments

Comments
 (0)