Skip to content

Commit eee6bbb

Browse files
authored
Fixes to Put and DeleteItemEnhancedRequest (#2703)
* Fixes to Put/DeleteItemEhancedRequest Include ConditionExpression in equals/hashCode calculations * Use Objects.equals()
1 parent 1fef658 commit eee6bbb

File tree

5 files changed

+176
-9
lines changed

5 files changed

+176
-9
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": "Fix `PutItemEnhancedRequest` and `DeleteItemEnhancedRequest` to include `ConditionExpression` in their `equals()` and `hashCode()` calculations."
6+
}

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

Lines changed: 5 additions & 4 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 java.util.function.Consumer;
1920
import software.amazon.awssdk.annotations.SdkPublicApi;
2021
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbAsyncTable;
@@ -76,15 +77,15 @@ public boolean equals(Object o) {
7677
if (o == null || getClass() != o.getClass()) {
7778
return false;
7879
}
79-
8080
DeleteItemEnhancedRequest that = (DeleteItemEnhancedRequest) o;
81-
82-
return key != null ? key.equals(that.key) : that.key == null;
81+
return Objects.equals(key, that.key) && Objects.equals(conditionExpression, that.conditionExpression);
8382
}
8483

8584
@Override
8685
public int hashCode() {
87-
return key != null ? key.hashCode() : 0;
86+
int result = key != null ? key.hashCode() : 0;
87+
result = 31 * result + (conditionExpression != null ? conditionExpression.hashCode() : 0);
88+
return result;
8889
}
8990

