1717
1818import java .util .ArrayList ;
1919import java .util .Collections ;
20+ import java .util .HashMap ;
2021import java .util .List ;
2122import java .util .Map ;
2223import 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