From 4cf9ae2d01cebdea1d324b463ac5c15de8ea0454 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 aa10c3b24..79387d2cb 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; @@ -267,13 +266,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 @@ -307,6 +301,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()); @@ -4321,6 +4333,8 @@ class RepositoryIT { Pet findByFriendsName(String friendName); + Long deleteByNameAndFriendsName(String name, String friendsName); + Pet findByFriendsFriendsName(String friendName); long countByName(String name);