@@ -73,6 +73,16 @@ public class AutoGeneratedTimestampRecordTest extends LocalDynamoDbSyncTestBase
73
73
private static final String TABLE_NAME = "table-name" ;
74
74
private static final OperationContext PRIMARY_CONTEXT =
75
75
DefaultOperationContext .create (TABLE_NAME , TableMetadata .primaryIndexName ());
76
+
77
+ private static final TableSchema <FlattenedRecord > FLATTENED_TABLE_SCHEMA =
78
+ StaticTableSchema .builder (FlattenedRecord .class )
79
+ .newItemSupplier (FlattenedRecord ::new )
80
+ .addAttribute (Instant .class , a -> a .name ("generated" )
81
+ .getter (FlattenedRecord ::getGenerated )
82
+ .setter (FlattenedRecord ::setGenerated )
83
+ .tags (autoGeneratedTimestampAttribute ()))
84
+ .build ();
85
+
76
86
private static final TableSchema <Record > TABLE_SCHEMA =
77
87
StaticTableSchema .builder (Record .class )
78
88
.newItemSupplier (Record ::new )
@@ -102,6 +112,7 @@ public class AutoGeneratedTimestampRecordTest extends LocalDynamoDbSyncTestBase
102
112
.setter (Record ::setConvertedLastUpdatedDate )
103
113
.attributeConverter (TimeFormatUpdateTestConverter .create ())
104
114
.tags (autoGeneratedTimestampAttribute ()))
115
+ .flatten (FLATTENED_TABLE_SCHEMA , Record ::getFlattenedRecord , Record ::setFlattenedRecord )
105
116
.build ();
106
117
107
118
private final List <Map <String , AttributeValue >> fakeItems =
@@ -154,12 +165,14 @@ public void putNewRecordSetsInitialAutoGeneratedTimestamp() {
154
165
mappedTable .putItem (r -> r .item (item ));
155
166
Record result = mappedTable .getItem (r -> r .key (k -> k .partitionValue ("id" )));
156
167
GetItemResponse itemAsStoredInDDB = getItemAsStoredFromDDB ();
168
+ FlattenedRecord flattenedRecord = new FlattenedRecord ().setGenerated (MOCKED_INSTANT_NOW );
157
169
Record expectedRecord = new Record ().setId ("id" )
158
170
.setAttribute ("one" )
159
171
.setLastUpdatedDate (MOCKED_INSTANT_NOW )
160
172
.setConvertedLastUpdatedDate (MOCKED_INSTANT_NOW )
161
173
.setCreatedDate (MOCKED_INSTANT_NOW )
162
- .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_NOW );
174
+ .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_NOW )
175
+ .setFlattenedRecord (flattenedRecord );
163
176
assertThat (result , is (expectedRecord ));
164
177
// The data in DDB is stored in converted time format
165
178
assertThat (itemAsStoredInDDB .item ().get ("convertedLastUpdatedDate" ).s (), is ("13 01 2019 14:00:00" ));
@@ -169,12 +182,14 @@ public void putNewRecordSetsInitialAutoGeneratedTimestamp() {
169
182
public void updateNewRecordSetsAutoFormattedDate () {
170
183
Record result = mappedTable .updateItem (r -> r .item (new Record ().setId ("id" ).setAttribute ("one" )));
171
184
GetItemResponse itemAsStoredInDDB = getItemAsStoredFromDDB ();
185
+ FlattenedRecord flattenedRecord = new FlattenedRecord ().setGenerated (MOCKED_INSTANT_NOW );
172
186
Record expectedRecord = new Record ().setId ("id" )
173
187
.setAttribute ("one" )
174
188
.setLastUpdatedDate (MOCKED_INSTANT_NOW )
175
189
.setConvertedLastUpdatedDate (MOCKED_INSTANT_NOW )
176
190
.setCreatedDate (MOCKED_INSTANT_NOW )
177
- .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_NOW );
191
+ .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_NOW )
192
+ .setFlattenedRecord (flattenedRecord );
178
193
assertThat (result , is (expectedRecord ));
179
194
// The data in DDB is stored in converted time format
180
195
assertThat (itemAsStoredInDDB .item ().get ("convertedLastUpdatedDate" ).s (), is ("13 01 2019 14:00:00" ));
@@ -185,12 +200,14 @@ public void putExistingRecordUpdatedWithAutoFormattedTimestamps() {
185
200
mappedTable .putItem (r -> r .item (new Record ().setId ("id" ).setAttribute ("one" )));
186
201
Record result = mappedTable .getItem (r -> r .key (k -> k .partitionValue ("id" )));
187
202
GetItemResponse itemAsStoredInDDB = getItemAsStoredFromDDB ();
203
+ FlattenedRecord flattenedRecord = new FlattenedRecord ().setGenerated (MOCKED_INSTANT_NOW );
188
204
Record expectedRecord = new Record ().setId ("id" )
189
205
.setAttribute ("one" )
190
206
.setLastUpdatedDate (MOCKED_INSTANT_NOW )
191
207
.setConvertedLastUpdatedDate (MOCKED_INSTANT_NOW )
192
208
.setCreatedDate (MOCKED_INSTANT_NOW )
193
- .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_NOW );
209
+ .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_NOW )
210
+ .setFlattenedRecord (flattenedRecord );
194
211
assertThat (result , is (expectedRecord ));
195
212
// The data in DDB is stored in converted time format
196
213
assertThat (itemAsStoredInDDB .item ().get ("convertedLastUpdatedDate" ).s (), is ("13 01 2019 14:00:00" ));
@@ -199,13 +216,15 @@ public void putExistingRecordUpdatedWithAutoFormattedTimestamps() {
199
216
mappedTable .putItem (r -> r .item (new Record ().setId ("id" ).setAttribute ("one" )));
200
217
result = mappedTable .getItem (r -> r .key (k -> k .partitionValue ("id" )));
201
218
itemAsStoredInDDB = getItemAsStoredFromDDB ();
219
+ flattenedRecord = new FlattenedRecord ().setGenerated (MOCKED_INSTANT_UPDATE_ONE );
202
220
expectedRecord = new Record ().setId ("id" )
203
221
.setAttribute ("one" )
204
222
.setLastUpdatedDate (MOCKED_INSTANT_UPDATE_ONE )
205
223
.setConvertedLastUpdatedDate (MOCKED_INSTANT_UPDATE_ONE )
206
224
// Note : Since we are doing PutItem second time, the createDate gets updated,
207
225
.setCreatedDate (MOCKED_INSTANT_UPDATE_ONE )
208
- .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_UPDATE_ONE );
226
+ .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_UPDATE_ONE )
227
+ .setFlattenedRecord (flattenedRecord );
209
228
210
229
System .out .println ("result " +result );
211
230
assertThat (result , is (expectedRecord ));
@@ -218,12 +237,14 @@ public void putItemFollowedByUpdates() {
218
237
mappedTable .putItem (r -> r .item (new Record ().setId ("id" ).setAttribute ("one" )));
219
238
Record result = mappedTable .getItem (r -> r .key (k -> k .partitionValue ("id" )));
220
239
GetItemResponse itemAsStoredInDDB = getItemAsStoredFromDDB ();
240
+ FlattenedRecord flattenedRecord = new FlattenedRecord ().setGenerated (MOCKED_INSTANT_NOW );
221
241
Record expectedRecord = new Record ().setId ("id" )
222
242
.setAttribute ("one" )
223
243
.setLastUpdatedDate (MOCKED_INSTANT_NOW )
224
244
.setConvertedLastUpdatedDate (MOCKED_INSTANT_NOW )
225
245
.setCreatedDate (MOCKED_INSTANT_NOW )
226
- .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_NOW );
246
+ .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_NOW )
247
+ .setFlattenedRecord (flattenedRecord );
227
248
assertThat (result , is (expectedRecord ));
228
249
// The data in DDB is stored in converted time format
229
250
assertThat (itemAsStoredInDDB .item ().get ("convertedLastUpdatedDate" ).s (), is ("13 01 2019 14:00:00" ));
@@ -233,12 +254,14 @@ public void putItemFollowedByUpdates() {
233
254
234
255
result = mappedTable .updateItem (r -> r .item (new Record ().setId ("id" ).setAttribute ("one" )));
235
256
itemAsStoredInDDB = getItemAsStoredFromDDB ();
257
+ flattenedRecord = new FlattenedRecord ().setGenerated (MOCKED_INSTANT_UPDATE_ONE );
236
258
expectedRecord = new Record ().setId ("id" )
237
259
.setAttribute ("one" )
238
260
.setLastUpdatedDate (MOCKED_INSTANT_UPDATE_ONE )
239
261
.setConvertedLastUpdatedDate (MOCKED_INSTANT_UPDATE_ONE )
240
262
.setCreatedDate (MOCKED_INSTANT_NOW )
241
- .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_UPDATE_ONE );
263
+ .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_UPDATE_ONE )
264
+ .setFlattenedRecord (flattenedRecord );
242
265
assertThat (result , is (expectedRecord ));
243
266
// The data in DDB is stored in converted time format
244
267
assertThat (itemAsStoredInDDB .item ().get ("convertedLastUpdatedDate" ).s (), is ("14 01 2019 14:00:00" ));
@@ -247,12 +270,14 @@ public void putItemFollowedByUpdates() {
247
270
Mockito .when (mockCLock .instant ()).thenReturn (MOCKED_INSTANT_UPDATE_TWO );
248
271
result = mappedTable .updateItem (r -> r .item (new Record ().setId ("id" ).setAttribute ("one" )));
249
272
itemAsStoredInDDB = getItemAsStoredFromDDB ();
273
+ flattenedRecord = new FlattenedRecord ().setGenerated (MOCKED_INSTANT_UPDATE_TWO );
250
274
expectedRecord = new Record ().setId ("id" )
251
275
.setAttribute ("one" )
252
276
.setLastUpdatedDate (MOCKED_INSTANT_UPDATE_TWO )
253
277
.setConvertedLastUpdatedDate (MOCKED_INSTANT_UPDATE_TWO )
254
278
.setCreatedDate (MOCKED_INSTANT_NOW )
255
- .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_UPDATE_TWO );
279
+ .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_UPDATE_TWO )
280
+ .setFlattenedRecord (flattenedRecord );
256
281
assertThat (result , is (expectedRecord ));
257
282
// The data in DDB is stored in converted time format
258
283
assertThat (itemAsStoredInDDB .item ().get ("convertedLastUpdatedDate" ).s (), is ("15 01 2019 14:00:00" ));
@@ -267,12 +292,14 @@ public void putExistingRecordWithConditionExpressions() {
267
292
mappedTable .putItem (r -> r .item (new Record ().setId ("id" ).setAttribute ("one" )));
268
293
Record result = mappedTable .getItem (r -> r .key (k -> k .partitionValue ("id" )));
269
294
GetItemResponse itemAsStoredInDDB = getItemAsStoredFromDDB ();
295
+ FlattenedRecord flattenedRecord = new FlattenedRecord ().setGenerated (MOCKED_INSTANT_NOW );
270
296
Record expectedRecord = new Record ().setId ("id" )
271
297
.setAttribute ("one" )
272
298
.setLastUpdatedDate (MOCKED_INSTANT_NOW )
273
299
.setConvertedLastUpdatedDate (MOCKED_INSTANT_NOW )
274
300
.setCreatedDate (MOCKED_INSTANT_NOW )
275
- .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_NOW );
301
+ .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_NOW )
302
+ .setFlattenedRecord (flattenedRecord );
276
303
assertThat (result , is (expectedRecord ));
277
304
// The data in DDB is stored in converted time format
278
305
assertThat (itemAsStoredInDDB .item ().get ("convertedLastUpdatedDate" ).s (), is ("13 01 2019 14:00:00" ));
@@ -291,13 +318,15 @@ public void putExistingRecordWithConditionExpressions() {
291
318
.build ());
292
319
293
320
result = mappedTable .getItem (r -> r .key (k -> k .partitionValue ("id" )));
321
+ flattenedRecord = new FlattenedRecord ().setGenerated (MOCKED_INSTANT_UPDATE_ONE );
294
322
expectedRecord = new Record ().setId ("id" )
295
323
.setAttribute ("one" )
296
324
.setLastUpdatedDate (MOCKED_INSTANT_UPDATE_ONE )
297
325
.setConvertedLastUpdatedDate (MOCKED_INSTANT_UPDATE_ONE )
298
326
// Note that this is a second putItem call so create date is updated.
299
327
.setCreatedDate (MOCKED_INSTANT_UPDATE_ONE )
300
- .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_UPDATE_ONE );
328
+ .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_UPDATE_ONE )
329
+ .setFlattenedRecord (flattenedRecord );
301
330
assertThat (result , is (expectedRecord ));
302
331
}
303
332
@@ -319,12 +348,14 @@ public void updateExistingRecordWithConditionExpressions() {
319
348
.conditionExpression (conditionExpression ));
320
349
321
350
Record result = mappedTable .getItem (r -> r .key (k -> k .partitionValue ("id" )));
351
+ FlattenedRecord flattenedRecord = new FlattenedRecord ().setGenerated (MOCKED_INSTANT_UPDATE_ONE );
322
352
Record expectedRecord = new Record ().setId ("id" )
323
353
.setAttribute ("one" )
324
354
.setLastUpdatedDate (MOCKED_INSTANT_UPDATE_ONE )
325
355
.setConvertedLastUpdatedDate (MOCKED_INSTANT_UPDATE_ONE )
326
356
.setCreatedDate (MOCKED_INSTANT_NOW )
327
- .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_UPDATE_ONE );
357
+ .setLastUpdatedDateInEpochMillis (MOCKED_INSTANT_UPDATE_ONE )
358
+ .setFlattenedRecord (flattenedRecord );
328
359
assertThat (result , is (expectedRecord ));
329
360
}
330
361
@@ -408,6 +439,7 @@ private static class Record {
408
439
private Instant lastUpdatedDate ;
409
440
private Instant convertedLastUpdatedDate ;
410
441
private Instant lastUpdatedDateInEpochMillis ;
442
+ private FlattenedRecord flattenedRecord ;
411
443
412
444
private String getId () {
413
445
return id ;
@@ -463,6 +495,15 @@ private Record setLastUpdatedDateInEpochMillis(Instant lastUpdatedDateInEpochMil
463
495
return this ;
464
496
}
465
497
498
+ public FlattenedRecord getFlattenedRecord () {
499
+ return flattenedRecord ;
500
+ }
501
+
502
+ public Record setFlattenedRecord (FlattenedRecord flattenedRecord ) {
503
+ this .flattenedRecord = flattenedRecord ;
504
+ return this ;
505
+ }
506
+
466
507
@ Override
467
508
public boolean equals (Object o ) {
468
509
if (this == o ) {
@@ -477,13 +518,14 @@ public boolean equals(Object o) {
477
518
Objects .equals (lastUpdatedDate , record .lastUpdatedDate ) &&
478
519
Objects .equals (createdDate , record .createdDate ) &&
479
520
Objects .equals (lastUpdatedDateInEpochMillis , record .lastUpdatedDateInEpochMillis ) &&
480
- Objects .equals (convertedLastUpdatedDate , record .convertedLastUpdatedDate );
521
+ Objects .equals (convertedLastUpdatedDate , record .convertedLastUpdatedDate ) &&
522
+ Objects .equals (flattenedRecord , record .flattenedRecord );
481
523
}
482
524
483
525
@ Override
484
526
public int hashCode () {
485
- return Objects .hash (id , attribute ,
486
- lastUpdatedDate , createdDate , lastUpdatedDateInEpochMillis , convertedLastUpdatedDate );
527
+ return Objects .hash (id , attribute , lastUpdatedDate , createdDate , lastUpdatedDateInEpochMillis ,
528
+ convertedLastUpdatedDate , flattenedRecord );
487
529
}
488
530
489
531
@ Override
@@ -495,6 +537,44 @@ public String toString() {
495
537
", lastUpdatedDate=" + lastUpdatedDate +
496
538
", convertedLastUpdatedDate=" + convertedLastUpdatedDate +
497
539
", lastUpdatedDateInEpochMillis=" + lastUpdatedDateInEpochMillis +
540
+ ", flattenedRecord=" + flattenedRecord +
541
+ '}' ;
542
+ }
543
+ }
544
+
545
+ private static class FlattenedRecord {
546
+ private Instant generated ;
547
+
548
+ public Instant getGenerated () {
549
+ return generated ;
550
+ }
551
+
552
+ public FlattenedRecord setGenerated (Instant generated ) {
553
+ this .generated = generated ;
554
+ return this ;
555
+ }
556
+
557
+ @ Override
558
+ public boolean equals (Object o ) {
559
+ if (this == o ) {
560
+ return true ;
561
+ }
562
+ if (o == null || getClass () != o .getClass ()) {
563
+ return false ;
564
+ }
565
+ FlattenedRecord that = (FlattenedRecord ) o ;
566
+ return Objects .equals (generated , that .generated );
567
+ }
568
+
569
+ @ Override
570
+ public int hashCode () {
571
+ return Objects .hash (generated );
572
+ }
573
+
574
+ @ Override
575
+ public String toString () {
576
+ return "FlattenedRecord{" +
577
+ "generated=" + generated +
498
578
'}' ;
499
579
}
500
580
}
0 commit comments