Skip to content

Commit 0bcf9f2

Browse files
ihordzmichael-simons
authored andcommitted
DATAGRAPH-1290 - Add case insensitive order support for custom queries.
1 parent 060a39f commit 0bcf9f2

File tree

2 files changed

+92
-2
lines changed
  • spring-data-neo4j/src

2 files changed

+92
-2
lines changed

spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/Query.java

+12-2
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,22 @@ private String addSorting(String baseQuery, Sort sort) {
129129
}
130130

131131
private String getSortOrder(Sort sort) {
132-
133132
return sort.stream()
134-
.map(order -> order.getProperty() + " " + order.getDirection())
133+
.map(Query::getPropertySortOrder)
135134
.collect(Collectors.joining(", "));
136135
}
137136

137+
private static String getPropertySortOrder(Sort.Order order) {
138+
StringBuilder sb = new StringBuilder();
139+
if(order.isIgnoreCase()){
140+
sb.append("toLower(").append(order.getProperty()).append(")");
141+
} else {
142+
sb.append(order.getProperty());
143+
}
144+
sb.append(" ").append(order.getDirection());
145+
return sb.toString();
146+
}
147+
138148
private String formatBaseQuery(String cypherQuery) {
139149
cypherQuery = cypherQuery.trim();
140150
if (cypherQuery.endsWith(";")) {

spring-data-neo4j/src/test/java/org/springframework/data/neo4j/queries/PagedQueryTests.java

+80
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
* @author Jasper Blues
4747
* @author Mark Angrish
4848
* @author Nicolas Mervaillie
49+
* @author Ihor Dziuba
4950
*/
5051
@ContextConfiguration(classes = MoviesContextConfiguration.class)
5152
@RunWith(SpringRunner.class)
@@ -465,4 +466,83 @@ public void shouldFindCinemasSortedByNameWithCustomQuery() {
465466
assertEquals("Regal", cinemas.get(8).getName());
466467
assertEquals("Ritzy", cinemas.get(9).getName());
467468
}
469+
470+
@Test // DATAGRAPH-1290
471+
@Transactional
472+
public void shouldFindPagedCinemasSortedCaseInsensitiveWithCustomQuery() {
473+
setup();
474+
Sort sort = Sort.by(Sort.Order.asc("n.name").ignoreCase());
475+
Pageable pageable = PageRequest.of(0, 4, sort);
476+
477+
Page<Cinema> page = cinemaRepository.getPagedCinemas(pageable);
478+
assertThat(page.getNumberOfElements()).isEqualTo(4);
479+
assertThat(page.hasNext()).isTrue();
480+
assertThat(page.getContent().get(0).getName()).isEqualTo("Cineplex");
481+
assertThat(page.getContent().get(1).getName()).isEqualTo("Inox");
482+
assertThat(page.getContent().get(2).getName()).isEqualTo("Landmark");
483+
assertThat(page.getContent().get(3).getName()).isEqualTo("Metro");
484+
485+
page = cinemaRepository.getPagedCinemas(page.nextPageable());
486+
assertThat(page.getNumberOfElements()).isEqualTo(4);
487+
assertThat(page.hasNext()).isTrue();
488+
assertThat(page.getContent().get(0).getName()).isEqualTo("Movietime");
489+
assertThat(page.getContent().get(1).getName()).isEqualTo("Picturehouse");
490+
assertThat(page.getContent().get(2).getName()).isEqualTo("PVR");
491+
assertThat(page.getContent().get(3).getName()).isEqualTo("Rainbow");
492+
493+
page = cinemaRepository.getPagedCinemas(page.nextPageable());
494+
assertThat(page.getNumberOfElements()).isEqualTo(2);
495+
assertThat(page.hasNext()).isFalse();
496+
assertThat(page.getContent().get(0).getName()).isEqualTo("Regal");
497+
assertThat(page.getContent().get(1).getName()).isEqualTo("Ritzy");
498+
}
499+
500+
@Test // DATAGRAPH-1290
501+
@Transactional
502+
public void shouldFindSlicedCinemasSortedCaseInsensitiveWithCustomQuery() {
503+
setup();
504+
Sort sort = Sort.by(Sort.Order.asc("n.name").ignoreCase());
505+
Pageable pageable = PageRequest.of(0, 4, sort);
506+
507+
Slice<Cinema> slice = cinemaRepository.getSlicedCinemasByName(pageable);
508+
assertThat(slice.getNumberOfElements()).isEqualTo(4);
509+
assertThat(slice.hasNext()).isTrue();
510+
assertThat(slice.getContent().get(0).getName()).isEqualTo("Cineplex");
511+
assertThat(slice.getContent().get(1).getName()).isEqualTo("Inox");
512+
assertThat(slice.getContent().get(2).getName()).isEqualTo("Landmark");
513+
assertThat(slice.getContent().get(3).getName()).isEqualTo("Metro");
514+
515+
slice = cinemaRepository.getSlicedCinemasByName(slice.nextPageable());
516+
assertThat(slice.getNumberOfElements()).isEqualTo(4);
517+
assertThat(slice.hasNext()).isTrue();
518+
assertThat(slice.getContent().get(0).getName()).isEqualTo("Movietime");
519+
assertThat(slice.getContent().get(1).getName()).isEqualTo("Picturehouse");
520+
assertThat(slice.getContent().get(2).getName()).isEqualTo("PVR");
521+
assertThat(slice.getContent().get(3).getName()).isEqualTo("Rainbow");
522+
523+
slice = cinemaRepository.getSlicedCinemasByName(slice.nextPageable());
524+
assertThat(slice.getNumberOfElements()).isEqualTo(2);
525+
assertThat(slice.hasNext()).isFalse();
526+
assertThat(slice.getContent().get(0).getName()).isEqualTo("Regal");
527+
assertThat(slice.getContent().get(1).getName()).isEqualTo("Ritzy");
528+
}
529+
530+
@Test // DATAGRAPH-1290
531+
@Transactional
532+
public void shouldFindCinemasSortedCaseInsensitiveByNameWithCustomQuery() {
533+
setup();
534+
Sort sort = Sort.by(Sort.Order.asc("n.name").ignoreCase());
535+
List<Cinema> cinemas = cinemaRepository.getCinemasSortedByName(sort);
536+
assertThat(cinemas.size()).isEqualTo(10);
537+
assertThat(cinemas.get(0).getName()).isEqualTo("Cineplex");
538+
assertThat(cinemas.get(1).getName()).isEqualTo("Inox");
539+
assertThat(cinemas.get(2).getName()).isEqualTo("Landmark");
540+
assertThat(cinemas.get(3).getName()).isEqualTo("Metro");
541+
assertThat(cinemas.get(4).getName()).isEqualTo("Movietime");
542+
assertThat(cinemas.get(5).getName()).isEqualTo("Picturehouse");
543+
assertThat(cinemas.get(6).getName()).isEqualTo("PVR");
544+
assertThat(cinemas.get(7).getName()).isEqualTo("Rainbow");
545+
assertThat(cinemas.get(8).getName()).isEqualTo("Regal");
546+
assertThat(cinemas.get(9).getName()).isEqualTo("Ritzy");
547+
}
468548
}

0 commit comments

Comments
 (0)