From 7cdd2d4e11fe4cf5309da1ed5860136722553038 Mon Sep 17 00:00:00 2001 From: Thomas Darimont Date: Tue, 4 Nov 2014 14:51:54 +0100 Subject: [PATCH 1/2] DATAMONGO-1085 - Sort can not use the metamodel classes generated by QueryDSL. Prepare issue branch. --- pom.xml | 2 +- spring-data-mongodb-cross-store/pom.xml | 4 ++-- spring-data-mongodb-distribution/pom.xml | 2 +- spring-data-mongodb-log4j/pom.xml | 2 +- spring-data-mongodb/pom.xml | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) 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 From b986a4bc13a83e74592eed18224be6b16f1f62f7 Mon Sep 17 00:00:00 2001 From: Thomas Darimont Date: Tue, 4 Nov 2014 15:21:21 +0100 Subject: [PATCH 2/2] DATAMONGO-1085 - Fixed sorting with querydsl in QueryDslMongoRepository. We now translate QSort's OrderSpecifiers into appropriate sort criteria. Previously the OrderSpecificers were not correctly translated to appropriate property path expressions. Added support for findAll(Pageable) and findAll(Sort) to QueryDslMongoRepository. Avoid multiple creations of sortObjects in MongoTemplate.getMappedSortObject(..). --- .../data/mongodb/core/MongoTemplate.java | 9 ++- .../support/QueryDslMongoRepository.java | 49 ++++++++++-- ...tractPersonRepositoryIntegrationTests.java | 76 +++++++++++++++++++ 3 files changed, 124 insertions(+), 10 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 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")); + } }