Skip to content

Commit 5b70674

Browse files
derjustSebastian Just
authored and
Sebastian Just
committed
Respect the pagination size for queries
This change respects the pagination size as provided from a Pageable object given to a findXXX method. Mostly important in conjunction with lazy list processing via ```java DynamoDBMapperConfig.Builder builder = new DynamoDBMapperConfig.Builder(); builder.setPaginationLoadingStrategy(PaginationLoadingStrategy.ITERATION_ONLY); ``` as this loads the result set of a query page-by-page. Also see the comments in `com.amazonaws.services.dynamodbv2.datamodeling.PaginatedQueryList<T>` as used by `org.socialsignin.spring.data.dynamodb.core.DynamoDBTemplate.query(Class<T>, QueryRequest)`
1 parent 7df52d3 commit 5b70674

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

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

+15
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.socialsignin.spring.data.dynamodb.mapping.DefaultDynamoDBDateMarshaller;
3131
import org.socialsignin.spring.data.dynamodb.query.Query;
3232
import org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBEntityInformation;
33+
import org.springframework.data.domain.Pageable;
3334
import org.springframework.data.domain.Sort;
3435
import org.springframework.data.domain.Sort.Direction;
3536
import org.springframework.data.domain.Sort.Order;
@@ -63,6 +64,7 @@ public abstract class AbstractDynamoDBQueryCriteria<T, ID extends Serializable>
6364
protected Object hashKeyPropertyValue;
6465
protected String globalSecondaryIndexName;
6566
protected Sort sort;
67+
protected Pageable pageable;
6668

6769
public abstract boolean isApplicableForLoad();
6870

@@ -111,9 +113,16 @@ protected QueryRequest buildQueryRequest(String tableName, String theIndexName,
111113
queryRequest.setSelect(Select.ALL_PROJECTED_ATTRIBUTES);
112114
applySortIfSpecified(queryRequest, new ArrayList<String>(new HashSet<String>(allowedSortProperties)));
113115
}
116+
applyPageableIfSpecified(queryRequest);
114117
return queryRequest;
115118
}
116119

120+
private void applyPageableIfSpecified(QueryRequest queryRequest) {
121+
if (pageable != null) {
122+
queryRequest.setLimit(pageable.getPageSize());
123+
}
124+
}
125+
117126
protected void applySortIfSpecified(DynamoDBQueryExpression<T> queryExpression, List<String> permittedPropertyNames) {
118127
if (permittedPropertyNames.size() > 1) {
119128
throw new UnsupportedOperationException("Can only sort by at most a single range or index range key");
@@ -631,4 +640,10 @@ public DynamoDBQueryCriteria<T, ID> withSort(Sort sort) {
631640
return this;
632641
}
633642

643+
@Override
644+
public DynamoDBQueryCriteria<T, ID> withPageable(Pageable pageable) {
645+
this.pageable = pageable;
646+
return this;
647+
}
648+
634649
}

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

+9-1
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,38 @@
55
import org.socialsignin.spring.data.dynamodb.core.DynamoDBOperations;
66
import org.socialsignin.spring.data.dynamodb.query.Query;
77
import org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBEntityInformation;
8+
import org.springframework.data.domain.Pageable;
89
import org.springframework.data.domain.Sort;
910
import org.springframework.data.repository.query.ParameterAccessor;
1011
import org.springframework.data.repository.query.parser.PartTree;
1112

1213
public class DynamoDBQueryCreator<T,ID extends Serializable> extends AbstractDynamoDBQueryCreator<T, ID,T> {
1314

15+
private final Pageable pageable;
16+
1417
public DynamoDBQueryCreator(PartTree tree,
1518
DynamoDBEntityInformation<T, ID> entityMetadata,
1619
DynamoDBOperations dynamoDBOperations) {
1720
super(tree, entityMetadata, dynamoDBOperations);
21+
pageable = null;
1822
}
1923

2024
public DynamoDBQueryCreator(PartTree tree,
2125
ParameterAccessor parameterAccessor,
2226
DynamoDBEntityInformation<T, ID> entityMetadata,
2327
DynamoDBOperations dynamoDBOperations) {
2428
super(tree, parameterAccessor, entityMetadata, dynamoDBOperations);
29+
pageable = parameterAccessor.getPageable();
2530
}
26-
31+
2732
@Override
2833
protected Query<T> complete(DynamoDBQueryCriteria<T, ID> criteria, Sort sort) {
2934
if (sort != null) {
3035
criteria.withSort(sort);
3136
}
37+
if (pageable != null) {
38+
criteria.withPageable(pageable);
39+
}
3240

3341
return criteria.buildQuery(dynamoDBOperations);
3442

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

+3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import org.socialsignin.spring.data.dynamodb.core.DynamoDBOperations;
2121
import org.socialsignin.spring.data.dynamodb.query.Query;
22+
import org.springframework.data.domain.Pageable;
2223
import org.springframework.data.domain.Sort;
2324

2425
import com.amazonaws.services.dynamodbv2.model.ComparisonOperator;
@@ -41,6 +42,8 @@ public DynamoDBQueryCriteria<T, ID> withSingleValueCriteria(String propertyName,
4142

4243
public DynamoDBQueryCriteria<T, ID> withSort(Sort sort);
4344

45+
public DynamoDBQueryCriteria<T, ID> withPageable(Pageable pageable);
46+
4447
public Query<T> buildQuery(DynamoDBOperations dynamoDBOperations);
4548

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

0 commit comments

Comments
 (0)