GH-2389 - Fix issues on Neo4j 4.x+.

This closes #2389.
This commit is contained in:
Michael Simons
2021-09-28 16:02:06 +02:00
parent 6b51f9d4b2
commit 84864a23a7
5 changed files with 30 additions and 15 deletions

View File

@@ -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<Object> 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());

View File

@@ -27,7 +27,7 @@ import org.springframework.data.repository.query.Param;
*/
public interface MyNodeRepository extends Repository<MyNode, Long> {
@Query("CALL test.generateListOfNodes({empty})")
@Query("CALL test.generateListOfNodes($empty)")
List<ResultHolder> generateListOfNodes(@Param("empty") boolean empty);
Optional<MyNode> findOneByName(String name);

View File

@@ -598,23 +598,17 @@ public class MoviesIntegrationTests {
Optional<TempMovie> 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<User> 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<Rating> 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<User> foundUser = userRepository.findByNameContaining("body");
assertThat(foundUser).hasSize(1);
}
@Test // DATAGRAPH-1407
public void shouldRemoveGenreFromUserDespiteReadonlyCustomQuery() {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {

View File

@@ -166,6 +166,8 @@ public interface UserRepository extends PersonRepository<User, Long> {
List<User> findByEmailAddressesNotContaining(String email);
List<User> findByNameContaining(String name);
@Query("MATCH (user:User) WHERE user.name=$0 RETURN user")
Optional<User> findOptionalUserWithCustomQuery(String userName);

View File

@@ -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?");
});
}
}