From b99833df75840b4a8eb995fae3af560c287e6978 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 30 Oct 2014 11:35:51 +0100 Subject: [PATCH] DATAMONGO-1080 - AbstractMongoQuery now refrains from eagerly post-processing the query execution results. To properly support general post processing of query execution results (in QueryExecutorMethodInterceptor) we need to remove the eager post-processing of query execution results in AbstractMongoQuery. Removed the usage of the local ConversionService all together. --- .../repository/query/AbstractMongoQuery.java | 28 +++++-------------- .../query/AbstractMongoQueryUnitTests.java | 19 +++++++++++++ 2 files changed, 26 insertions(+), 21 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 a5633899d..f1c434372 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 @@ -87,39 +87,25 @@ public abstract class AbstractMongoQuery implements RepositoryQuery { applyQueryMetaAttributesWhenPresent(query); - Object result = null; - if (isDeleteQuery()) { - result = new DeleteExecution().execute(query); + return new DeleteExecution().execute(query); } else if (method.isGeoNearQuery() && method.isPageQuery()) { MongoParameterAccessor countAccessor = new MongoParametersParameterAccessor(method, parameters); Query countQuery = createCountQuery(new ConvertingParameterAccessor(operations.getConverter(), countAccessor)); - result = new GeoNearExecution(accessor).execute(query, countQuery); + return new GeoNearExecution(accessor).execute(query, countQuery); } else if (method.isGeoNearQuery()) { - result = new GeoNearExecution(accessor).execute(query); + return new GeoNearExecution(accessor).execute(query); } else if (method.isSliceQuery()) { - result = new SlicedExecution(accessor.getPageable()).execute(query); + return new SlicedExecution(accessor.getPageable()).execute(query); } else if (method.isCollectionQuery()) { - result = new CollectionExecution(accessor.getPageable()).execute(query); + return new CollectionExecution(accessor.getPageable()).execute(query); } else if (method.isPageQuery()) { - result = new PagedExecution(accessor.getPageable()).execute(query); + return new PagedExecution(accessor.getPageable()).execute(query); } else { - result = new SingleEntityExecution(isCountQuery()).execute(query); + return new SingleEntityExecution(isCountQuery()).execute(query); } - - if (result == null) { - return result; - } - - Class expectedReturnType = method.getReturnType().getType(); - - if (expectedReturnType.isAssignableFrom(result.getClass())) { - return result; - } - - return CONVERSION_SERVICE.convert(result, expectedReturnType); } private Query applyQueryMetaAttributesWhenPresent(Query query) { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/AbstractMongoQueryUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/AbstractMongoQueryUnitTests.java index 9ffd7efb9..e721d3ea1 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/AbstractMongoQueryUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/AbstractMongoQueryUnitTests.java @@ -17,12 +17,14 @@ package org.springframework.data.mongodb.repository.query; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; +import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Date; import java.util.List; +import java.util.Optional; import org.bson.types.ObjectId; import org.hamcrest.core.Is; @@ -32,6 +34,7 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Matchers; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -282,6 +285,21 @@ public class AbstractMongoQueryUnitTests { assertThat(captor.getAllValues().get(1).getSortObject(), is(expectedSortObject)); } + /** + * @see DATAMONGO-1080 + */ + @Test + public void doesNotTryToPostProcessQueryResultIntoWrapperType() { + + Person reference = new Person(); + when(mongoOperationsMock.findOne(Mockito.any(Query.class), eq(Person.class), eq("persons"))).// + thenReturn(reference); + + AbstractMongoQuery query = createQueryForMethod("findByLastname", String.class); + + assertThat(query.execute(new Object[] { "lastname" }), is((Object) reference)); + } + private MongoQueryFake createQueryForMethod(String methodName, Class... paramTypes) { try { @@ -346,5 +364,6 @@ public class AbstractMongoQueryUnitTests { /** @see DATAMONGO-1057 */ Slice findByLastname(String lastname, Pageable page); + Optional findByLastname(String lastname); } }