Skip to content

Commit 164de98

Browse files
committed
Read Consistency Setting
1 parent 4d6371e commit 164de98

File tree

11 files changed

+60
-10
lines changed

11 files changed

+60
-10
lines changed

src/main/java/org/socialsignin/spring/data/dynamodb/repository/Query.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import java.lang.annotation.Retention;
2121
import java.lang.annotation.RetentionPolicy;
2222
import java.lang.annotation.Target;
23-
23+
import org.socialsignin.spring.data.dynamodb.repository.QueryConstants.ConsistentReadMode;
2424
import static org.socialsignin.spring.data.dynamodb.repository.QueryConstants.QUERY_LIMIT_UNLIMITED;
2525

2626
@Retention(RetentionPolicy.RUNTIME)
@@ -47,4 +47,7 @@
4747
* Expressions</a>
4848
*/
4949
int limit() default QUERY_LIMIT_UNLIMITED;
50+
51+
52+
ConsistentReadMode consistentReads() default ConsistentReadMode.DEFAULT;
5053
}

src/main/java/org/socialsignin/spring/data/dynamodb/repository/QueryConstants.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,16 @@
1515
*/
1616
package org.socialsignin.spring.data.dynamodb.repository;
1717

18-
public final class QueryConstants {
18+
public class QueryConstants {
1919

2020
private QueryConstants() {
2121
}
2222

2323
public static final int QUERY_LIMIT_UNLIMITED = Integer.MIN_VALUE;
2424

25+
public enum ConsistentReadMode {
26+
DEFAULT,
27+
CONSISTENT,
28+
EVENTUAL
29+
}
2530
}

src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/AbstractDynamoDBQueryCreator.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.amazonaws.services.dynamodbv2.model.ComparisonOperator;
2020
import org.socialsignin.spring.data.dynamodb.core.DynamoDBOperations;
2121
import org.socialsignin.spring.data.dynamodb.query.Query;
22+
import org.socialsignin.spring.data.dynamodb.repository.QueryConstants;
2223
import org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBEntityInformation;
2324
import org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBIdIsHashAndRangeKeyEntityInformation;
2425
import org.springframework.data.mapping.PropertyPath;
@@ -47,23 +48,26 @@ public abstract class AbstractDynamoDBQueryCreator<T, ID, R>
4748
protected final DynamoDBOperations dynamoDBOperations;
4849
protected final Optional<String> projection;
4950
protected final Optional<Integer> limit;
51+
protected final QueryConstants.ConsistentReadMode consistentReads;
5052

5153
public AbstractDynamoDBQueryCreator(PartTree tree, DynamoDBEntityInformation<T, ID> entityMetadata,
52-
Optional<String> projection, Optional<Integer> limitResults, DynamoDBOperations dynamoDBOperations) {
54+
Optional<String> projection, Optional<Integer> limitResults, QueryConstants.ConsistentReadMode consistentReads, DynamoDBOperations dynamoDBOperations) {
5355
super(tree);
5456
this.entityMetadata = entityMetadata;
5557
this.projection = projection;
5658
this.limit = limitResults;
59+
this.consistentReads = consistentReads;
5760
this.dynamoDBOperations = dynamoDBOperations;
5861
}
5962

6063
public AbstractDynamoDBQueryCreator(PartTree tree, ParameterAccessor parameterAccessor,
61-
DynamoDBEntityInformation<T, ID> entityMetadata, Optional<String> projection,
62-
Optional<Integer> limitResults, DynamoDBOperations dynamoDBOperations) {
64+
DynamoDBEntityInformation<T, ID> entityMetadata, Optional<String> projection,
65+
Optional<Integer> limitResults, QueryConstants.ConsistentReadMode consistentReads, DynamoDBOperations dynamoDBOperations) {
6366
super(tree, parameterAccessor);
6467
this.entityMetadata = entityMetadata;
6568
this.projection = projection;
6669
this.limit = limitResults;
70+
this.consistentReads = consistentReads;
6771
this.dynamoDBOperations = dynamoDBOperations;
6872
}
6973

src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/AbstractDynamoDBQueryCriteria.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.socialsignin.spring.data.dynamodb.marshaller.Date2IsoDynamoDBMarshaller;
3030
import org.socialsignin.spring.data.dynamodb.marshaller.Instant2IsoDynamoDBMarshaller;
3131
import org.socialsignin.spring.data.dynamodb.query.Query;
32+
import org.socialsignin.spring.data.dynamodb.repository.QueryConstants;
3233
import org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBEntityInformation;
3334
import org.socialsignin.spring.data.dynamodb.utils.SortHandler;
3435
import org.springframework.data.domain.Sort;
@@ -73,6 +74,7 @@ public abstract class AbstractDynamoDBQueryCriteria<T, ID> implements DynamoDBQu
7374
protected Sort sort = Sort.unsorted();
7475
protected Optional<String> projection = Optional.empty();
7576
protected Optional<Integer> limit = Optional.empty();
77+
protected QueryConstants.ConsistentReadMode consistentReads = QueryConstants.ConsistentReadMode.DEFAULT;
7678

7779
public abstract boolean isApplicableForLoad();
7880

@@ -134,6 +136,17 @@ protected QueryRequest buildQueryRequest(String tableName, String theIndexName,
134136
}
135137

136138
limit.ifPresent(queryRequest::setLimit);
139+
140+
switch (consistentReads) {
141+
case CONSISTENT:
142+
queryRequest.setConsistentRead(true);
143+
break;
144+
case EVENTUAL:
145+
queryRequest.setConsistentRead(false);
146+
break;
147+
default:
148+
break;
149+
}
137150
applySortIfSpecified(queryRequest, new ArrayList<>(new HashSet<>(allowedSortProperties)));
138151
}
139152
return queryRequest;
@@ -703,4 +716,10 @@ public DynamoDBQueryCriteria<T, ID> withLimit(Optional<Integer> limit) {
703716
this.limit = limit;
704717
return this;
705718
}
719+
720+
@Override
721+
public DynamoDBQueryCriteria<T, ID> withConsistentReads(QueryConstants.ConsistentReadMode consistentReads) {
722+
this.consistentReads = consistentReads;
723+
return this;
724+
}
706725
}

