From 1291f90500ebe76df9f8f0b0c1ee89a8dd7aae6a Mon Sep 17 00:00:00 2001 From: Adam George Date: Thu, 22 Oct 2015 09:54:25 +0100 Subject: [PATCH] DATAGRAPH-761 - Adding support for negated derived queries. Also improved character escaping for LIKE queries. --- .../QueryResultGraphRepositoryQuery.java | 2 +- .../query/derived/CypherFinderQuery.java | 3 +++ .../examples/movies/repo/UserRepository.java | 4 ++- .../data/neo4j/queries/DerivedQueryTest.java | 26 +++++++++++++++++++ 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/QueryResultGraphRepositoryQuery.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/QueryResultGraphRepositoryQuery.java index 2c25ecfab..246a1a6d9 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/QueryResultGraphRepositoryQuery.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/QueryResultGraphRepositoryQuery.java @@ -29,7 +29,7 @@ import org.neo4j.ogm.session.result.RowModel; import org.neo4j.ogm.session.transaction.Transaction; /** - * Specialisation of {@link GraphRepositoryQuery} that handles mapping to object annotated with @QueryResult. + * Specialisation of {@link GraphRepositoryQuery} that handles mapping to objects annotated with @QueryResult. * * @author Adam George */ diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/derived/CypherFinderQuery.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/derived/CypherFinderQuery.java index 004156374..f3a947980 100644 --- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/derived/CypherFinderQuery.java +++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/derived/CypherFinderQuery.java @@ -52,6 +52,7 @@ public class CypherFinderQuery implements DerivedQueryDefinition { parameter.setPropertyName(property); parameter.setOwnerEntityType(entityType); parameter.setComparisonOperator(convertToComparisonOperator(part.getType())); + parameter.setNegated(part.getType().name().startsWith("NOT")); parameter.setBooleanOperator(booleanOperator); if (part.getProperty().next() != null) { @@ -74,6 +75,8 @@ public class CypherFinderQuery implements DerivedQueryDefinition { return ComparisonOperator.MATCHES; case LIKE: return ComparisonOperator.LIKE; + case NOT_LIKE: + return ComparisonOperator.LIKE; default: return ComparisonOperator.EQUALS; } 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 0371acdac..208fa79a6 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 @@ -83,10 +83,12 @@ public interface UserRepository extends GraphRepository { @Query("MATCH (user:User) WHERE ID(user)={userId} RETURN user") User loadUserByNamedId(@Param("userId") User user); - @Query("MATCH (user:User) RETURN user") Iterable getAllUsersIterable(); @Query("MATCH (user:User) set user.name={0}") void setNamesNull(String name); + + List findByNameIsNotLike(String name); + } diff --git a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/queries/DerivedQueryTest.java b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/queries/DerivedQueryTest.java index f4c7c2be7..e9fae674b 100644 --- a/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/queries/DerivedQueryTest.java +++ b/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/queries/DerivedQueryTest.java @@ -382,5 +382,31 @@ public class DerivedQueryTest { assertEquals("The wrong number of cinemas was returned", 2, cinemas.size()); } + /** + * DATAGRAPH-761 + */ + @Test + public void shouldMatchNodeEntitiesUsingLikeWithWildcardsAndSpecialCharacters() { + executeUpdate("CREATE (:Theatre {name:'IMAX', city:'Kolkata (Calcutta)'}), " + + "(:Theatre {name:'PVR', city:'Bengaluru (Bangalore)'}), " + + "(:Theatre {name:'Metro Big Cinema', city:'Mumbai (Bombay)'}) "); + + List indianCinemas = cinemaRepository.findByLocationLike("*(B*"); + assertEquals("The wrong number of cinemas was returned", 2, indianCinemas.size()); + } + + /** + * DATAGRAPH-761 + */ + @Test + public void shouldMatchNodeEntitiesUsingNotLikeWithAsteriskWildcards() { + executeUpdate("CREATE (:User {name:'Jeff'}), " + + "(:User {name:'Jeremy'}), " + + "(:User {name:'Alan'})"); + + List nonMatchingUsers = userRepository.findByNameIsNotLike("Je*"); + assertEquals("The wrong number of users was returned", 1, nonMatchingUsers.size()); + assertEquals("The wrong user was returned", "Alan", nonMatchingUsers.get(0).getName()); + } }