Skip to content

Commit e503fcc

Browse files
acouvreurjoviegas
andauthored
Add StreamSpecification to CreateTableEnhancedRequest (#4011)
* Add `StreamSpecification` to `CreateTableEnhancedRequest` Allows you to specify a StreamSpecification when creating a DynamoDbTable using the CreateTableOperation with the EnhancedDynamoDbClient Closes #4010 * Updated the change log and java doc --------- Co-authored-by: John Viegas <[email protected]> Co-authored-by: John Viegas <[email protected]>
1 parent c1983da commit e503fcc

File tree

4 files changed

+77
-0
lines changed

4 files changed

+77
-0
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type": "feature",
3+
"category": "DynamoDB Enhanced Client",
4+
"contributor": "acouvreur",
5+
"description": "Added support for StreamSpecification in the CreateTableEnhancedRequest, allowing configuration of table stream specification using DynamoDB Enhanced Client."
6+
}

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/internal/operations/CreateTableOperation.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ public CreateTableRequest generateRequest(TableSchema<T> tableSchema,
140140
.attributeDefinitions(attributeDefinitions)
141141
.billingMode(billingMode)
142142
.provisionedThroughput(this.request.provisionedThroughput())
143+
.streamSpecification(this.request.streamSpecification())
143144
.build();
144145
}
145146

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbAsyncTable;
2727
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
2828
import software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughput;
29+
import software.amazon.awssdk.services.dynamodb.model.StreamSpecification;
2930

3031
/**
3132
* Defines parameters used to create a DynamoDb table using the createTable() operation (such as
@@ -38,11 +39,13 @@
3839
@ThreadSafe
3940
public final class CreateTableEnhancedRequest {
4041
private final ProvisionedThroughput provisionedThroughput;
42+
private final StreamSpecification streamSpecification;
4143
private final Collection<EnhancedLocalSecondaryIndex> localSecondaryIndices;
4244
private final Collection<EnhancedGlobalSecondaryIndex> globalSecondaryIndices;
4345

4446
private CreateTableEnhancedRequest(Builder builder) {
4547
this.provisionedThroughput = builder.provisionedThroughput;
48+
this.streamSpecification = builder.streamSpecification;
4649
this.localSecondaryIndices = builder.localSecondaryIndices;
4750
this.globalSecondaryIndices = builder.globalSecondaryIndices;
4851
}
@@ -59,6 +62,7 @@ public static Builder builder() {
5962
*/
6063
public Builder toBuilder() {
6164
return builder().provisionedThroughput(provisionedThroughput)
65+
.streamSpecification(streamSpecification)
6266
.localSecondaryIndices(localSecondaryIndices)
6367
.globalSecondaryIndices(globalSecondaryIndices);
6468
}
@@ -70,6 +74,13 @@ public ProvisionedThroughput provisionedThroughput() {
7074
return provisionedThroughput;
7175
}
7276

