From 0cc5d786c44a5c735ff9f33ec58a0c8b60620ab3 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 17 Jul 2024 09:32:36 +0200 Subject: [PATCH] Add tests for default sorting with MongoDB Smoke test for spring-projects/spring-data-mongodb#4744 --- .../DataMongoDbApplicationAotTests.java | 8 +++ .../java/com/example/data/mongodb/CLR.java | 50 +++++++++++++++---- .../data/mongodb/PersonRepository.java | 7 +++ 3 files changed, 54 insertions(+), 11 deletions(-) diff --git a/data/data-mongodb/src/appTest/java/com/example/data/mongodb/DataMongoDbApplicationAotTests.java b/data/data-mongodb/src/appTest/java/com/example/data/mongodb/DataMongoDbApplicationAotTests.java index 8232098d..b8814501 100644 --- a/data/data-mongodb/src/appTest/java/com/example/data/mongodb/DataMongoDbApplicationAotTests.java +++ b/data/data-mongodb/src/appTest/java/com/example/data/mongodb/DataMongoDbApplicationAotTests.java @@ -88,4 +88,12 @@ void findByLastName(AssertableOutput output) { }); } + @Test + void findWithDefaultSort(AssertableOutput output) { + Awaitility.await().atMost(Duration.ofSeconds(10)).untilAsserted(() -> { + assertThat(output).hasSingleLineContaining("annotated-query-default-sort(): [last-3, last-2, last-1]"); + assertThat(output).hasSingleLineContaining("derived-query-default-sort(): [last-3, last-2, last-1]"); + }); + } + } diff --git a/data/data-mongodb/src/main/java/com/example/data/mongodb/CLR.java b/data/data-mongodb/src/main/java/com/example/data/mongodb/CLR.java index fcaf93dd..1152473a 100644 --- a/data/data-mongodb/src/main/java/com/example/data/mongodb/CLR.java +++ b/data/data-mongodb/src/main/java/com/example/data/mongodb/CLR.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; import org.bson.Document; import org.springframework.beans.factory.annotation.Autowired; @@ -61,18 +62,12 @@ public void run(String... args) { runQueryByExample(product1); runInTransaction(product1); - personRepository.save(new Person("first-1", "last-1")); - personRepository.save(new Person("first-2", "last-2")); - personRepository.save(new Person("first-3", "last-3")); - - for (Person person : this.personRepository.findAll()) { - System.out.printf("findAll(): %s%n", person); - } - - for (Person person : this.personRepository.findByLastname("last-3")) { - System.out.printf("findByLastname(): %s%n", person); - } + Person person1 = new Person("first-1", "last-1"); + Person person2 = new Person("first-2", "last-2"); + Person person3 = new Person("first-3", "last-3"); + runDerivedFinder(person1, person2, person3); + runQueriesWithDefaultSort(person1, person2, person3); } // Prepare Collections to avoid timeouts on slow ci/docker/... @@ -324,6 +319,39 @@ private void runInTransaction(LineItem product1) { log("-----------------\n\n\n"); } + private void runDerivedFinder(Person person1, Person person2, Person person3) { + + log("---- DERIVED FINDER ----"); + personRepository.deleteAll(); + personRepository.saveAll(List.of(person1, person2, person3)); + + for (Person person : this.personRepository.findAll()) { + System.out.printf("findAll(): %s%n", person); + } + + for (Person person : this.personRepository.findByLastname("last-3")) { + System.out.printf("findByLastname(): %s%n", person); + } + log("-----------------\n\n\n"); + } + + private void runQueriesWithDefaultSort(Person person1, Person person2, Person person3) { + + log("---- DEFAULT SORT ----"); + personRepository.deleteAll(); + personRepository.saveAll(List.of(person1, person2, person3)); + + List annotatedQueryResult = this.personRepository.findAndSortPersonsDescByLastnameViaAnnotation("last"); + System.out.printf("annotated-query-default-sort(): %s", + annotatedQueryResult.stream().map(Person::getLastname).collect(Collectors.toList())); + + List derivedQueryResult = this.personRepository.findWithDefaultSortByLastnameStartingWith("last"); + System.out.printf("derived-query-default-sort(): %s", + derivedQueryResult.stream().map(Person::getLastname).collect(Collectors.toList())); + + log("-----------------\n\n\n"); + } + private Order newOrder(String customerId, LineItem... items) { return newOrder(customerId, new Date(), items); } diff --git a/data/data-mongodb/src/main/java/com/example/data/mongodb/PersonRepository.java b/data/data-mongodb/src/main/java/com/example/data/mongodb/PersonRepository.java index 359d0781..01c76c37 100644 --- a/data/data-mongodb/src/main/java/com/example/data/mongodb/PersonRepository.java +++ b/data/data-mongodb/src/main/java/com/example/data/mongodb/PersonRepository.java @@ -17,10 +17,17 @@ import java.util.List; +import org.springframework.data.mongodb.repository.Query; import org.springframework.data.repository.ListCrudRepository; public interface PersonRepository extends ListCrudRepository { List findByLastname(String lastname); + @Query(value = "{ 'lastname' : { '$regex' : '?0.*'} }", sort = "{ 'lastname' : -1 }") + List findAndSortPersonsDescByLastnameViaAnnotation(String lastname); + + @Query(sort = "{ 'lastname' : -1 }") + List findWithDefaultSortByLastnameStartingWith(String lastname); + }