diff --git a/pom.xml b/pom.xml index 75745189ed..fc8c866013 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 1.7.0.BUILD-SNAPSHOT + 1.7.0.DATAMONGO-1085-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-cross-store/pom.xml b/spring-data-mongodb-cross-store/pom.xml index 40e8a0f253..7ec7a9cd4e 100644 --- a/spring-data-mongodb-cross-store/pom.xml +++ b/spring-data-mongodb-cross-store/pom.xml @@ -6,7 +6,7 @@ org.springframework.data spring-data-mongodb-parent - 1.7.0.BUILD-SNAPSHOT + 1.7.0.DATAMONGO-1085-SNAPSHOT ../pom.xml @@ -48,7 +48,7 @@ org.springframework.data spring-data-mongodb - 1.7.0.BUILD-SNAPSHOT + 1.7.0.DATAMONGO-1085-SNAPSHOT diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 13110137b6..2e05080c5f 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -13,7 +13,7 @@ org.springframework.data spring-data-mongodb-parent - 1.7.0.BUILD-SNAPSHOT + 1.7.0.DATAMONGO-1085-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-log4j/pom.xml b/spring-data-mongodb-log4j/pom.xml index 6ff09e4577..fa260b532d 100644 --- a/spring-data-mongodb-log4j/pom.xml +++ b/spring-data-mongodb-log4j/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 1.7.0.BUILD-SNAPSHOT + 1.7.0.DATAMONGO-1085-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index 568d347c4d..3a83791a2a 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -11,7 +11,7 @@ org.springframework.data spring-data-mongodb-parent - 1.7.0.BUILD-SNAPSHOT + 1.7.0.DATAMONGO-1085-SNAPSHOT ../pom.xml 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 d3f43b43be..4859f614dd 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 @@ -1969,11 +1969,16 @@ private static final MongoConverter getDefaultMongoConverter(MongoDbFactory fact private DBObject getMappedSortObject(Query query, Class type) { - if (query == null || query.getSortObject() == null) { + if (query == null) { + return null; + } + + DBObject sortObject = query.getSortObject(); + if (sortObject == null) { return null; } - return queryMapper.getMappedSort(query.getSortObject(), mappingContext.getPersistentEntity(type)); + return queryMapper.getMappedSort(sortObject, mappingContext.getPersistentEntity(type)); } // Callback implementations 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 35cf425eb8..fc79a79ffe 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 @@ -1,5 +1,5 @@ /* - * Copyright 2011-2012 the original author or authors. + * Copyright 2011-2014 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. @@ -27,6 +27,7 @@ import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.repository.query.MongoEntityInformation; import org.springframework.data.querydsl.EntityPathResolver; +import org.springframework.data.querydsl.QSort; import org.springframework.data.querydsl.QueryDslPredicateExecutor; import org.springframework.data.querydsl.SimpleEntityPathResolver; import org.springframework.data.repository.core.EntityInformation; @@ -44,6 +45,7 @@ * Special QueryDsl based repository implementation that allows execution {@link Predicate}s in various forms. * * @author Oliver Gierke + * @author Thomas Darimont */ public class QueryDslMongoRepository extends SimpleMongoRepository implements QueryDslPredicateExecutor { @@ -105,7 +107,6 @@ public List findAll(Predicate predicate) { * @see org.springframework.data.querydsl.QueryDslPredicateExecutor#findAll(com.mysema.query.types.Predicate, com.mysema.query.types.OrderSpecifier[]) */ public List findAll(Predicate predicate, OrderSpecifier... orders) { - return createQueryFor(predicate).orderBy(orders).list(); } @@ -115,7 +116,7 @@ public List findAll(Predicate predicate, OrderSpecifier... orders) { */ @Override public Iterable findAll(OrderSpecifier... orders) { - return createQueryFor(new Predicate[0]).orderBy(orders).list(); + return createQuery().orderBy(orders).list(); } /* @@ -130,6 +131,25 @@ public Page findAll(Predicate predicate, Pageable pageable) { return new PageImpl(applyPagination(query, pageable).list(), pageable, countQuery.count()); } + /* + * (non-Javadoc) + * @see org.springframework.data.querydsl.QueryDslPredicateExecutor#findAll(org.springframework.data.domain.Pageable) + */ + public Page findAll(Pageable pageable) { + + MongodbQuery countQuery = createQuery(); + MongodbQuery query = createQuery(); + + return new PageImpl(applyPagination(query, pageable).list(), pageable, countQuery.count()); + } + + /* (non-Javadoc) + * @see org.springframework.data.mongodb.repository.support.SimpleMongoRepository#findAll(org.springframework.data.domain.Sort) + */ + public List findAll(Sort sort) { + return applySorting(createQuery(), sort).list(); + } + /* * (non-Javadoc) * @see org.springframework.data.querydsl.QueryDslPredicateExecutor#count(com.mysema.query.types.Predicate) @@ -144,12 +164,17 @@ public long count(Predicate predicate) { * @param predicate * @return */ - private MongodbQuery createQueryFor(Predicate... predicate) { - - Class domainType = entityInformation.getJavaType(); + private MongodbQuery createQueryFor(Predicate predicate) { + return createQuery().where(predicate); + } - MongodbQuery query = new SpringDataMongodbQuery(mongoOperations, domainType); - return query.where(predicate); + /** + * Creates a {@link MongodbQuery}. + * + * @return + */ + private MongodbQuery createQuery() { + return new SpringDataMongodbQuery(mongoOperations, entityInformation.getJavaType()); } /** @@ -182,6 +207,14 @@ private MongodbQuery applySorting(MongodbQuery query, Sort sort) { return query; } + if (sort instanceof QSort) { + + List> orderSpecifiers = ((QSort) sort).getOrderSpecifiers(); + query.orderBy(orderSpecifiers.toArray(new OrderSpecifier[orderSpecifiers.size()])); + + return query; + } + for (Order order : sort) { query.orderBy(toOrder(order)); } 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 8966c9a951..2670808385 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 @@ -47,8 +47,11 @@ import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.query.BasicQuery; import org.springframework.data.mongodb.repository.Person.Sex; +import org.springframework.data.querydsl.QSort; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import com.google.common.collect.Lists; + /** * Base class for tests for {@link PersonRepository}. * @@ -1071,4 +1074,77 @@ public void returnsOrderedResultsForQuerydslOrderSpecifier() { assertThat(result, contains(alicia, boyd, carter, dave, leroi, oliver, stefan)); } + + /** + * @see DATAMONGO-1085 + */ + @Test + public void shouldSupportSortingByQueryDslOrderSpecifier() { + + repository.deleteAll(); + + List persons = new ArrayList(); + for (int i = 0; i < 3; i++) { + + Person pers = new Person(String.format("Siggi %s", i), "Bar", 30); + pers.setAddress(new Address(String.format("Street %s", i), "12345", "SinCity")); + + persons.add(pers); + } + + repository.save(persons); + + QPerson person = QPerson.person; + + List result = Lists.newArrayList(repository.findAll(person.firstname.isNotNull(), + person.address.street.desc())); + + assertThat(result, hasSize(persons.size())); + assertThat(result.get(0).getFirstname(), is(persons.get(2).getFirstname())); + } + + /** + * @see DATAMONGO-1085 + */ + @Test + public void shouldSupportSortingWithQSortByQueryDslOrderSpecifier() throws Exception { + + repository.deleteAll(); + + List persons = new ArrayList(); + for (int i = 0; i < 3; i++) { + Person pers = new Person(String.format("Siggi %s", i), "Bar", 30); + pers.setAddress(new Address(String.format("Street %s", i), "12345", "SinCity")); + persons.add(pers); + } + repository.save(persons); + + PageRequest pageRequest = new PageRequest(0, 2, new QSort(person.address.street.desc())); + List result = Lists.newArrayList(repository.findAll(pageRequest)); + + assertThat(result, hasSize(pageRequest.getPageSize())); + assertThat(result.get(0).getFirstname(), is("Siggi 2")); + } + + /** + * @see DATAMONGO-1085 + */ + @Test + public void shouldSupportSortingWithQSort() throws Exception { + + repository.deleteAll(); + + List persons = new ArrayList(); + for (int i = 0; i < 3; i++) { + Person pers = new Person(String.format("Siggi %s", i), "Bar", 30); + pers.setAddress(new Address(String.format("Street %s", i), "12345", "SinCity")); + persons.add(pers); + } + repository.save(persons); + + List result = Lists.newArrayList(repository.findAll(new QSort(person.address.street.desc()))); + + assertThat(result, hasSize(persons.size())); + assertThat(result.get(0).getFirstname(), is("Siggi 2")); + } }