Skip to content

Commit 599b654

Browse files
authored
Fixes to UpdateItemEnhancedRequest (#2702)
* Fixes to UpdateItemEnhancedRequest - Include ConditionExpression in toBuilder - Fix equals() and hashCode() to include ConditionExpression in calculations * Switch to Objects.equals() for equals implementation
1 parent eee6bbb commit 599b654

File tree

3 files changed

+133
-7
lines changed

3 files changed

+133
-7
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"category": "DynamoDB Enhanced Client",
3+
"contributor": "",
4+
"type": "bugfix",
5+
"description": "Fixes for `UpdateItemEnhancedRequest`:\n - Include `ConditionExpression` in `toBuilder()`\n - Include `ConditionExpression` in `equals()` and `hashCode()` calculations"
6+
}

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/model/UpdateItemEnhancedRequest.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

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

18+
import java.util.Objects;
1819
import software.amazon.awssdk.annotations.SdkPublicApi;
1920
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbAsyncTable;
2021
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
@@ -57,7 +58,7 @@ public static <T> Builder<T> builder(Class<? extends T> itemClass) {
5758
* Returns a builder initialized with all existing values on the request object.
5859
*/
5960
public Builder<T> toBuilder() {
60-
return new Builder<T>().item(item).ignoreNulls(ignoreNulls);
61+
return new Builder<T>().item(item).ignoreNulls(ignoreNulls).conditionExpression(conditionExpression);
6162
}
6263

6364
/**
@@ -89,19 +90,17 @@ public boolean equals(Object o) {
8990
if (o == null || getClass() != o.getClass()) {
9091
return false;
9192
}
92-
9393
UpdateItemEnhancedRequest<?> that = (UpdateItemEnhancedRequest<?>) o;
94-
95-
if (item != null ? ! item.equals(that.item) : that.item != null) {
96-
return false;
97-
}
98-
return ignoreNulls != null ? ignoreNulls.equals(that.ignoreNulls) : that.ignoreNulls == null;
94+
return Objects.equals(item, that.item)
95+
&& Objects.equals(ignoreNulls, that.ignoreNulls)
96+
&& Objects.equals(conditionExpression, that.conditionExpression);
9997
}
10098

10199
@Override
102100
public int hashCode() {
103101
int result = item != null ? item.hashCode() : 0;
104102
result = 31 * result + (ignoreNulls != null ? ignoreNulls.hashCode() : 0);
103+
result = 31 * result + (conditionExpression != null ? conditionExpression.hashCode() : 0);
105104
return result;
106105
}
107106

services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/model/UpdateItemEnhancedRequestTest.java

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
package software.amazon.awssdk.enhanced.dynamodb.model;
1717

1818
import static org.hamcrest.MatcherAssert.assertThat;
19+
import static org.hamcrest.Matchers.equalTo;
1920
import static org.hamcrest.Matchers.is;
21+
import static org.hamcrest.Matchers.not;
2022
import static org.hamcrest.Matchers.nullValue;
2123
import static software.amazon.awssdk.enhanced.dynamodb.functionaltests.models.FakeItem.createUniqueFakeItem;
2224
import static software.amazon.awssdk.enhanced.dynamodb.internal.AttributeValues.stringValue;
@@ -84,4 +86,123 @@ public void toBuilder() {
8486

8587
assertThat(copiedObject, is(builtObject));
8688
}
89+
90+
@Test
91+
public void equals_self() {
92+
UpdateItemEnhancedRequest<FakeItem> builtObject = UpdateItemEnhancedRequest.builder(FakeItem.class).build();
93+
94+
assertThat(builtObject, equalTo(builtObject));
95+
}
96+
97+
@Test
98+
public void equals_differentType() {
99+
UpdateItemEnhancedRequest<FakeItem> builtObject = UpdateItemEnhancedRequest.builder(FakeItem.class).build();
100+
101+
assertThat(builtObject, not(equalTo(new Object())));
102+
}
103+
104+
@Test
105+
public void equals_itemNotEqual() {
106+
FakeItem fakeItem1 = createUniqueFakeItem();
107+
FakeItem fakeItem2 = createUniqueFakeItem();
108+
109+
UpdateItemEnhancedRequest<FakeItem> builtObject1 = UpdateItemEnhancedRequest.builder(FakeItem.class)
110+
.item(fakeItem1)
111+
.build();
112+
113+
UpdateItemEnhancedRequest<FakeItem> builtObject2 = UpdateItemEnhancedRequest.builder(FakeItem.class)
114+
.item(fakeItem2)
115+
.build();
116+
117+
assertThat(builtObject1, not(equalTo(builtObject2)));
118+
}
119+
120+
@Test
121+
public void equals_ignoreNullsNotEqual() {
122+
UpdateItemEnhancedRequest<FakeItem> builtObject1 = UpdateItemEnhancedRequest.builder(FakeItem.class)
123+
.ignoreNulls(true)
124+
.build();
125+
126+
UpdateItemEnhancedRequest<FakeItem> builtObject2 = UpdateItemEnhancedRequest.builder(FakeItem.class)
127+
.ignoreNulls(false)
128+
.build();
129+
130+
assertThat(builtObject1, not(equalTo(builtObject2)));
131+
}
132+
133+
@Test
134+
public void equals_conditionExpressionNotEqual() {
135+
Expression conditionExpression1 = Expression.builder()
136+
.expression("#key = :value OR #key1 = :value1")
137+
.putExpressionName("#key", "attribute")
138+
.putExpressionName("#key1", "attribute3")
139+
.putExpressionValue(":value", stringValue("wrong"))
140+
.putExpressionValue(":value1", stringValue("three"))
141+
.build();
142+
143+
Expression conditionExpression2 = Expression.builder()
144+
.expression("#key = :value AND #key1 = :value1")
145+
.putExpressionName("#key", "attribute")
146+
.putExpressionName("#key1", "attribute3")
147+
.putExpressionValue(":value", stringValue("wrong"))
148+
.putExpressionValue(":value1", stringValue("three"))
149+
.build();
150+
UpdateItemEnhancedRequest<FakeItem> builtObject1 = UpdateItemEnhancedRequest.builder(FakeItem.class)
151+
.conditionExpression(conditionExpression1)
152+
.build();
153+
154+
UpdateItemEnhancedRequest<FakeItem> builtObject2 = UpdateItemEnhancedRequest.builder(FakeItem.class)
155+
.conditionExpression(conditionExpression2)
156+
.build();
157+
158+
assertThat(builtObject1, not(equalTo(builtObject2)));
159+
}
160+
161+
@Test
162+
public void hashCode_minimal() {
163+
UpdateItemEnhancedRequest<FakeItem> emptyRequest = UpdateItemEnhancedRequest.builder(FakeItem.class).build();
164+
165+
assertThat(emptyRequest.hashCode(), equalTo(0));
166+
}
167+
168+
@Test
169+
public void hashCode_includesItem() {
170+
UpdateItemEnhancedRequest<FakeItem> emptyRequest = UpdateItemEnhancedRequest.builder(FakeItem.class).build();
171+
172+
UpdateItemEnhancedRequest<FakeItem> containsItem = UpdateItemEnhancedRequest.builder(FakeItem.class)
173+
.item(createUniqueFakeItem())
174+
.build();
175+
176+
assertThat(containsItem.hashCode(), not(equalTo(emptyRequest.hashCode())));
177+
}
178+
179+
@Test
180+
public void hashCode_includesIgnoreNulls() {
181+
UpdateItemEnhancedRequest<FakeItem> emptyRequest = UpdateItemEnhancedRequest.builder(FakeItem.class).build();
182+
183+
UpdateItemEnhancedRequest<FakeItem> containsItem = UpdateItemEnhancedRequest.builder(FakeItem.class)
184+
.ignoreNulls(true)
185+
.build();
186+
187+
assertThat(containsItem.hashCode(), not(equalTo(emptyRequest.hashCode())));
188+
}
189+
190+
@Test
191+
public void hashCode_includesConditionExpression() {
192+
UpdateItemEnhancedRequest<FakeItem> emptyRequest = UpdateItemEnhancedRequest.builder(FakeItem.class).build();
193+
194+
Expression conditionExpression = Expression.builder()
195+
.expression("#key = :value OR #key1 = :value1")
196+
.putExpressionName("#key", "attribute")
197+
.putExpressionName("#key1", "attribute3")
198+
.putExpressionValue(":value", stringValue("wrong"))
199+
.putExpressionValue(":value1", stringValue("three"))
200+
.build();
201+
202+
UpdateItemEnhancedRequest<FakeItem> containsExpression = UpdateItemEnhancedRequest.builder(FakeItem.class)
203+
.conditionExpression(conditionExpression)
204+
.build();
205+
206+
assertThat(containsExpression.hashCode(), not(equalTo(emptyRequest.hashCode())));
207+
}
87208
}

0 commit comments

Comments
 (0)