src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/DynamoDBCountQueryCreator.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.socialsignin.spring.data.dynamodb.core.DynamoDBOperations;
1919
import org.socialsignin.spring.data.dynamodb.query.Query;
2020
import org.socialsignin.spring.data.dynamodb.query.StaticQuery;
21+
import org.socialsignin.spring.data.dynamodb.repository.QueryConstants;
2122
import org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBEntityInformation;
2223
import org.springframework.data.domain.Sort;
2324
import org.springframework.data.repository.query.ParameterAccessor;
@@ -32,13 +33,13 @@ public class DynamoDBCountQueryCreator<T, ID> extends AbstractDynamoDBQueryCreat
3233

3334
public DynamoDBCountQueryCreator(PartTree tree, DynamoDBEntityInformation<T, ID> entityMetadata,
3435
DynamoDBOperations dynamoDBOperations, boolean pageQuery) {
35-
super(tree, entityMetadata, Optional.empty(), Optional.empty(), dynamoDBOperations);
36+
super(tree, entityMetadata, Optional.empty(), Optional.empty(), QueryConstants.ConsistentReadMode.DEFAULT, dynamoDBOperations);
3637
this.pageQuery = pageQuery;
3738
}
3839

3940
public DynamoDBCountQueryCreator(PartTree tree, ParameterAccessor parameterAccessor,
4041
DynamoDBEntityInformation<T, ID> entityMetadata, DynamoDBOperations dynamoDBOperations, boolean pageQuery) {
41-
super(tree, parameterAccessor, entityMetadata, Optional.empty(), Optional.empty(), dynamoDBOperations);
42+
super(tree, parameterAccessor, entityMetadata, Optional.empty(), Optional.empty(), QueryConstants.ConsistentReadMode.DEFAULT, dynamoDBOperations);
4243
this.pageQuery = pageQuery;
4344

4445
}