77+
/**
78+
* Returns the stream specification value set on this request object, or null if it has not been set.
79+
*/
80+
public StreamSpecification streamSpecification() {
81+
return streamSpecification;
82+
}
83+
7384
/**
7485
* Returns the local secondary index set on this request object, or null if it has not been set.
7586
*/
@@ -99,6 +110,10 @@ public boolean equals(Object o) {
99110
that.provisionedThroughput != null) {
100111
return false;
101112
}
113+
if (streamSpecification != null ? ! streamSpecification.equals(that.streamSpecification) :
114+
that.streamSpecification != null) {
115+
return false;
116+
}
102117
if (localSecondaryIndices != null ? ! localSecondaryIndices.equals(that.localSecondaryIndices) :
103118
that.localSecondaryIndices != null) {
104119
return false;
@@ -110,6 +125,7 @@ public boolean equals(Object o) {
110125
@Override
111126
public int hashCode() {
112127
int result = provisionedThroughput != null ? provisionedThroughput.hashCode() : 0;
128+
result = 31 * result + (streamSpecification != null ? streamSpecification.hashCode() : 0);
113129
result = 31 * result + (localSecondaryIndices != null ? localSecondaryIndices.hashCode() : 0);
114130
result = 31 * result + (globalSecondaryIndices != null ? globalSecondaryIndices.hashCode() : 0);
115131
return result;
@@ -121,6 +137,7 @@ public int hashCode() {
121137
@NotThreadSafe
122138
public static final class Builder {
123139
private ProvisionedThroughput provisionedThroughput;
140+
private StreamSpecification streamSpecification;
124141
private Collection<EnhancedLocalSecondaryIndex> localSecondaryIndices;
125142
private Collection<EnhancedGlobalSecondaryIndex> globalSecondaryIndices;
126143

@@ -149,6 +166,27 @@ public Builder provisionedThroughput(Consumer<ProvisionedThroughput.Builder> pro
149166
return provisionedThroughput(builder.build());
150167
}
151168

169+
/**
170+
* Sets the {@link StreamSpecification} for this table.
171+
* <p>
172+
* See the DynamoDb documentation for more information on stream specification values.
173+
*/
174+
public Builder streamSpecification(StreamSpecification streamSpecification) {
175+
this.streamSpecification = streamSpecification;
176+
return this;
177+
}
178+
179+
/**
180+
* This is a convenience method for {@link #streamSpecification(StreamSpecification)} that creates an instance of the
181+
* {@link StreamSpecification.Builder} for you, avoiding the need to create one manually via
182+
* {@link StreamSpecification#builder()}.
183+
*/
184+
public Builder streamSpecification(Consumer<StreamSpecification.Builder> streamSpecification) {
185+
StreamSpecification.Builder builder = StreamSpecification.builder();
186+
streamSpecification.accept(builder);
187+
return streamSpecification(builder.build());
188+
}
189+
152190
/**
153191
* Defines a local secondary index for this table.
154192
* <p>

services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/internal/operations/CreateTableOperationTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import static org.hamcrest.Matchers.containsInAnyOrder;
2020
import static org.hamcrest.Matchers.empty;
2121
import static org.hamcrest.Matchers.is;
22+
import static org.hamcrest.Matchers.nullValue;
2223
import static org.hamcrest.Matchers.sameInstance;
2324
import static org.mockito.ArgumentMatchers.any;
2425
import static org.mockito.ArgumentMatchers.same;
@@ -57,6 +58,9 @@
5758
import software.amazon.awssdk.services.dynamodb.model.ProjectionType;
5859
import software.amazon.awssdk.services.dynamodb.model.ProvisionedThroughput;
5960
import software.amazon.awssdk.services.dynamodb.model.ScalarAttributeType;
61+
import software.amazon.awssdk.services.dynamodb.model.StreamSpecification;
62+
import software.amazon.awssdk.services.dynamodb.model.StreamViewType;
63+
6064

6165
@RunWith(MockitoJUnitRunner.class)
6266
public class CreateTableOperationTest {
@@ -329,6 +333,34 @@ public void generateRequest_withNoProvisionedThroughput() {
329333
assertThat(request.billingMode(), is(BillingMode.PAY_PER_REQUEST));
330334
}
331335

336+
@Test
337+
public void generateRequest_withStreamSpecification() {
338+
StreamSpecification streamSpecification = StreamSpecification.builder()
339+
.streamEnabled(true)
340+
.streamViewType(StreamViewType.NEW_IMAGE)
341+
.build();
342+
343+
CreateTableOperation<FakeItem> operation = CreateTableOperation.create(
344+
CreateTableEnhancedRequest.builder().streamSpecification(streamSpecification).build());
345+
346+
CreateTableRequest request = operation.generateRequest(FakeItem.getTableSchema(),
347+
PRIMARY_CONTEXT,
348+
null);
349+
350+
assertThat(request.streamSpecification(), is(streamSpecification));
351+
}
352+
353+
@Test
354+
public void generateRequest_withNoStreamSpecification() {
355+
CreateTableOperation<FakeItem> operation = CreateTableOperation.create(CreateTableEnhancedRequest.builder().build());
356+
357+
CreateTableRequest request = operation.generateRequest(FakeItem.getTableSchema(),
358+
PRIMARY_CONTEXT,
359+
null);
360+
361+
assertThat(request.streamSpecification(), is(nullValue()));
362+
}
363+
332364

333365
@Test
334366
public void generateRequest_withNumericKey() {

0 commit comments

Comments
 (0)