9091
/**

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

Lines changed: 6 additions & 5 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;
@@ -78,15 +79,15 @@ public boolean equals(Object o) {
7879
if (o == null || getClass() != o.getClass()) {
7980
return false;
8081
}
81-
82-
PutItemEnhancedRequest<?> putItem = (PutItemEnhancedRequest<?>) o;
83-
84-
return item != null ? item.equals(putItem.item) : putItem.item == null;
82+
PutItemEnhancedRequest<?> that = (PutItemEnhancedRequest<?>) o;
83+
return Objects.equals(item, that.item) && Objects.equals(conditionExpression, that.conditionExpression);
8584
}
8685

8786
@Override
8887
public int hashCode() {
89-
return item != null ? item.hashCode() : 0;
88+
int result = item != null ? item.hashCode() : 0;
89+
result = 31 * result + (conditionExpression != null ? conditionExpression.hashCode() : 0);
90+
return result;
9091
}
9192

9293
/**

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

Lines changed: 78 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.internal.AttributeValues.stringValue;
2224

@@ -69,4 +71,80 @@ public void toBuilder() {
6971
assertThat(copiedObject, is(builtObject));
7072
}
7173

74+
@Test
75+
public void equals_keyNotEqual() {
76+
Key key1 = Key.builder().partitionValue("key1").build();
77+
Key key2 = Key.builder().partitionValue("key2").build();
78+
79+
DeleteItemEnhancedRequest builtObject1 = DeleteItemEnhancedRequest.builder().key(key1).build();
80+
DeleteItemEnhancedRequest builtObject2 = DeleteItemEnhancedRequest.builder().key(key2).build();
81+
82+
assertThat(builtObject1, not(equalTo(builtObject2)));
83+
}
84+
85+
@Test
86+
public void equals_conditionExpressionNotEqual() {
87+
Expression conditionExpression1 = Expression.builder()
88+
.expression("#key = :value OR #key1 = :value1")
89+
.putExpressionName("#key", "attribute")
90+
.putExpressionName("#key1", "attribute3")
91+
.putExpressionValue(":value", stringValue("wrong"))
92+
.putExpressionValue(":value1", stringValue("three"))
93+
.build();
94+
95+
Expression conditionExpression2 = Expression.builder()
96+
.expression("#key = :value AND #key1 = :value1")
97+
.putExpressionName("#key", "attribute")
98+
.putExpressionName("#key1", "attribute3")
99+
.putExpressionValue(":value", stringValue("wrong"))
100+
.putExpressionValue(":value1", stringValue("three"))
101+
.build();
102+
103+
DeleteItemEnhancedRequest builtObject1 = DeleteItemEnhancedRequest.builder()
104+
.conditionExpression(conditionExpression1)
105+
.build();
106+
107+
DeleteItemEnhancedRequest builtObject2 = DeleteItemEnhancedRequest.builder()
108+
.conditionExpression(conditionExpression2)
109+
.build();
110+
111+
assertThat(builtObject1, not(equalTo(builtObject2)));
112+
}
113+
114+
@Test
115+
public void hashCode_minimal() {
116+
DeleteItemEnhancedRequest emptyRequest = DeleteItemEnhancedRequest.builder().build();
117+
118+
assertThat(emptyRequest.hashCode(), equalTo(0));
119+
}
120+
121+
@Test
122+
public void hashCode_includesKey() {
123+
DeleteItemEnhancedRequest emptyRequest = DeleteItemEnhancedRequest.builder().build();
124+
125+
Key key = Key.builder().partitionValue("key").build();
126+
127+
DeleteItemEnhancedRequest containsKey = DeleteItemEnhancedRequest.builder().key(key).build();
128+
129+
assertThat(containsKey.hashCode(), not(equalTo(emptyRequest.hashCode())));
130+
}
131+
132+
@Test
133+
public void hashCode_includesConditionExpression() {
134+
DeleteItemEnhancedRequest emptyRequest = DeleteItemEnhancedRequest.builder().build();
135+
136+
Expression conditionExpression = Expression.builder()
137+
.expression("#key = :value OR #key1 = :value1")
138+
.putExpressionName("#key", "attribute")
139+
.putExpressionName("#key1", "attribute3")
140+
.putExpressionValue(":value", stringValue("wrong"))
141+
.putExpressionValue(":value1", stringValue("three"))
142+
.build();
143+
144+
DeleteItemEnhancedRequest containsKey = DeleteItemEnhancedRequest.builder()
145+
.conditionExpression(conditionExpression)
146+
.build();
147+
148+
assertThat(containsKey.hashCode(), not(equalTo(emptyRequest.hashCode())));
149+
}
72150
}

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

Lines changed: 81 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;
@@ -80,4 +82,83 @@ public void toBuilder() {
8082

8183
assertThat(copiedObject, is(builtObject));
8284
}
85+
86+
@Test
87+
public void equals_itemNotEqual() {
88+
FakeItem item1 = createUniqueFakeItem();
89+
FakeItem item2 = createUniqueFakeItem();
90+
91+
PutItemEnhancedRequest<FakeItem> builtObject1 = PutItemEnhancedRequest.builder(FakeItem.class)
92+
.item(item1)
93+
.build();
94+
PutItemEnhancedRequest<FakeItem> builtObject2 = PutItemEnhancedRequest.builder(FakeItem.class)
95+
.item(item2)
96+
.build();
97+
98+
assertThat(builtObject1, not(equalTo(builtObject2)));
99+
}
100+
101+
@Test
102+
public void equals_conditionExpressionNotEqual() {
103+
Expression conditionExpression1 = Expression.builder()
104+
.expression("#key = :value OR #key1 = :value1")
105+
.putExpressionName("#key", "attribute")
106+
.putExpressionName("#key1", "attribute3")
107+
.putExpressionValue(":value", stringValue("wrong"))
108+
.putExpressionValue(":value1", stringValue("three"))
109+
.build();
110+
111+
Expression conditionExpression2 = Expression.builder()
112+
.expression("#key = :value AND #key1 = :value1")
113+
.putExpressionName("#key", "attribute")
114+
.putExpressionName("#key1", "attribute3")
115+
.putExpressionValue(":value", stringValue("wrong"))
116+
.putExpressionValue(":value1", stringValue("three"))
117+
.build();
118+
119+
PutItemEnhancedRequest<FakeItem> builtObject1 = PutItemEnhancedRequest.builder(FakeItem.class)
120+
.conditionExpression(conditionExpression1)
121+
.build();
122+
PutItemEnhancedRequest<FakeItem> builtObject2 = PutItemEnhancedRequest.builder(FakeItem.class)
123+
.conditionExpression(conditionExpression2)
124+
.build();
125+
126+
assertThat(builtObject1, not(equalTo(builtObject2)));
127+
}
128+
129+
@Test
130+
public void hashCode_minimal() {
131+
PutItemEnhancedRequest<FakeItem> emptyRequest = PutItemEnhancedRequest.builder(FakeItem.class).build();
132+
133+
assertThat(emptyRequest.hashCode(), equalTo(0));
134+
}
135+
136+
@Test
137+
public void hashCode_includesItem() {
138+
PutItemEnhancedRequest<FakeItem> emptyRequest = PutItemEnhancedRequest.builder(FakeItem.class).build();
139+
PutItemEnhancedRequest<FakeItem> containsItem = PutItemEnhancedRequest.builder(FakeItem.class)
140+
.item(createUniqueFakeItem())
141+
.build();
142+
143+
assertThat(containsItem.hashCode(), not(equalTo(emptyRequest.hashCode())));
144+
}
145+
146+
@Test
147+
public void hashCode_includesConditionExpression() {
148+
PutItemEnhancedRequest<FakeItem> emptyRequest = PutItemEnhancedRequest.builder(FakeItem.class).build();
149+
150+
Expression conditionExpression = Expression.builder()
151+
.expression("#key = :value OR #key1 = :value1")
152+
.putExpressionName("#key", "attribute")
153+
.putExpressionName("#key1", "attribute3")
154+
.putExpressionValue(":value", stringValue("wrong"))
155+
.putExpressionValue(":value1", stringValue("three"))
156+
.build();
157+
158+
PutItemEnhancedRequest<FakeItem> containsExpression = PutItemEnhancedRequest.builder(FakeItem.class)
159+
.conditionExpression(conditionExpression)
160+
.build();
161+
162+
assertThat(containsExpression.hashCode(), not(equalTo(emptyRequest.hashCode())));
163+
}
83164
}

0 commit comments

Comments
 (0)