Skip to content

Commit a14956b

Browse files
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 500b5fa commit a14956b

File tree

3 files changed

+27
-2
lines changed

3 files changed

+27
-2
lines changed

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

+15
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.socialsignin.spring.data.dynamodb.marshaller.Instant2IsoDynamoDBMarshaller;
3030
import org.socialsignin.spring.data.dynamodb.query.Query;
3131
import org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBEntityInformation;
32+
import org.springframework.data.domain.Pageable;
3233
import org.springframework.data.domain.Sort;
3334
import org.springframework.data.domain.Sort.Direction;
3435
import org.springframework.data.domain.Sort.Order;
@@ -66,6 +67,7 @@ public abstract class AbstractDynamoDBQueryCriteria<T, ID> implements DynamoDBQu
6667
protected Object hashKeyPropertyValue;
6768
protected String globalSecondaryIndexName;
6869
protected Sort sort;
70+
protected Pageable pageable;
6971

7072
public abstract boolean isApplicableForLoad();
7173

@@ -132,9 +134,16 @@ protected QueryRequest buildQueryRequest(String tableName, String theIndexName,
132134
queryRequest.setSelect(Select.ALL_PROJECTED_ATTRIBUTES);
133135
applySortIfSpecified(queryRequest, new ArrayList<String>(new HashSet<String>(allowedSortProperties)));
134136
}
137+
applyPageableIfSpecified(queryRequest);
135138
return queryRequest;
136139
}
137140

141+
private void applyPageableIfSpecified(QueryRequest queryRequest) {
142+
if (pageable != Pageable.unpaged()) {
143+
queryRequest.setLimit(pageable.getPageSize());
144+
}
145+
}
146+
138147
protected void applySortIfSpecified(DynamoDBQueryExpression<T> queryExpression, List<String> permittedPropertyNames) {
139148
if (permittedPropertyNames.size() > 1) {
140149
throw new UnsupportedOperationException("Can only sort by at most a single range or index range key");
@@ -688,4 +697,10 @@ public DynamoDBQueryCriteria<T, ID> withSort(Sort sort) {
688697
return this;
689698
}
690699

700+
@Override
701+
public DynamoDBQueryCriteria<T, ID> withPageable(Pageable pageable) {
702+
this.pageable = pageable;
703+
return this;
704+
}
705+
691706
}

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

+8-1
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,38 @@
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.repository.support.DynamoDBEntityInformation;
21+
import org.springframework.data.domain.Pageable;
2122
import org.springframework.data.domain.Sort;
2223
import org.springframework.data.repository.query.ParameterAccessor;
2324
import org.springframework.data.repository.query.parser.PartTree;
2425

2526
public class DynamoDBQueryCreator<T,ID> extends AbstractDynamoDBQueryCreator<T, ID,T> {
2627

28+
private final Pageable pageable;
29+
2730
public DynamoDBQueryCreator(PartTree tree,
2831
DynamoDBEntityInformation<T, ID> entityMetadata,
2932
DynamoDBOperations dynamoDBOperations) {
3033
super(tree, entityMetadata, dynamoDBOperations);
34+
pageable = Pageable.unpaged();
3135
}
3236

3337
public DynamoDBQueryCreator(PartTree tree,
3438
ParameterAccessor parameterAccessor,
3539
DynamoDBEntityInformation<T, ID> entityMetadata,
3640
DynamoDBOperations dynamoDBOperations) {
3741
super(tree, parameterAccessor, entityMetadata, dynamoDBOperations);
42+
pageable = parameterAccessor.getPageable();
3843
}
39-
44+
4045
@Override
4146
protected Query<T> complete(DynamoDBQueryCriteria<T, ID> criteria, Sort sort) {
4247
if (sort != null) {
4348
criteria.withSort(sort);
4449
}
4550

51+
criteria.withPageable(pageable);
52+
4653
return criteria.buildQuery(dynamoDBOperations);
4754

4855
}

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

+4-1
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.springframework.data.domain.Pageable;
2122
import org.springframework.data.domain.Sort;
2223

2324
/**
@@ -37,7 +38,9 @@ DynamoDBQueryCriteria<T, ID> withSingleValueCriteria(String propertyName, Compar
3738
DynamoDBQueryCriteria<T, ID> withPropertyBetween(String segment, Object value1, Object value2, Class<?> type);
3839

3940
DynamoDBQueryCriteria<T, ID> withSort(Sort sort);
40-
41+
42+
DynamoDBQueryCriteria<T, ID> withPageable(Pageable pageable);
43+
4144
Query<T> buildQuery(DynamoDBOperations dynamoDBOperations);
4245

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

0 commit comments

Comments
 (0)