From 29b4a9dcc3b176e2815de0a98961f44fbf95d79c Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 14 Feb 2018 10:55:27 +0100 Subject: [PATCH] DATAMONGO-1860 - Retrieve result count via QuerydslMongoPredicateExecutor only for paging. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We now use AbstractMongodbQuery.fetch() instead of AbstractMongodbQuery.fetchResults() to execute MongoDB queries. fetchResults() executes a find(…) and a count(…) query. Retrieving the record count is an expensive operation in MongoDB and the count is not always required. For regular find(…) method, the count is ignored, for paging the count(…) is only required in certain result/request scenarios. Original Pull Request: #529 --- .../support/QueryDslMongoRepository.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java index 3d074c64b..aa6c6ea04 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java @@ -35,6 +35,7 @@ import org.springframework.data.repository.support.PageableExecutionUtils; import org.springframework.data.repository.support.PageableExecutionUtils.TotalSupplier; import org.springframework.util.Assert; +import com.querydsl.core.QueryResults; import com.querydsl.core.types.EntityPath; import com.querydsl.core.types.Expression; import com.querydsl.core.types.OrderSpecifier; @@ -104,7 +105,7 @@ public class QueryDslMongoRepository extends SimpleM */ @Override public List findAll(Predicate predicate) { - return createQueryFor(predicate).fetchResults().getResults(); + return createQueryFor(predicate).fetch(); } /* @@ -113,7 +114,7 @@ public class QueryDslMongoRepository extends SimpleM */ @Override public List findAll(Predicate predicate, OrderSpecifier... orders) { - return createQueryFor(predicate).orderBy(orders).fetchResults().getResults(); + return createQueryFor(predicate).orderBy(orders).fetch(); } /* @@ -122,7 +123,7 @@ public class QueryDslMongoRepository extends SimpleM */ @Override public List findAll(Predicate predicate, Sort sort) { - return applySorting(createQueryFor(predicate), sort).fetchResults().getResults(); + return applySorting(createQueryFor(predicate), sort).fetch(); } /* @@ -131,7 +132,7 @@ public class QueryDslMongoRepository extends SimpleM */ @Override public Iterable findAll(OrderSpecifier... orders) { - return createQuery().orderBy(orders).fetchResults().getResults(); + return createQuery().orderBy(orders).fetch(); } /* @@ -143,11 +144,13 @@ public class QueryDslMongoRepository extends SimpleM AbstractMongodbQuery> query = createQueryFor(predicate); - return PageableExecutionUtils.getPage(applyPagination(query, pageable).fetchResults().getResults(), pageable, new TotalSupplier() { + final QueryResults results = applyPagination(query, pageable).fetchResults(); + + return PageableExecutionUtils.getPage(results.getResults(), pageable, new TotalSupplier() { @Override public long get() { - return createQueryFor(predicate).fetchCount(); + return results.getTotal(); } }); } @@ -161,11 +164,13 @@ public class QueryDslMongoRepository extends SimpleM AbstractMongodbQuery> query = createQuery(); - return PageableExecutionUtils.getPage(applyPagination(query, pageable).fetchResults().getResults(), pageable, new TotalSupplier() { + final QueryResults results = applyPagination(query, pageable).fetchResults(); + + return PageableExecutionUtils.getPage(results.getResults(), pageable, new TotalSupplier() { @Override public long get() { - return createQuery().fetchCount(); + return results.getTotal(); } }); } @@ -176,7 +181,7 @@ public class QueryDslMongoRepository extends SimpleM */ @Override public List findAll(Sort sort) { - return applySorting(createQuery(), sort).fetchResults().getResults(); + return applySorting(createQuery(), sort).fetch(); } /*