src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/DynamoDBQueryCreator.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.socialsignin.spring.data.dynamodb.core.DynamoDBOperations;
1919
import org.socialsignin.spring.data.dynamodb.query.Query;
2020
import org.socialsignin.spring.data.dynamodb.query.StaticQuery;
21+
import org.socialsignin.spring.data.dynamodb.repository.QueryConstants;
2122
import org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBEntityInformation;
2223
import org.springframework.data.domain.Sort;
2324
import org.springframework.data.repository.query.ParameterAccessor;
@@ -29,9 +30,9 @@
2930
public class DynamoDBQueryCreator<T, ID> extends AbstractDynamoDBQueryCreator<T, ID, T> {
3031

3132
public DynamoDBQueryCreator(PartTree tree, ParameterAccessor parameterAccessor,
32-
DynamoDBEntityInformation<T, ID> entityMetadata, Optional<String> projection, Optional<Integer> limit,
33+
DynamoDBEntityInformation<T, ID> entityMetadata, Optional<String> projection, Optional<Integer> limit, QueryConstants.ConsistentReadMode consistentReads,
3334
DynamoDBOperations dynamoDBOperations) {
34-
super(tree, parameterAccessor, entityMetadata, projection, limit, dynamoDBOperations);
35+
super(tree, parameterAccessor, entityMetadata, projection, limit, consistentReads, dynamoDBOperations);
3536
}
3637

3738
@Override
@@ -42,6 +43,7 @@ protected Query<T> complete(@Nullable DynamoDBQueryCriteria<T, ID> criteria, Sor
4243
criteria.withSort(sort);
4344
criteria.withProjection(projection);
4445
criteria.withLimit(limit);
46+
criteria.withConsistentReads(consistentReads);
4547
return criteria.buildQuery(dynamoDBOperations);
4648
}
4749
}

src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/DynamoDBQueryCriteria.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.amazonaws.services.dynamodbv2.model.ComparisonOperator;
1919
import org.socialsignin.spring.data.dynamodb.core.DynamoDBOperations;
2020
import org.socialsignin.spring.data.dynamodb.query.Query;
21+
import org.socialsignin.spring.data.dynamodb.repository.QueryConstants;
2122
import org.springframework.data.domain.Sort;
2223

