From dc67830c6f2cb4b1959d40467472073dc4c7bf6d 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 | 28 ++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) 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 ac5038dfe..c0cc6e73f 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 @@ -2095,7 +2095,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 13ed88299..565bfe09d 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; @@ -49,13 +50,16 @@ import org.springframework.data.mongodb.core.convert.MappingMongoConverter; 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.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; import com.mongodb.DBObject; import com.mongodb.Mongo; import com.mongodb.MongoException; @@ -75,6 +79,7 @@ public class MongoTemplateUnitTests extends MongoOperationsUnitTests { @Mock Mongo mongo; @Mock DB db; @Mock DBCollection collection; + @Mock DBCursor cursor; MongoExceptionTranslator exceptionTranslator = new MongoExceptionTranslator(); MappingMongoConverter converter; @@ -90,7 +95,6 @@ public class MongoTemplateUnitTests extends MongoOperationsUnitTests { this.mappingContext = new MongoMappingContext(); this.converter = new MappingMongoConverter(new DefaultDbRefResolver(factory), mappingContext); this.template = new MongoTemplate(factory, converter); - } @Test(expected = IllegalArgumentException.class) @@ -282,6 +286,28 @@ public class MongoTemplateUnitTests extends MongoOperationsUnitTests { })); } + /** + * @see DATAMONGO-948 + */ + @Test + public void sortShouldBeTakenAsIsWhenExecutingQueryWithoutSpecificTypeInformation() { + + when(db.getCollection(Mockito.any(String.class))).thenReturn(collection); + when(collection.find(Mockito.any(DBObject.class))).thenReturn(cursor); + when(cursor.sort(Mockito.any(DBObject.class))).thenReturn(cursor); + + 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) {} + }); + + 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;