Skip to content

Commit c9f0d46

Browse files
committed
GH-2317 - Move logic towards visited nodes instead of relationships.
1 parent d8b20c8 commit c9f0d46

File tree

1 file changed

+12
-8
lines changed

1 file changed

+12
-8
lines changed

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -547,34 +547,38 @@ public boolean containsPossibleCircles(Predicate<PropertyFilter.RelaxedPropertyP
547547
private boolean calculatePossibleCircles(Predicate<PropertyFilter.RelaxedPropertyPath> includeField) {
548548
Collection<RelationshipDescription> relationships = new HashSet<>(getRelationshipsInHierarchy(includeField));
549549

550-
Set<RelationshipDescription> processedRelationships = new HashSet<>();
550+
Set<NodeDescription<?>> visitedNodes = new HashSet<>();
551551
for (RelationshipDescription relationship : relationships) {
552552
PropertyFilter.RelaxedPropertyPath relaxedPropertyPath = PropertyFilter.RelaxedPropertyPath.withRootType(this.getUnderlyingClass());
553553
if (!filterProperties(includeField, relationship, relaxedPropertyPath)) {
554554
continue;
555555
}
556-
if (processedRelationships.contains(relationship)) {
556+
// We don't look at the direction because we need to look for cycles based on the modelled relationship
557+
// direction instead of the "real graph" directions
558+
NodeDescription<?> targetNode = relationship.getTarget();
559+
if (visitedNodes.contains(targetNode)) {
557560
return true;
558561
}
559-
processedRelationships.add(relationship);
562+
visitedNodes.add(targetNode);
560563
String relationshipPropertiesPrefix = relationship.hasRelationshipProperties() ? "." + ((Neo4jPersistentEntity<?>) relationship.getRelationshipPropertiesEntity())
561564
.getPersistentProperty(TargetNode.class).getFieldName() : "";
562-
if (calculatePossibleCircles(relationship.getTarget(), processedRelationships, includeField, relaxedPropertyPath.append(relationship.getFieldName() + relationshipPropertiesPrefix))) {
565+
if (calculatePossibleCircles(targetNode, new HashSet<>(visitedNodes), includeField, relaxedPropertyPath.append(relationship.getFieldName() + relationshipPropertiesPrefix))) {
563566
return true;
564567
}
565568
}
566569
return false;
567570
}
568571

569-
private boolean calculatePossibleCircles(NodeDescription<?> nodeDescription, Set<RelationshipDescription> processedRelationships, Predicate<PropertyFilter.RelaxedPropertyPath> includeField, PropertyFilter.RelaxedPropertyPath path) {
572+
private boolean calculatePossibleCircles(NodeDescription<?> nodeDescription, Set<NodeDescription<?>> visitedNodes, Predicate<PropertyFilter.RelaxedPropertyPath> includeField, PropertyFilter.RelaxedPropertyPath path) {
570573
Collection<RelationshipDescription> relationships = ((DefaultNeo4jPersistentEntity<?>) nodeDescription).getRelationshipsInHierarchy(includeField, path);
571574

572575
for (RelationshipDescription relationship : relationships) {
573-
if (processedRelationships.contains(relationship)) {
576+
NodeDescription<?> targetNode = relationship.getTarget();
577+
if (visitedNodes.contains(targetNode)) {
574578
return true;
575579
}
576-
processedRelationships.add(relationship);
577-
if (calculatePossibleCircles(relationship.getTarget(), processedRelationships, includeField, path.append(relationship.getFieldName()))) {
580+
visitedNodes.add(targetNode);
581+
if (calculatePossibleCircles(targetNode, new HashSet<>(visitedNodes), includeField, path.append(relationship.getFieldName()))) {
578582
return true;
579583
}
580584
}

0 commit comments

Comments
 (0)