From ccf006e41b4e8d18695f39ef77ddf92f734d030d Mon Sep 17 00:00:00 2001 From: Maciej Walkowiak Date: Wed, 9 May 2012 16:59:42 +0200 Subject: [PATCH] DATAMONGO-446 - Fixed bug in paging query methods returning Lists Using List as return type for paginating methods didn't work for query methods currently. Fixed by inspecting the Pageable parameter potentially handed into them and restricting the result set accordingly. --- .../repository/query/AbstractMongoQuery.java | 15 +++++++++++++-- .../AbstractPersonRepositoryIntegrationTests.java | 10 ++++++++++ .../data/mongodb/repository/PersonRepository.java | 4 +++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java index ce7406cc2..a51f9a0c1 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/AbstractMongoQuery.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2011 the original author or authors. + * Copyright 2010-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -85,7 +85,7 @@ public abstract class AbstractMongoQuery implements RepositoryQuery { } else if (method.isGeoNearQuery()) { return new GeoNearExecution(accessor).execute(query); } else if (method.isCollectionQuery()) { - return new CollectionExecution().execute(query); + return new CollectionExecution(accessor.getPageable()).execute(query); } else if (method.isPageQuery()) { return new PagedExecution(accessor.getPageable()).execute(query); } else { @@ -133,12 +133,23 @@ public abstract class AbstractMongoQuery implements RepositoryQuery { */ class CollectionExecution extends Execution { + private final Pageable pageable; + + CollectionExecution(Pageable pageable) { + this.pageable = pageable; + } + /* * (non-Javadoc) * @see org.springframework.data.mongodb.repository.query.AbstractMongoQuery.Execution#execute(org.springframework.data.mongodb.core.query.Query) */ @Override public Object execute(Query query) { + + if (pageable != null) { + query = applyPagination(query, pageable); + } + return readCollection(query); } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java index aba8c4145..97a46f6e6 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java @@ -310,6 +310,16 @@ public abstract class AbstractPersonRepositoryIntegrationTests { assertThat(females.get(0), is(alicia)); } + /** + * @see DATAMONGO-446 + */ + @Test + public void findsPeopleBySexPaginated() { + + List males = repository.findBySex(Sex.MALE, new PageRequest(0, 2)); + assertThat(males.size(), is(2)); + } + @Test public void findsPeopleByNamedQuery() { List result = repository.findByNamedQuery("Dave"); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java index 3b217f593..8c9d84f78 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2010-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -147,6 +147,8 @@ public interface PersonRepository extends MongoRepository, Query List findBySex(Sex sex); + List findBySex(Sex sex, Pageable pageable); + List findByNamedQuery(String firstname); GeoResults findByLocationNear(Point point, Distance maxDistance);