Skip to content

Commit 6ad4628

Browse files
committed
GH-2178 - Create correct union statements.
This closes GH-2178
1 parent 2fde402 commit 6ad4628

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

src/main/java/org/springframework/data/neo4j/core/mapping/CypherGenerator.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -271,11 +271,13 @@ public Statement prepareSaveOf(NodeDescription<?> nodeDescription,
271271
.where(possibleExistingNode.isNull()).create(rootNode)
272272
.set(rootNode, parameter(Constants.NAME_OF_PROPERTIES_PARAM))).returning(rootNode.internalId()).build();
273273

274+
// needs a dedicated variable for the union function in the CypherDSL.
275+
Node nodeToUpdate = node(primaryLabel, additionalLabels).named(Constants.NAME_OF_ROOT_NODE);
274276
Statement updateIfExists = updateDecorator
275-
.apply(match(rootNode).where(rootNode.property(nameOfIdProperty).isEqualTo(idParameter))
276-
.and(rootNode.property(versionProperty.getName()).isEqualTo(parameter(Constants.NAME_OF_VERSION_PARAM)))
277-
.mutate(rootNode, parameter(Constants.NAME_OF_PROPERTIES_PARAM)))
278-
.returning(rootNode.internalId()).build();
277+
.apply(match(nodeToUpdate).where(nodeToUpdate.property(nameOfIdProperty).isEqualTo(idParameter))
278+
.and(nodeToUpdate.property(versionProperty.getName()).isEqualTo(parameter(Constants.NAME_OF_VERSION_PARAM)))
279+
.mutate(nodeToUpdate, parameter(Constants.NAME_OF_PROPERTIES_PARAM)))
280+
.returning(nodeToUpdate.internalId()).build();
279281
return Cypher.union(createIfNew, updateIfExists);
280282

281283
} else {
@@ -289,6 +291,9 @@ public Statement prepareSaveOf(NodeDescription<?> nodeDescription,
289291
Statement createIfNew;
290292
Statement updateIfExists;
291293

294+
// needs a dedicated variable for the union function in the CypherDSL.
295+
Node nodeToUpdate = node(primaryLabel, additionalLabels).named(Constants.NAME_OF_ROOT_NODE);
296+
292297
if (((Neo4jPersistentEntity) nodeDescription).hasVersionProperty()) {
293298

294299
PersistentProperty versionProperty = ((Neo4jPersistentEntity) nodeDescription).getRequiredVersionProperty();
@@ -299,18 +304,18 @@ public Statement prepareSaveOf(NodeDescription<?> nodeDescription,
299304
.set(rootNode, parameter(Constants.NAME_OF_PROPERTIES_PARAM)))
300305
.returning(rootNode.internalId()).build();
301306

302-
updateIfExists = updateDecorator.apply(match(rootNode).where(rootNode.internalId().isEqualTo(idParameter))
303-
.and(rootNode.property(versionProperty.getName()).isEqualTo(parameter(Constants.NAME_OF_VERSION_PARAM)))
304-
.mutate(rootNode, parameter(Constants.NAME_OF_PROPERTIES_PARAM))).returning(rootNode.internalId()).build();
307+
updateIfExists = updateDecorator.apply(match(nodeToUpdate).where(nodeToUpdate.internalId().isEqualTo(idParameter))
308+
.and(nodeToUpdate.property(versionProperty.getName()).isEqualTo(parameter(Constants.NAME_OF_VERSION_PARAM)))
309+
.mutate(nodeToUpdate, parameter(Constants.NAME_OF_PROPERTIES_PARAM))).returning(nodeToUpdate.internalId()).build();
305310
} else {
306311
createIfNew = updateDecorator
307312
.apply(optionalMatch(possibleExistingNode).where(possibleExistingNode.internalId().isEqualTo(idParameter))
308313
.with(possibleExistingNode).where(possibleExistingNode.isNull()).create(rootNode)
309314
.set(rootNode, parameter(Constants.NAME_OF_PROPERTIES_PARAM)))
310315
.returning(rootNode.internalId()).build();
311316

312-
updateIfExists = updateDecorator.apply(match(rootNode).where(rootNode.internalId().isEqualTo(idParameter))
313-
.mutate(rootNode, parameter(Constants.NAME_OF_PROPERTIES_PARAM))).returning(rootNode.internalId()).build();
317+
updateIfExists = updateDecorator.apply(match(nodeToUpdate).where(nodeToUpdate.internalId().isEqualTo(idParameter))
318+
.mutate(nodeToUpdate, parameter(Constants.NAME_OF_PROPERTIES_PARAM))).returning(nodeToUpdate.internalId()).build();
314319
}
315320

316321
return Cypher.union(createIfNew, updateIfExists);

0 commit comments

Comments
 (0)