Skip to content

Commit 1e4cb6e

Browse files
committed
Polishing.
Support ordering by more than a single property. Fixed formatting. Added `@uthor` annotations. See #379 Original Pull Request #381
1 parent e71b170 commit 1e4cb6e

File tree

4 files changed

+55
-38
lines changed

4 files changed

+55
-38
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@
117117
<repositories>
118118
<repository>
119119
<id>spring-libs-snapshot</id>
120-
<url>https://repo.spring.io/libs-snapshot</url>
120+
<url>https://repo.spring.io/snapshot</url>
121121
</repository>
122122
</repositories>
123123

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

+47-28
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,6 @@
1515
*/
1616
package org.springframework.data.envers.repository.support;
1717

18-
import static org.springframework.data.history.RevisionMetadata.RevisionType.*;
19-
20-
import java.util.ArrayList;
21-
import java.util.List;
22-
import java.util.Optional;
23-
24-
import javax.persistence.EntityManager;
25-
2618
import org.hibernate.Hibernate;
2719
import org.hibernate.envers.AuditReader;
2820
import org.hibernate.envers.AuditReaderFactory;
@@ -32,6 +24,7 @@
3224
import org.hibernate.envers.RevisionType;
3325
import org.hibernate.envers.query.AuditEntity;
3426
import org.hibernate.envers.query.AuditQuery;
27+
import org.hibernate.envers.query.criteria.AuditProperty;
3528
import org.hibernate.envers.query.order.AuditOrder;
3629
import org.springframework.data.domain.Page;
3730
import org.springframework.data.domain.PageImpl;
@@ -49,6 +42,14 @@
4942
import org.springframework.transaction.annotation.Transactional;
5043
import org.springframework.util.Assert;
5144

