From 5b706740698770add54bef00181175c2f2975f1e Mon Sep 17 00:00:00 2001 From: derjust Date: Wed, 8 Jul 2015 10:48:57 -0400 Subject: [PATCH] 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` as used by `org.socialsignin.spring.data.dynamodb.core.DynamoDBTemplate.query(Class, QueryRequest)` --- .../query/AbstractDynamoDBQueryCriteria.java | 15 +++++++++++++++ .../repository/query/DynamoDBQueryCreator.java | 10 +++++++++- .../repository/query/DynamoDBQueryCriteria.java | 3 +++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/AbstractDynamoDBQueryCriteria.java b/src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/AbstractDynamoDBQueryCriteria.java index 2833f447..4032d58c 100644 --- a/src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/AbstractDynamoDBQueryCriteria.java +++ b/src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/AbstractDynamoDBQueryCriteria.java @@ -30,6 +30,7 @@ import org.socialsignin.spring.data.dynamodb.mapping.DefaultDynamoDBDateMarshaller; import org.socialsignin.spring.data.dynamodb.query.Query; import org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBEntityInformation; +import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.data.domain.Sort.Order; @@ -63,6 +64,7 @@ public abstract class AbstractDynamoDBQueryCriteria protected Object hashKeyPropertyValue; protected String globalSecondaryIndexName; protected Sort sort; + protected Pageable pageable; public abstract boolean isApplicableForLoad(); @@ -111,9 +113,16 @@ protected QueryRequest buildQueryRequest(String tableName, String theIndexName, queryRequest.setSelect(Select.ALL_PROJECTED_ATTRIBUTES); applySortIfSpecified(queryRequest, new ArrayList(new HashSet(allowedSortProperties))); } + applyPageableIfSpecified(queryRequest); return queryRequest; } + private void applyPageableIfSpecified(QueryRequest queryRequest) { + if (pageable != null) { + queryRequest.setLimit(pageable.getPageSize()); + } + } + protected void applySortIfSpecified(DynamoDBQueryExpression queryExpression, List permittedPropertyNames) { if (permittedPropertyNames.size() > 1) { throw new UnsupportedOperationException("Can only sort by at most a single range or index range key"); @@ -631,4 +640,10 @@ public DynamoDBQueryCriteria withSort(Sort sort) { return this; } + @Override + public DynamoDBQueryCriteria withPageable(Pageable pageable) { + this.pageable = pageable; + return this; + } + } diff --git a/src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/DynamoDBQueryCreator.java b/src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/DynamoDBQueryCreator.java index 223f4581..a6efc18f 100644 --- a/src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/DynamoDBQueryCreator.java +++ b/src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/DynamoDBQueryCreator.java @@ -5,16 +5,20 @@ import org.socialsignin.spring.data.dynamodb.core.DynamoDBOperations; import org.socialsignin.spring.data.dynamodb.query.Query; import org.socialsignin.spring.data.dynamodb.repository.support.DynamoDBEntityInformation; +import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.repository.query.ParameterAccessor; import org.springframework.data.repository.query.parser.PartTree; public class DynamoDBQueryCreator extends AbstractDynamoDBQueryCreator { + private final Pageable pageable; + public DynamoDBQueryCreator(PartTree tree, DynamoDBEntityInformation entityMetadata, DynamoDBOperations dynamoDBOperations) { super(tree, entityMetadata, dynamoDBOperations); + pageable = null; } public DynamoDBQueryCreator(PartTree tree, @@ -22,13 +26,17 @@ public DynamoDBQueryCreator(PartTree tree, DynamoDBEntityInformation entityMetadata, DynamoDBOperations dynamoDBOperations) { super(tree, parameterAccessor, entityMetadata, dynamoDBOperations); + pageable = parameterAccessor.getPageable(); } - + @Override protected Query complete(DynamoDBQueryCriteria criteria, Sort sort) { if (sort != null) { criteria.withSort(sort); } + if (pageable != null) { + criteria.withPageable(pageable); + } return criteria.buildQuery(dynamoDBOperations); diff --git a/src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/DynamoDBQueryCriteria.java b/src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/DynamoDBQueryCriteria.java index bc780476..a335cc01 100644 --- a/src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/DynamoDBQueryCriteria.java +++ b/src/main/java/org/socialsignin/spring/data/dynamodb/repository/query/DynamoDBQueryCriteria.java @@ -19,6 +19,7 @@ import org.socialsignin.spring.data.dynamodb.core.DynamoDBOperations; import org.socialsignin.spring.data.dynamodb.query.Query; +import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import com.amazonaws.services.dynamodbv2.model.ComparisonOperator; @@ -41,6 +42,8 @@ public DynamoDBQueryCriteria withSingleValueCriteria(String propertyName, public DynamoDBQueryCriteria withSort(Sort sort); + public DynamoDBQueryCriteria withPageable(Pageable pageable); + public Query buildQuery(DynamoDBOperations dynamoDBOperations); public Query buildCountQuery(DynamoDBOperations dynamoDBOperations,boolean pageQuery);