Pagination now supports sorting by property.
Closes https://github.com/spring-projects/spring-data-envers/issues/379 Original Pull Request https://github.com/spring-projects/spring-data-envers/pull/381
This commit is contained in:
committed by
Jens Schauder
parent
d267a70ec7
commit
e71b17020e
@@ -36,6 +36,7 @@ import org.hibernate.envers.query.order.AuditOrder;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageImpl;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.domain.Sort;
|
||||
import org.springframework.data.history.AnnotationRevisionMetadata;
|
||||
import org.springframework.data.history.Revision;
|
||||
import org.springframework.data.history.RevisionMetadata;
|
||||
@@ -58,6 +59,7 @@ import org.springframework.util.Assert;
|
||||
* @author Julien Millau
|
||||
* @author Mark Paluch
|
||||
* @author Sander Bylemans
|
||||
* @author Niklas Loechte
|
||||
*/
|
||||
@Transactional(readOnly = true)
|
||||
public class EnversRevisionRepositoryImpl<T, ID, N extends Number & Comparable<N>>
|
||||
@@ -141,18 +143,31 @@ public class EnversRevisionRepositoryImpl<T, ID, N extends Number & Comparable<N
|
||||
return Revisions.of(revisionList);
|
||||
}
|
||||
|
||||
|
||||
private AuditOrder mapRevisionSort(RevisionSort revisionSort) {
|
||||
return RevisionSort.getRevisionDirection(revisionSort).isDescending() //
|
||||
? AuditEntity.revisionNumber().desc() //
|
||||
: AuditEntity.revisionNumber().asc();
|
||||
}
|
||||
|
||||
private AuditOrder mapPropertySort(Sort sort) {
|
||||
return sort.stream().findFirst().map(order -> order.getDirection().isAscending() ?
|
||||
AuditEntity.property(order.getProperty()).asc() :
|
||||
AuditEntity.property(order.getProperty()).desc())
|
||||
.orElse(AuditEntity.revisionNumber().asc());
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public Page<Revision<N, T>> findRevisions(ID id, Pageable pageable) {
|
||||
|
||||
AuditOrder sorting = RevisionSort.getRevisionDirection(pageable.getSort()).isDescending() //
|
||||
? AuditEntity.revisionNumber().desc() //
|
||||
: AuditEntity.revisionNumber().asc();
|
||||
AuditOrder orderMapped = (pageable.getSort() instanceof RevisionSort) ?
|
||||
mapRevisionSort((RevisionSort) pageable.getSort()) :
|
||||
mapPropertySort(pageable.getSort());
|
||||
|
||||
List<Object[]> resultList = createBaseQuery(id) //
|
||||
.addOrder(sorting) //
|
||||
.setFirstResult((int) pageable.getOffset()) //
|
||||
.setMaxResults(pageable.getPageSize()) //
|
||||
.getResultList();
|
||||
.addOrder(orderMapped) //
|
||||
.setFirstResult((int) pageable.getOffset()) //
|
||||
.setMaxResults(pageable.getPageSize()) //
|
||||
.getResultList();
|
||||
|
||||
Long count = (Long) createBaseQuery(id) //
|
||||
.addProjection(AuditEntity.revisionNumber().count()).getSingleResult();
|
||||
|
||||
@@ -18,6 +18,7 @@ package org.springframework.data.envers.repository.support;
|
||||
import static org.assertj.core.api.Assertions.*;
|
||||
import static org.springframework.data.history.RevisionMetadata.RevisionType.*;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
@@ -31,6 +32,9 @@ import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.domain.Sort;
|
||||
import org.springframework.data.domain.Sort.Direction;
|
||||
import org.springframework.data.envers.Config;
|
||||
import org.springframework.data.envers.sample.Country;
|
||||
import org.springframework.data.envers.sample.CountryRepository;
|
||||
@@ -245,6 +249,23 @@ class RepositoryIntegrationTests {
|
||||
check(23L, 0, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void testSort_pageableByProperty() {
|
||||
Country de = new Country();
|
||||
de.code = "de";
|
||||
de.name = "Deutschland";
|
||||
de.timestamp = Instant.parse("2000-01-01T00:00:00Z");
|
||||
countryRepository.save(de);
|
||||
de.timestamp = Instant.parse("2000-01-04T00:01:00Z");
|
||||
countryRepository.save(de);
|
||||
de.timestamp = Instant.parse("2000-01-04T00:00:00Z");
|
||||
countryRepository.save(de);
|
||||
|
||||
assertThat(countryRepository.findRevisions(de.id, PageRequest.of(0, 3, Sort.by("timestamp"))).map(Revision::getEntity).map(country -> country.timestamp).getContent())
|
||||
.isSortedAccordingTo(Instant::compareTo);
|
||||
}
|
||||
|
||||
void check(Long id, int page, int expectedSize, int expectedTotalSize) {
|
||||
|
||||
Page<Revision<Integer, Country>> revisions = countryRepository.findRevisions(id, PageRequest.of(page, 1));
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
package org.springframework.data.envers.sample;
|
||||
|
||||
import java.time.Instant;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
|
||||
import lombok.ToString;
|
||||
@@ -32,5 +34,8 @@ import org.hibernate.envers.Audited;
|
||||
public class Country extends AbstractEntity {
|
||||
|
||||
public String code;
|
||||
|
||||
public Instant timestamp;
|
||||
|
||||
public String name;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user