From 5b6b24df10f95d4e817fbb14d71b127844e74778 Mon Sep 17 00:00:00 2001 From: Gerrit Meier Date: Wed, 1 Mar 2023 09:31:48 +0100 Subject: [PATCH] GH-2685 - Fix delete query method with relationships. Previously relationship related properties in the query method were missing in the MATCH part but the condition would get applied. This created an incorrect query string and failed on the server side. Non-invasive change to avoid regression in the other parts. Closes #2685 --- .../neo4j/repository/query/CypherQueryCreator.java | 13 +++++-------- .../neo4j/repository/query/QueryFragments.java | 9 +++++++++ .../neo4j/integration/imperative/RepositoryIT.java | 14 ++++++++++++++ 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/springframework/data/neo4j/repository/query/CypherQueryCreator.java b/src/main/java/org/springframework/data/neo4j/repository/query/CypherQueryCreator.java index cc851b0c1..57322d79f 100644 --- a/src/main/java/org/springframework/data/neo4j/repository/query/CypherQueryCreator.java +++ b/src/main/java/org/springframework/data/neo4j/repository/query/CypherQueryCreator.java @@ -44,7 +44,6 @@ import org.neo4j.cypherdsl.core.Predicates; import org.neo4j.cypherdsl.core.Property; import org.neo4j.cypherdsl.core.RelationshipPattern; import org.neo4j.cypherdsl.core.SortItem; -import org.neo4j.cypherdsl.core.Statement; import org.neo4j.driver.types.Point; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Range; @@ -260,13 +259,8 @@ final class CypherQueryCreator extends AbstractQueryCreator Neo4jQuerySupport.logParameterIfNull(p.nameOrIndex, p.value)) .collect(Collectors.toMap(p -> p.nameOrIndex, p -> parameterConversion.apply(p.value, p.conversionOverride))); - if (queryType == Neo4jQueryType.DELETE) { - Statement statement = CypherGenerator.INSTANCE.prepareDeleteOf(nodeDescription, condition, true); - return new QueryFragmentsAndParameters(statement.getCypher(), convertedParameters); - } else { - QueryFragments queryFragments = createQueryFragments(condition, sort); - return new QueryFragmentsAndParameters(nodeDescription, queryFragments, convertedParameters); - } + QueryFragments queryFragments = createQueryFragments(condition, sort); + return new QueryFragmentsAndParameters(nodeDescription, queryFragments, convertedParameters); } @NonNull @@ -300,6 +294,9 @@ final class CypherQueryCreator extends AbstractQueryCreator session.run("CREATE (p1:Pet{name: 'Pet1'})-[:Has]->(p2:Pet{name: 'Pet2'})").consume()); + + repository.deleteByNameAndFriendsName("Pet1", "Pet2"); + doWithSession(session -> { + assertThat(session.run("MATCH (p1:Pet{name: 'Pet'}) return p1").list()).hasSize(0); + return null; + }); + } + @Test void findBySameLabelRelationshipPropertyMultipleLevels(@Autowired PetRepository repository) { doWithSession(session -> session.run("CREATE (p1:Pet{name: 'Pet1'})-[:Has]->(p2:Pet{name: 'Pet2'})-[:Has]->(p3:Pet{name: 'Pet3'})").consume()); @@ -4364,6 +4376,8 @@ class RepositoryIT { Pet findByFriendsName(String friendName); + Long deleteByNameAndFriendsName(String name, String friendsName); + Pet findByFriendsFriendsName(String friendName); long countByName(String name);