Skip to content

Commit e71b170

Browse files
NiklasLoechteschauder
authored andcommitted
Pagination now supports sorting by property.
Closes #379 Original Pull Request #381
1 parent d267a70 commit e71b170

File tree

3 files changed

+49
-8
lines changed

3 files changed

+49
-8
lines changed

src/main/java/org/springframework/data/envers/repository/support/EnversRevisionRepositoryImpl.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.springframework.data.domain.Page;
3737
import org.springframework.data.domain.PageImpl;
3838
import org.springframework.data.domain.Pageable;
39+
import org.springframework.data.domain.Sort;
3940
import org.springframework.data.history.AnnotationRevisionMetadata;
4041
import org.springframework.data.history.Revision;
4142
import org.springframework.data.history.RevisionMetadata;
@@ -58,6 +59,7 @@
5859
* @author Julien Millau
5960
* @author Mark Paluch
6061
* @author Sander Bylemans
62+
* @author Niklas Loechte
6163
*/
6264
@Transactional(readOnly = true)
6365
public class EnversRevisionRepositoryImpl<T, ID, N extends Number & Comparable<N>>
@@ -141,18 +143,31 @@ public Revisions<N, T> findRevisions(ID id) {
141143
return Revisions.of(revisionList);
142144
}
143145

146+
147+
private AuditOrder mapRevisionSort(RevisionSort revisionSort) {
148+
return RevisionSort.getRevisionDirection(revisionSort).isDescending() //
149+
? AuditEntity.revisionNumber().desc() //
150+
: AuditEntity.revisionNumber().asc();
151+
}
152+
153+
private AuditOrder mapPropertySort(Sort sort) {
154+
return sort.stream().findFirst().map(order -> order.getDirection().isAscending() ?
155+
AuditEntity.property(order.getProperty()).asc() :
156+
AuditEntity.property(order.getProperty()).desc())
157+
.orElse(AuditEntity.revisionNumber().asc());
158+
}
159+
144160
@SuppressWarnings("unchecked")
145161
public Page<Revision<N, T>> findRevisions(ID id, Pageable pageable) {
146-
147-
AuditOrder sorting = RevisionSort.getRevisionDirection(pageable.getSort()).isDescending() //
148-
? AuditEntity.revisionNumber().desc() //
149-
: AuditEntity.revisionNumber().asc();
162+
AuditOrder orderMapped = (pageable.getSort() instanceof RevisionSort) ?
163+
mapRevisionSort((RevisionSort) pageable.getSort()) :
164+
mapPropertySort(pageable.getSort());
150165

151166
List<Object[]> resultList = createBaseQuery(id) //
152-
.addOrder(sorting) //
153-
.setFirstResult((int) pageable.getOffset()) //
154-
.setMaxResults(pageable.getPageSize()) //
155-
.getResultList();
167+
.addOrder(orderMapped) //
168+
.setFirstResult((int) pageable.getOffset()) //
169+
.setMaxResults(pageable.getPageSize()) //
170+
.getResultList();
156171

157172
Long count = (Long) createBaseQuery(id) //
158173
.addProjection(AuditEntity.revisionNumber().count()).getSingleResult();

src/test/java/org/springframework/data/envers/repository/support/RepositoryIntegrationTests.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static org.assertj.core.api.Assertions.*;
1919
import static org.springframework.data.history.RevisionMetadata.RevisionType.*;
2020

21+
import java.time.Instant;
2122
import java.util.Arrays;
2223
import java.util.HashSet;
2324
import java.util.Iterator;
@@ -31,6 +32,9 @@
3132
import org.springframework.beans.factory.annotation.Autowired;
3233
import org.springframework.data.domain.Page;
3334
import org.springframework.data.domain.PageRequest;
35+
import org.springframework.data.domain.Pageable;
36+
import org.springframework.data.domain.Sort;
37+
import org.springframework.data.domain.Sort.Direction;
3438
import org.springframework.data.envers.Config;
3539
import org.springframework.data.envers.sample.Country;
3640
import org.springframework.data.envers.sample.CountryRepository;
@@ -245,6 +249,23 @@ void paginationWithEmptyResult() {
245249
check(23L, 0, 0, 0);
246250
}
247251

252+
253+
@Test
254+
void testSort_pageableByProperty() {
255+
Country de = new Country();
256+
de.code = "de";
257+
de.name = "Deutschland";
258+
de.timestamp = Instant.parse("2000-01-01T00:00:00Z");
259+
countryRepository.save(de);
260+
de.timestamp = Instant.parse("2000-01-04T00:01:00Z");
261+
countryRepository.save(de);
262+
de.timestamp = Instant.parse("2000-01-04T00:00:00Z");
263+
countryRepository.save(de);
264+
265+
assertThat(countryRepository.findRevisions(de.id, PageRequest.of(0, 3, Sort.by("timestamp"))).map(Revision::getEntity).map(country -> country.timestamp).getContent())
266+
.isSortedAccordingTo(Instant::compareTo);
267+
}
268+
248269
void check(Long id, int page, int expectedSize, int expectedTotalSize) {
249270

250271
Page<Revision<Integer, Country>> revisions = countryRepository.findRevisions(id, PageRequest.of(page, 1));

src/test/java/org/springframework/data/envers/sample/Country.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package org.springframework.data.envers.sample;
1717

18+
import java.time.Instant;
19+
1820
import javax.persistence.Entity;
1921

2022
import lombok.ToString;
@@ -32,5 +34,8 @@
3234
public class Country extends AbstractEntity {
3335

3436
public String code;
37+
38+
public Instant timestamp;
39+
3540
public String name;
3641
}

0 commit comments

Comments
 (0)