45+
import javax.persistence.EntityManager;
46+
import java.util.ArrayList;
47+
import java.util.Collections;
48+
import java.util.List;
49+
import java.util.Optional;
50+
51+
import static org.springframework.data.history.RevisionMetadata.RevisionType.*;
52+
5253
/**
5354
* Repository implementation using Hibernate Envers to implement revision specific query methods.
5455
*
@@ -72,12 +73,12 @@ public class EnversRevisionRepositoryImpl<T, ID, N extends Number & Comparable<N
7273
* Creates a new {@link EnversRevisionRepositoryImpl} using the given {@link JpaEntityInformation},
7374
* {@link RevisionEntityInformation} and {@link EntityManager}.
7475
*
75-
* @param entityInformation must not be {@literal null}.
76+
* @param entityInformation must not be {@literal null}.
7677
* @param revisionEntityInformation must not be {@literal null}.
77-
* @param entityManager must not be {@literal null}.
78+
* @param entityManager must not be {@literal null}.
7879
*/
7980
public EnversRevisionRepositoryImpl(JpaEntityInformation<T, ?> entityInformation,
80-
RevisionEntityInformation revisionEntityInformation, EntityManager entityManager) {
81+
RevisionEntityInformation revisionEntityInformation, EntityManager entityManager) {
8182

8283
Assert.notNull(revisionEntityInformation, "RevisionEntityInformation must not be null!");
8384

@@ -145,29 +146,47 @@ public Revisions<N, T> findRevisions(ID id) {
145146

146147

147148
private AuditOrder mapRevisionSort(RevisionSort revisionSort) {
148-
return RevisionSort.getRevisionDirection(revisionSort).isDescending() //
149-
? AuditEntity.revisionNumber().desc() //
150-
: AuditEntity.revisionNumber().asc();
149+
150+
return RevisionSort.getRevisionDirection(revisionSort).isDescending() //
151+
? AuditEntity.revisionNumber().desc() //
152+
: AuditEntity.revisionNumber().asc();
151153
}
152154

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());
155+
private List<AuditOrder> mapPropertySort(Sort sort) {
156+
157+
if (sort.isEmpty()) {
158+
return Collections.singletonList(AuditEntity.revisionNumber().asc());
159+
}
160+
161+
List<AuditOrder> result = new ArrayList<>();
162+
for (Sort.Order order : sort) {
163+
164+
AuditProperty<Object> property = AuditEntity.property(order.getProperty());
165+
AuditOrder auditOrder = order.getDirection().isAscending() ?
166+
property.asc() :
167+
property.desc();
168+
169+
result.add(auditOrder);
170+
}
171+
172+
return result;
158173
}
159174

160175
@SuppressWarnings("unchecked")
161176
public Page<Revision<N, T>> findRevisions(ID id, Pageable pageable) {
162-
AuditOrder orderMapped = (pageable.getSort() instanceof RevisionSort) ?
163-
mapRevisionSort((RevisionSort) pageable.getSort()) :
164-
mapPropertySort(pageable.getSort());
165177

166-
List<Object[]> resultList = createBaseQuery(id) //
167-
.addOrder(orderMapped) //
168-
.setFirstResult((int) pageable.getOffset()) //
169-
.setMaxResults(pageable.getPageSize()) //
170-
.getResultList();
178+
AuditQuery baseQuery = createBaseQuery(id);
179+
180+
List<AuditOrder> orderMapped = (pageable.getSort() instanceof RevisionSort) ?
181+
Collections.singletonList(mapRevisionSort((RevisionSort) pageable.getSort())) :
182+
mapPropertySort(pageable.getSort());
183+
184+
orderMapped.forEach(baseQuery::addOrder);
185+
186+
List<Object[]> resultList = baseQuery //
187+
.setFirstResult((int) pageable.getOffset()) //
188+
.setMaxResults(pageable.getPageSize()) //
189+
.getResultList();
171190

172191
Long count = (Long) createBaseQuery(id) //
173192
.addProjection(AuditEntity.revisionNumber().count()).getSingleResult();
@@ -224,7 +243,7 @@ RevisionMetadata<?> createRevisionMetadata() {
224243
return metadata instanceof DefaultRevisionEntity //
225244
? new DefaultRevisionMetadata((DefaultRevisionEntity) metadata, revisionType) //
226245
: new AnnotationRevisionMetadata<>(Hibernate.unproxy(metadata), RevisionNumber.class, RevisionTimestamp.class,
227-
revisionType);
246+
revisionType);
228247
}
229248

230249
private static RevisionMetadata.RevisionType convertRevisionType(RevisionType datum) {

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

+6-9
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
*
5252
* @author Oliver Gierke
5353
* @author Jens Schauder
54+
* @author Niklas Loechte
5455
*/
5556
@ExtendWith(SpringExtension.class)
5657
@ContextConfiguration(classes = Config.class)
@@ -68,13 +69,6 @@ void setUp() {
6869
countryRepository.deleteAll();
6970
}
7071

71-
@AfterEach
72-
void tearDown() {
73-
74-
licenseRepository.deleteAll();
75-
countryRepository.deleteAll();
76-
}
77-
7872
@Test
7973
void testLifeCycle() {
8074

@@ -246,19 +240,22 @@ void shortCircuitingWhenOffsetIsToLarge() {
246240
@Test // #47
247241
void paginationWithEmptyResult() {
248242

249-
check(23L, 0, 0, 0);
243+
check(-23L, 0, 0, 0);
250244
}
251245

252246

253-
@Test
247+
@Test // Envers #379
254248
void testSort_pageableByProperty() {
249+
255250
Country de = new Country();
256251
de.code = "de";
257252
de.name = "Deutschland";
258253
de.timestamp = Instant.parse("2000-01-01T00:00:00Z");
259254
countryRepository.save(de);
255+
260256
de.timestamp = Instant.parse("2000-01-04T00:01:00Z");
261257
countryRepository.save(de);
258+
262259
de.timestamp = Instant.parse("2000-01-04T00:00:00Z");
263260
countryRepository.save(de);
264261

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

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
*
2828
* @author Oliver Gierke
2929
* @author Jens Schauder
30+
* @author Niklas Loechte
3031
*/
3132
@Audited
3233
@Entity

0 commit comments

Comments
 (0)