From 84864a23a762d17d025d5f1cfb65e54d469c2d49 Mon Sep 17 00:00:00 2001 From: Michael Simons Date: Tue, 28 Sep 2021 16:02:06 +0200 Subject: [PATCH] GH-2389 - Fix issues on Neo4j 4.x+. This closes #2389. --- .../filter/ContainsComparisonBuilder.java | 20 +++++++++++++++---- .../conversion/ogm618/MyNodeRepository.java | 2 +- .../movies/MoviesIntegrationTests.java | 20 ++++++++++--------- .../examples/movies/repo/UserRepository.java | 2 ++ .../queries/QueryResultIntegrationTests.java | 1 - 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/filter/ContainsComparisonBuilder.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/filter/ContainsComparisonBuilder.java index 3c462ce8a..1055d69c7 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/filter/ContainsComparisonBuilder.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/filter/ContainsComparisonBuilder.java @@ -15,13 +15,17 @@ */ package org.springframework.data.neo4j.repository.query.filter; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Stack; import org.neo4j.ogm.cypher.BooleanOperator; +import org.neo4j.ogm.cypher.ComparisonOperator; import org.neo4j.ogm.cypher.Filter; import org.neo4j.ogm.cypher.function.ContainsAnyComparison; +import org.neo4j.ogm.cypher.function.FilterFunction; +import org.neo4j.ogm.cypher.function.PropertyComparison; import org.springframework.data.repository.query.parser.Part; /** @@ -41,10 +45,18 @@ class ContainsComparisonBuilder extends FilterBuilder { NestedAttributes nestedAttributes = getNestedAttributes(part); - final Object containingValue = params.pop(); - Filter containingFilter = new Filter( - nestedAttributes.isEmpty() ? propertyName() : nestedAttributes.getLeafPropertySegment(), - new ContainsAnyComparison(containingValue)); + Object valueToBeContained = params.pop(); + Filter containingFilter; + if (Collection.class.isAssignableFrom(part.getProperty().getTypeInformation().getType())) { + if(!(valueToBeContained instanceof Collection)) { + valueToBeContained = Collections.singletonList(valueToBeContained); + } + FilterFunction comparison = new ContainsAnyComparison(valueToBeContained); + containingFilter = new Filter(nestedAttributes.isEmpty() ? propertyName() : nestedAttributes.getLeafPropertySegment(), comparison); + } else { + containingFilter = new Filter(nestedAttributes.isEmpty() ? propertyName() : nestedAttributes.getLeafPropertySegment(), ComparisonOperator.CONTAINING, valueToBeContained); + } + containingFilter.setOwnerEntityType(entityType); containingFilter.setBooleanOperator(booleanOperator); containingFilter.setNegated(isNegated()); diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/conversion/ogm618/MyNodeRepository.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/conversion/ogm618/MyNodeRepository.java index 95d28d07b..63e5b25a7 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/conversion/ogm618/MyNodeRepository.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/conversion/ogm618/MyNodeRepository.java @@ -27,7 +27,7 @@ import org.springframework.data.repository.query.Param; */ public interface MyNodeRepository extends Repository { - @Query("CALL test.generateListOfNodes({empty})") + @Query("CALL test.generateListOfNodes($empty)") List generateListOfNodes(@Param("empty") boolean empty); Optional findOneByName(String name); diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/MoviesIntegrationTests.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/MoviesIntegrationTests.java index ce26fda1f..c78836da5 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/MoviesIntegrationTests.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/MoviesIntegrationTests.java @@ -598,23 +598,17 @@ public class MoviesIntegrationTests { Optional tempMovieOptional = tempMovieRepository.findById(movie.getId()); assertThat(tempMovieOptional.isPresent()).isTrue(); - tempMovieOptional.ifPresent(actual -> { - assertThat(actual.getName()).isEqualTo(movie.getName()); - }); + tempMovieOptional.ifPresent(actual -> assertThat(actual.getName()).isEqualTo(movie.getName())); Optional userOptional = userRepository.findById(user.getId()); assertThat(userOptional.isPresent()).isTrue(); - userOptional.ifPresent(actual -> { - assertThat(actual.getName()).isEqualTo(user.getName()); - }); + userOptional.ifPresent(actual -> assertThat(actual.getName()).isEqualTo(user.getName())); Optional ratingOptional = ratingRepository.findById(user.getRatings().iterator().next().getId()); assertThat(ratingOptional.isPresent()).isTrue(); - ratingOptional.ifPresent(actual -> { - assertThat(actual.getStars()).isEqualTo(5); - }); + ratingOptional.ifPresent(actual -> assertThat(actual.getStars()).isEqualTo(5)); assertThat(tempMovieRepository.findById(user.getId()).isPresent()) .isFalse(); @@ -673,6 +667,14 @@ public class MoviesIntegrationTests { assertThat(foundUser.isEmpty()).isTrue(); } + @Test + public void findUserByContainingValue() { + createUserForContainsTest(); + + List foundUser = userRepository.findByNameContaining("body"); + assertThat(foundUser).hasSize(1); + } + @Test // DATAGRAPH-1407 public void shouldRemoveGenreFromUserDespiteReadonlyCustomQuery() { transactionTemplate.execute(new TransactionCallbackWithoutResult() { diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/repo/UserRepository.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/repo/UserRepository.java index 4333c421b..3a83d273e 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/repo/UserRepository.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/repo/UserRepository.java @@ -166,6 +166,8 @@ public interface UserRepository extends PersonRepository { List findByEmailAddressesNotContaining(String email); + List findByNameContaining(String name); + @Query("MATCH (user:User) WHERE user.name=$0 RETURN user") Optional findOptionalUserWithCustomQuery(String userName); diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/queries/QueryResultIntegrationTests.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/queries/QueryResultIntegrationTests.java index c4156c464..94566654e 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/queries/QueryResultIntegrationTests.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/queries/QueryResultIntegrationTests.java @@ -104,7 +104,6 @@ public class QueryResultIntegrationTests { String expectedPerson = pet instanceof Cat ? "Sally" : "Billy"; assertThat(pet).extracting(Pet::getName).isEqualTo(expectedName); assertThat(pet.getPerson()).isNotNull().extracting(Person::getName).isEqualTo(expectedPerson); - System.out.println("what?"); }); } }