From ef1366592ac1ffd255e96449edd8da6b820c02dd Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 12 Jun 2014 09:29:18 +0200 Subject: [PATCH] DATAMONGO-948 - Sort should be taken as is when no type information available. Object type mapping for sort is skipped in the case no type information is present when executing query using mongo template. --- .../data/mongodb/core/MongoTemplate.java | 3 ++- .../mongodb/core/MongoTemplateUnitTests.java | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index 3bc8e75d3..f2c690afe 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -2179,7 +2179,8 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { cursorToUse = cursorToUse.limit(query.getLimit()); } if (query.getSortObject() != null) { - cursorToUse = cursorToUse.sort(getMappedSortObject(query, type)); + DBObject sortDbo = type != null ? getMappedSortObject(query, type) : query.getSortObject(); + cursorToUse = cursorToUse.sort(sortDbo); } if (StringUtils.hasText(query.getHint())) { cursorToUse = cursorToUse.hint(query.getHint()); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java index f1024adc0..e31589ecd 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java @@ -42,6 +42,7 @@ import org.springframework.dao.DataAccessException; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Version; +import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.MongoDbFactory; import org.springframework.data.mongodb.core.convert.CustomConversions; import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; @@ -50,11 +51,13 @@ import org.springframework.data.mongodb.core.convert.QueryMapper; import org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.core.query.BasicQuery; +import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.test.util.ReflectionTestUtils; import com.mongodb.BasicDBObject; +import com.mongodb.BasicDBObjectBuilder; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; @@ -329,6 +332,26 @@ public class MongoTemplateUnitTests extends MongoOperationsUnitTests { verify(collection, never()).remove(Mockito.any(DBObject.class)); } + /** + * @see DATAMONGO-948 + */ + @Test + public void sortShouldBeTakenAsIsWhenExecutingQueryWithoutSpecificTypeInformation() { + + Query query = Query.query(Criteria.where("foo").is("bar")).with(new Sort("foo")); + template.executeQuery(query, "collection1", new DocumentCallbackHandler() { + + @Override + public void processDocument(DBObject dbObject) throws MongoException, DataAccessException { + // nothing to do - just a test + } + }); + + ArgumentCaptor captor = ArgumentCaptor.forClass(DBObject.class); + verify(cursor, times(1)).sort(captor.capture()); + assertThat(captor.getValue(), equalTo(new BasicDBObjectBuilder().add("foo", 1).get())); + } + class AutogenerateableId { @Id BigInteger id;