@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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?");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user