2323
2424import java .util .Arrays ;
2525import java .util .Collections ;
26+ import java .util .HashMap ;
2627import java .util .List ;
2728import java .util .Map ;
2829import java .util .Objects ;
2930import java .util .Set ;
3031import java .util .stream .Collectors ;
32+ import java .util .stream .Stream ;
3133import software .amazon .awssdk .annotations .SdkInternalApi ;
3234import software .amazon .awssdk .enhanced .dynamodb .TableMetadata ;
3335import software .amazon .awssdk .enhanced .dynamodb .update .UpdateExpression ;
4042@ SdkInternalApi
4143public final class UpdateExpressionResolver {
4244
45+ private final TableMetadata tableMetadata ;
46+ private final Map <String , AttributeValue > nonKeyAttributes ;
4347 private final UpdateExpression extensionExpression ;
4448 private final UpdateExpression requestExpression ;
45- private final Map <String , AttributeValue > itemNonKeyAttributes ;
46- private final TableMetadata tableMetadata ;
4749
4850 private UpdateExpressionResolver (Builder builder ) {
51+ this .tableMetadata = builder .tableMetadata ;
52+ this .nonKeyAttributes = builder .nonKeyAttributes ;
4953 this .extensionExpression = builder .extensionExpression ;
5054 this .requestExpression = builder .requestExpression ;
51- this .itemNonKeyAttributes = builder .nonKeyAttributes ;
52- this .tableMetadata = builder .tableMetadata ;
5355 }
5456
5557 public static Builder builder () {
@@ -69,17 +71,24 @@ public static Builder builder() {
6971 * @return merged UpdateExpression, or empty if no updates needed
7072 */
7173 public UpdateExpression resolve () {
72- Set < String > excludedFromRemoval = attributesPresentInExpressions ( Arrays . asList ( extensionExpression , requestExpression )) ;
74+ UpdateExpression itemExpression = null ;
7375
74- UpdateExpression itemSetExpression = generateItemSetExpression ( itemNonKeyAttributes , tableMetadata );
75- UpdateExpression itemRemoveExpression = generateItemRemoveExpression ( itemNonKeyAttributes , excludedFromRemoval );
76- UpdateExpression itemFinalExpression = UpdateExpression . mergeExpressions ( itemSetExpression , itemRemoveExpression );
76+ if (! nonKeyAttributes . isEmpty ()) {
77+ Set < String > attributesExcludedFromRemoval = attributesPresentInOtherExpressions (
78+ Arrays . asList ( extensionExpression , requestExpression ) );
7779
78- UpdateExpression itemAndExtensionExpression = UpdateExpression .mergeExpressions (extensionExpression , itemFinalExpression );
79- return UpdateExpression .mergeExpressions (requestExpression , itemAndExtensionExpression );
80+ itemExpression = UpdateExpression .mergeExpressions (
81+ generateItemSetExpression (nonKeyAttributes , tableMetadata ),
82+ generateItemRemoveExpression (nonKeyAttributes , attributesExcludedFromRemoval ));
83+ }
84+
85+ return Stream .of (itemExpression , extensionExpression , requestExpression )
86+ .filter (Objects ::nonNull )
87+ .reduce (UpdateExpression ::mergeExpressions )
88+ .orElse (null );
8089 }
8190
82- private static Set <String > attributesPresentInExpressions (List <UpdateExpression > updateExpressions ) {
91+ private static Set <String > attributesPresentInOtherExpressions (List <UpdateExpression > updateExpressions ) {
8392 return updateExpressions .stream ()
8493 .filter (Objects ::nonNull )
8594 .map (UpdateExpressionConverter ::findAttributeNames )
@@ -109,26 +118,27 @@ public static UpdateExpression generateItemRemoveExpression(Map<String, Attribut
109118 public static final class Builder {
110119
111120 private TableMetadata tableMetadata ;
121+ private Map <String , AttributeValue > nonKeyAttributes ;
112122 private UpdateExpression extensionExpression ;
113123 private UpdateExpression requestExpression ;
114- private Map <String , AttributeValue > nonKeyAttributes ;
115124
116125 public Builder tableMetadata (TableMetadata tableMetadata ) {
117- requireNonNull ( tableMetadata , "A TableMetadata is required when generating an Update Expression" );
118- this . tableMetadata = tableMetadata ;
126+ this . tableMetadata = requireNonNull (
127+ tableMetadata , "A TableMetadata is required when generating an Update Expression" ) ;
119128 return this ;
120129 }
121130
122- public Builder extensionExpression (UpdateExpression extensionExpression ) {
123- this .extensionExpression = extensionExpression ;
131+ public Builder nonKeyAttributes (Map <String , AttributeValue > nonKeyAttributes ) {
132+ if (nonKeyAttributes == null ) {
133+ this .nonKeyAttributes = Collections .emptyMap ();
134+ } else {
135+ this .nonKeyAttributes = Collections .unmodifiableMap (new HashMap <>(nonKeyAttributes ));
136+ }
124137 return this ;
125138 }
126139
127- public Builder itemNonKeyAttributes (Map <String , AttributeValue > nonKeyAttributes ) {
128- if (nonKeyAttributes == null ) {
129- nonKeyAttributes = Collections .emptyMap ();
130- }
131- this .nonKeyAttributes = nonKeyAttributes ;
140+ public Builder extensionExpression (UpdateExpression extensionExpression ) {
141+ this .extensionExpression = extensionExpression ;
132142 return this ;
133143 }
134144
0 commit comments