From a14956b0fc5e04a1acd52f02ed987c29cfbf2874 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 | 9 ++++++++- .../repository/query/DynamoDBQueryCriteria.java | 5 ++++- 3 files changed, 27 insertions(+), 2 deletions(-) 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 9a024886..d5e7d02a 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 @@ -29,6 +29,7 @@ import org.socialsignin.spring.data.dynamodb.marshaller.Instant2IsoDynamoDBMarshaller; 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; @@ -66,6 +67,7 @@ public abstract class AbstractDynamoDBQueryCriteria implements DynamoDBQu protected Object hashKeyPropertyValue; protected String globalSecondaryIndexName; protected Sort sort; + protected Pageable pageable; public abstract boolean isApplicableForLoad(); @@ -132,9 +134,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 != Pageable.unpaged()) { + 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"); @@ -688,4 +697,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 fc52cd4d..b99cfd17 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 @@ -18,16 +18,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 = Pageable.unpaged(); } public DynamoDBQueryCreator(PartTree tree, @@ -35,14 +39,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); } + 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 1fe0e183..587667d8 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 @@ -18,6 +18,7 @@ import com.amazonaws.services.dynamodbv2.model.ComparisonOperator; 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; /** @@ -37,7 +38,9 @@ DynamoDBQueryCriteria withSingleValueCriteria(String propertyName, Compar DynamoDBQueryCriteria withPropertyBetween(String segment, Object value1, Object value2, Class type); DynamoDBQueryCriteria withSort(Sort sort); - + + DynamoDBQueryCriteria withPageable(Pageable pageable); + Query buildQuery(DynamoDBOperations dynamoDBOperations); Query buildCountQuery(DynamoDBOperations dynamoDBOperations, boolean pageQuery);