Skip to content

Commit d6916da

Browse files
committed
Replace nested Stream.concat with direct iteration in expression merging
1 parent eee30b2 commit d6916da

1 file changed

Lines changed: 61 additions & 22 deletions

File tree

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

Lines changed: 61 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.util.ArrayList;
1919
import java.util.Collections;
20+
import java.util.HashMap;
2021
import java.util.List;
2122
import java.util.Map;
2223
import java.util.stream.Collectors;
@@ -114,7 +115,7 @@ private static List<String> groupExpressions(UpdateExpression expression) {
114115
List<String> groupExpressions = new ArrayList<>();
115116
if (!expression.setActions().isEmpty()) {
116117
groupExpressions.add(SET + expression.setActions().stream()
117-
.map(a -> String.format("%s = %s", a.path(), a.value()))
118+
.map(a -> a.path() + " = " + a.value())
118119
.collect(Collectors.joining(ACTION_SEPARATOR)));
119120
}
120121
if (!expression.removeActions().isEmpty()) {
@@ -124,42 +125,80 @@ private static List<String> groupExpressions(UpdateExpression expression) {
124125
}
125126
if (!expression.deleteActions().isEmpty()) {
126127
groupExpressions.add(DELETE + expression.deleteActions().stream()
127-
.map(a -> String.format("%s %s", a.path(), a.value()))
128+
.map(a -> a.path() + " " + a.value())
128129
.collect(Collectors.joining(ACTION_SEPARATOR)));
129130
}
130131
if (!expression.addActions().isEmpty()) {
131132
groupExpressions.add(ADD + expression.addActions().stream()
132-
.map(a -> String.format("%s %s", a.path(), a.value()))
133+
.map(a -> a.path() + " " + a.value())
133134
.collect(Collectors.joining(ACTION_SEPARATOR)));
134135
}
135136
return groupExpressions;
136137
}
137138

138-
private static Stream<Map<String, String>> streamOfExpressionNames(UpdateExpression expression) {
139-
return Stream.concat(expression.setActions().stream().map(SetAction::expressionNames),
140-
Stream.concat(expression.removeActions().stream().map(RemoveAction::expressionNames),
141-
Stream.concat(expression.deleteActions().stream()
142-
.map(DeleteAction::expressionNames),
143-
expression.addActions().stream()
144-
.map(AddAction::expressionNames))));
139+
private static Map<String, AttributeValue> mergeExpressionValues(UpdateExpression expression) {
140+
Map<String, AttributeValue> merged = new HashMap<>();
141+
142+
for (SetAction action : expression.setActions()) {
143+
mergeValuesInto(merged, action.expressionValues());
144+
}
145+
for (DeleteAction action : expression.deleteActions()) {
146+
mergeValuesInto(merged, action.expressionValues());
147+
}
148+
for (AddAction action : expression.addActions()) {
149+
mergeValuesInto(merged, action.expressionValues());
150+
}
151+
152+
return merged.isEmpty() ? Collections.emptyMap() : Collections.unmodifiableMap(merged);
145153
}
146154

147-
private static Map<String, AttributeValue> mergeExpressionValues(UpdateExpression expression) {
148-
return streamOfExpressionValues(expression)
149-
.reduce(Expression::joinValues)
150-
.orElseGet(Collections::emptyMap);
155+
private static Map<String, String> mergeExpressionNames(UpdateExpression expression) {
156+
Map<String, String> merged = new HashMap<>();
157+
158+
for (SetAction action : expression.setActions()) {
159+
mergeNamesInto(merged, action.expressionNames());
160+
}
161+
for (RemoveAction action : expression.removeActions()) {
162+
mergeNamesInto(merged, action.expressionNames());
163+
}
164+
for (DeleteAction action : expression.deleteActions()) {
165+
mergeNamesInto(merged, action.expressionNames());
166+
}
167+
for (AddAction action : expression.addActions()) {
168+
mergeNamesInto(merged, action.expressionNames());
169+
}
170+
171+
return merged.isEmpty() ? Collections.emptyMap() : Collections.unmodifiableMap(merged);
151172
}
152173

153-
private static Stream<Map<String, AttributeValue>> streamOfExpressionValues(UpdateExpression expression) {
154-
return Stream.concat(expression.setActions().stream().map(SetAction::expressionValues),
155-
Stream.concat(expression.deleteActions().stream().map(DeleteAction::expressionValues),
156-
expression.addActions().stream().map(AddAction::expressionValues)));
174+
private static void mergeNamesInto(Map<String, String> target, Map<String, String> source) {
175+
if (source == null || source.isEmpty()) {
176+
return;
177+
}
178+
source.forEach((key, value) -> {
179+
String oldValue = target.get(key);
180+
if (oldValue != null && !oldValue.equals(value)) {
181+
throw new IllegalArgumentException(
182+
String.format("Attempt to coalesce two expressions with conflicting expression names. "
183+
+ "Expression name key = '%s'", key));
184+
}
185+
target.put(key, value);
186+
});
157187
}
158188

159-
private static Map<String, String> mergeExpressionNames(UpdateExpression expression) {
160-
return streamOfExpressionNames(expression)
161-
.reduce(Expression::joinNames)
162-
.orElseGet(Collections::emptyMap);
189+
private static void mergeValuesInto(Map<String, AttributeValue> target, Map<String, AttributeValue> source) {
190+
if (source == null || source.isEmpty()) {
191+
return;
192+
}
193+
source.forEach((key, value) -> {
194+
AttributeValue oldValue = target.get(key);
195+
if (oldValue != null && !oldValue.equals(value)) {
196+
throw new IllegalArgumentException(
197+
String.format("Attempt to coalesce two expressions with conflicting expression values. "
198+
+ "Expression value key = '%s'", key));
199+
}
200+
target.put(key, value);
201+
});
163202
}
164203

165204
private static List<String> listPathsWithoutTokens(UpdateExpression expression) {

0 commit comments

Comments
 (0)