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
This commit is contained in:
@@ -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<QueryFragmentsAndPar
|
||||
.peek(p -> 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<QueryFragmentsAndPar
|
||||
queryFragments.setReturnExpression(Functions.count(Cypher.asterisk()), true);
|
||||
} else if (queryType == Neo4jQueryType.EXISTS) {
|
||||
queryFragments.setReturnExpression(Functions.count(Constants.NAME_OF_TYPED_ROOT_NODE.apply(nodeDescription)).gt(Cypher.literalOf(0)), true);
|
||||
} else if (queryType == Neo4jQueryType.DELETE) {
|
||||
queryFragments.setDeleteExpression(Constants.NAME_OF_TYPED_ROOT_NODE.apply(nodeDescription));
|
||||
queryFragments.setReturnExpression(Functions.count(Constants.NAME_OF_TYPED_ROOT_NODE.apply(nodeDescription)), true);
|
||||
} else {
|
||||
queryFragments.setReturnBasedOn(nodeDescription, includedProperties, isDistinct);
|
||||
queryFragments.setOrderBy(Stream
|
||||
|
||||
@@ -55,6 +55,7 @@ public final class QueryFragments {
|
||||
private ReturnTuple returnTuple;
|
||||
private boolean scalarValueReturn = false;
|
||||
private boolean renderConstantsAsParameters = false;
|
||||
private Expression deleteExpression;
|
||||
|
||||
public void addMatchOn(PatternElement match) {
|
||||
this.matchOn.add(match);
|
||||
@@ -80,6 +81,10 @@ public final class QueryFragments {
|
||||
this.returnExpressions = expression;
|
||||
}
|
||||
|
||||
public void setDeleteExpression(Expression expression) {
|
||||
this.deleteExpression = expression;
|
||||
}
|
||||
|
||||
public void setReturnExpression(Expression returnExpression, boolean isScalarValue) {
|
||||
this.returnExpressions = Collections.singletonList(returnExpression);
|
||||
this.scalarValueReturn = isScalarValue;
|
||||
@@ -128,6 +133,10 @@ public final class QueryFragments {
|
||||
|
||||
StatementBuilder.OngoingReadingWithWhere matchWithWhere = match.where(condition);
|
||||
|
||||
if (deleteExpression != null) {
|
||||
matchWithWhere = (StatementBuilder.OngoingReadingWithWhere) matchWithWhere.detachDelete(deleteExpression);
|
||||
}
|
||||
|
||||
StatementBuilder.OngoingReadingAndReturn returnPart = isDistinctReturn()
|
||||
? matchWithWhere.returningDistinct(getReturnExpressions())
|
||||
: matchWithWhere.returning(getReturnExpressions());
|
||||
|
||||
@@ -940,6 +940,18 @@ class RepositoryIT {
|
||||
assertThat(pet.getFriends()).isNotEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
void deleteByOwnPropertyAndRelationshipsProperty(@Autowired PetRepository repository) {
|
||||
|
||||
doWithSession(session -> 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);
|
||||
|
||||
Reference in New Issue
Block a user