2324
import java.util.Optional;
@@ -45,6 +46,8 @@ DynamoDBQueryCriteria<T, ID> withSingleValueCriteria(String propertyName, Compar
4546

4647
DynamoDBQueryCriteria<T, ID> withLimit(Optional<Integer> limit);
4748

49+
DynamoDBQueryCriteria<T, ID> withConsistentReads(QueryConstants.ConsistentReadMode reads);
50+
4851
Query<T> buildQuery(DynamoDBOperations dynamoDBOperations);
4952

5053
Query<Long> buildCountQuery(DynamoDBOperations dynamoDBOperations, boolean pageQuery);

src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/DynamoDBQueryMethod.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.socialsignin.spring.data.dynamodb.repository.EnableScan;
1919
import org.socialsignin.spring.data.dynamodb.repository.EnableScanCount;
2020
import org.socialsignin.spring.data.dynamodb.repository.Query;
21+
import org.socialsignin.spring.data.dynamodb.repository.QueryConstants;
2122
import org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBEntityInformation;
2223
import org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBEntityMetadataSupport;
2324
import org.springframework.data.projection.ProjectionFactory;
@@ -41,6 +42,7 @@ public class DynamoDBQueryMethod<T, ID> extends QueryMethod {
4142
private final boolean scanCountEnabledForRepository;
4243
private final Optional<String> projectionExpression;
4344
private final Optional<Integer> limitResults;
45+
private QueryConstants.ConsistentReadMode consistentReadMode;
4446

4547
public DynamoDBQueryMethod(Method method, RepositoryMetadata metadata, ProjectionFactory factory) {
4648
super(method, metadata, factory);
@@ -63,9 +65,11 @@ public DynamoDBQueryMethod(Method method, RepositoryMetadata metadata, Projectio
6365
} else {
6466
this.limitResults = Optional.empty();
6567
}
68+
this.consistentReadMode = query.consistentReads();
6669
} else {
6770
this.projectionExpression = Optional.empty();
6871
this.limitResults = Optional.empty();
72+
this.consistentReadMode = QueryConstants.ConsistentReadMode.DEFAULT;
6973
}
7074
}
7175

@@ -111,4 +115,8 @@ public Optional<String> getProjectionExpression() {
111115
public Optional<Integer> getLimitResults() {
112116
return this.limitResults;
113117
}
118+
119+
public QueryConstants.ConsistentReadMode getConsistentReadMode() {
120+
return this.consistentReadMode;
121+
}
114122
}

src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/PartTreeDynamoDBQuery.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public PartTreeDynamoDBQuery(DynamoDBOperations dynamoDBOperations, DynamoDBQuer
3939

4040
protected DynamoDBQueryCreator<T, ID> createQueryCreator(ParametersParameterAccessor accessor) {
4141
return new DynamoDBQueryCreator<>(tree, accessor, getQueryMethod().getEntityInformation(),
42-
getQueryMethod().getProjectionExpression(), getQueryMethod().getLimitResults(), dynamoDBOperations);
42+
getQueryMethod().getProjectionExpression(), getQueryMethod().getLimitResults(), getQueryMethod().getConsistentReadMode(), dynamoDBOperations);
4343
}
4444

4545
protected DynamoDBCountQueryCreator<T, ID> createCountQueryCreator(ParametersParameterAccessor accessor,

src/test/java/org/socialsignin/spring/data/dynamodb/domain/sample/UserRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import org.socialsignin.spring.data.dynamodb.repository.EnableScan;
1919
import org.socialsignin.spring.data.dynamodb.repository.Query;
20+
import org.socialsignin.spring.data.dynamodb.repository.QueryConstants;
2021
import org.springframework.data.repository.CrudRepository;
2122

2223
import java.time.Instant;
@@ -31,6 +32,7 @@ public interface UserRepository extends CrudRepository<User, String> {
3132
Iterable<User> findAll();
3233

3334
// CRUD method using Optional
35+
@Query(consistentReads = QueryConstants.ConsistentReadMode.CONSISTENT)
3436
Optional<User> findById(String id);
3537

3638
@EnableScan

src/test/java/org/socialsignin/spring/data/dynamodb/repository/query/PartTreeDynamoDBQueryUnitTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.socialsignin.spring.data.dynamodb.domain.sample.Playlist;
3636
import org.socialsignin.spring.data.dynamodb.domain.sample.PlaylistId;
3737
import org.socialsignin.spring.data.dynamodb.domain.sample.User;
38+
import org.socialsignin.spring.data.dynamodb.repository.QueryConstants;
3839
import org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBEntityInformation;
3940
import org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBIdIsHashAndRangeKeyEntityInformation;
4041
import org.springframework.data.repository.query.Parameter;
@@ -115,6 +116,7 @@ public void setUp() {
115116
Mockito.when(mockPlaylistEntityMetadata.getIndexRangeKeyPropertyNames()).thenReturn(new HashSet<String>());
116117
Mockito.when(mockDynamoDBUserQueryMethod.getEntityInformation()).thenReturn(mockUserEntityMetadata);
117118
Mockito.when(mockDynamoDBUserQueryMethod.getParameters()).thenReturn(mockParameters);
119+
Mockito.when(mockDynamoDBUserQueryMethod.getConsistentReadMode()).thenReturn(QueryConstants.ConsistentReadMode.DEFAULT);
118120
Mockito.when(mockDynamoDBPlaylistQueryMethod.getEntityInformation()).thenReturn(mockPlaylistEntityMetadata);
119121
Mockito.when(mockDynamoDBPlaylistQueryMethod.getParameters()).thenReturn(mockParameters);
120122
Mockito.when(mockUserEntityMetadata.getHashKeyPropertyName()).thenReturn("id");
@@ -142,6 +144,7 @@ private <T, ID extends Serializable> void setupCommonMocksForThisRepositoryMetho
142144
Mockito.when(mockDynamoDBQueryMethod.getEntityType()).thenReturn(clazz);
143145
Mockito.when(mockDynamoDBQueryMethod.getName()).thenReturn(repositoryMethodName);
144146
Mockito.when(mockDynamoDBQueryMethod.getParameters()).thenReturn(mockParameters);
147+
Mockito.when(mockDynamoDBQueryMethod.getConsistentReadMode()).thenReturn(QueryConstants.ConsistentReadMode.DEFAULT);
145148
Mockito.when(mockParameters.getBindableParameters()).thenReturn(mockParameters);
146149
Mockito.when(mockParameters.getNumberOfParameters()).thenReturn(numberOfParameters);
147150
// Mockito.when(mockDynamoDBQueryMethod.getReturnedObjectType()).thenReturn(clazz);

0 commit comments

Comments
 (0)