Skip to content

Commit b2744f0

Browse files
committed
GH-2819 - Improve parent type detection in result record.
Closes #2819
1 parent 6b59e4b commit b2744f0

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

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

+20-20
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ private <ET> ET map(MapAccessor queryResult, MapAccessor allValues, Neo4jPersist
302302
return map(queryResult, nodeDescription, nodeDescription, null, null, relationshipsFromResult, nodesFromResult);
303303
}
304304

305+
@SuppressWarnings("unchecked")
305306
private <ET> ET map(MapAccessor queryResult, Neo4jPersistentEntity<ET> nodeDescription, NodeDescription<?> genericTargetNodeDescription,
306307
@Nullable Object lastMappedEntity, @Nullable RelationshipDescription relationshipDescription, Collection<Relationship> relationshipsFromResult, Collection<Node> nodesFromResult) {
307308

@@ -324,7 +325,7 @@ private <ET> ET map(MapAccessor queryResult, Neo4jPersistentEntity<ET> nodeDescr
324325

325326
knownObjects.removeFromInCreation(internalId);
326327

327-
populateProperties(queryResult, nodeDescription, internalId, instance, lastMappedEntity, relationshipsFromResult, nodesFromResult, false);
328+
populateProperties(queryResult, (Neo4jPersistentEntity<ET>) genericTargetNodeDescription, nodeDescription, internalId, instance, lastMappedEntity, relationshipsFromResult, nodesFromResult, false);
328329

329330
PersistentPropertyAccessor<ET> propertyAccessor = concreteNodeDescription.getPropertyAccessor(instance);
330331
ET bean = propertyAccessor.getBean();
@@ -349,19 +350,19 @@ private <ET> ET map(MapAccessor queryResult, Neo4jPersistentEntity<ET> nodeDescr
349350
// AND (!!!)
350351
// 2. mutable target types
351352
// because we cannot just create new instances
352-
populateProperties(queryResult, nodeDescription, internalId, mappedObject, lastMappedEntity, relationshipsFromResult, nodesFromResult, true);
353+
populateProperties(queryResult, (Neo4jPersistentEntity<ET>) genericTargetNodeDescription, nodeDescription, internalId, mappedObject, lastMappedEntity, relationshipsFromResult, nodesFromResult, true);
353354
}
354355
return mappedObject;
355356
}
356357

357358

358-
private <ET> void populateProperties(MapAccessor queryResult, Neo4jPersistentEntity<ET> nodeDescription, String internalId,
359+
private <ET> void populateProperties(MapAccessor queryResult, Neo4jPersistentEntity<ET> baseNodeDescription, Neo4jPersistentEntity<ET> moreConcreteNodeDescription, String internalId,
359360
ET mappedObject, @Nullable Object lastMappedEntity,
360361
Collection<Relationship> relationshipsFromResult, Collection<Node> nodesFromResult, boolean objectAlreadyMapped) {
361362

362-
List<String> allLabels = getLabels(queryResult, nodeDescription);
363+
List<String> allLabels = getLabels(queryResult, moreConcreteNodeDescription);
363364
NodeDescriptionAndLabels nodeDescriptionAndLabels = nodeDescriptionStore
364-
.deriveConcreteNodeDescription(nodeDescription, allLabels);
365+
.deriveConcreteNodeDescription(moreConcreteNodeDescription, allLabels);
365366

366367
@SuppressWarnings("unchecked")
367368
Neo4jPersistentEntity<ET> concreteNodeDescription = (Neo4jPersistentEntity<ET>) nodeDescriptionAndLabels
@@ -389,7 +390,7 @@ private <ET> void populateProperties(MapAccessor queryResult, Neo4jPersistentEnt
389390
knownObjects.storeObject(internalId, mappedObject);
390391

391392
AssociationHandlerSupport.of(concreteNodeDescription).doWithAssociations(
392-
populateFrom(queryResult, nodeDescription, propertyAccessor, isConstructorParameter, objectAlreadyMapped, relationshipsFromResult, nodesFromResult));
393+
populateFrom(queryResult, baseNodeDescription, propertyAccessor, isConstructorParameter, objectAlreadyMapped, relationshipsFromResult, nodesFromResult));
393394
}
394395

395396
@Nullable
@@ -488,12 +489,12 @@ public <T> T getParameterValue(Parameter<T, Neo4jPersistentProperty> parameter)
488489
// If we cannot find any value it does not mean that there isn't any.
489490
// The result set might contain associations not named CONCRETE_TYPE_TARGET but ABSTRACT_TYPE_TARGET.
490491
// For this we bubble up the hierarchy of NodeDescriptions.
491-
result = createInstanceOfRelationships(matchingProperty, values, relationshipDescription, nodeDescription, genericNodeDescription, relationshipsFromResult, nodesFromResult)
492+
result = createInstanceOfRelationships(matchingProperty, values, relationshipDescription, genericNodeDescription, relationshipsFromResult, nodesFromResult)
492493
.orElseGet(() -> {
493494
NodeDescription<?> parentNodeDescription = nodeDescription.getParentNodeDescription();
494495
T resultValue = null;
495496
while (parentNodeDescription != null) {
496-
Optional<Object> value = createInstanceOfRelationships(matchingProperty, values, relationshipDescription, parentNodeDescription, parentNodeDescription, relationshipsFromResult, nodesFromResult);
497+
Optional<Object> value = createInstanceOfRelationships(matchingProperty, values, relationshipDescription, parentNodeDescription, relationshipsFromResult, nodesFromResult);
497498
if (value.isPresent()) {
498499
resultValue = (T) value.get();
499500
break;
@@ -586,7 +587,7 @@ private AssociationHandler<Neo4jPersistentProperty> populateFrom(MapAccessor que
586587
&& propertyValueNotNull;
587588

588589
if (populatedCollection) {
589-
createInstanceOfRelationships(persistentProperty, queryResult, (RelationshipDescription) association, baseDescription, baseDescription, relationshipsFromResult, nodesFromResult, false)
590+
createInstanceOfRelationships(persistentProperty, queryResult, (RelationshipDescription) association, baseDescription, relationshipsFromResult, nodesFromResult, false)
590591
.ifPresent(value -> {
591592
Collection<?> providedCollection = (Collection<?>) value;
592593
Collection<?> existingValue = (Collection<?>) propertyValue;
@@ -609,7 +610,7 @@ private AssociationHandler<Neo4jPersistentProperty> populateFrom(MapAccessor que
609610
return;
610611
}
611612

612-
createInstanceOfRelationships(persistentProperty, queryResult, (RelationshipDescription) association, baseDescription, baseDescription, relationshipsFromResult, nodesFromResult)
613+
createInstanceOfRelationships(persistentProperty, queryResult, (RelationshipDescription) association, baseDescription, relationshipsFromResult, nodesFromResult)
613614
.ifPresent(value -> propertyAccessor.setProperty(persistentProperty, value));
614615
};
615616
}
@@ -633,13 +634,13 @@ private void mergeCollections(RelationshipDescription relationshipDescription, C
633634
}
634635

635636
private Optional<Object> createInstanceOfRelationships(Neo4jPersistentProperty persistentProperty, MapAccessor values,
636-
RelationshipDescription relationshipDescription, NodeDescription<?> baseDescription, NodeDescription<?> genericNodeDescription, Collection<Relationship> relationshipsFromResult,
637+
RelationshipDescription relationshipDescription, NodeDescription<?> baseDescription, Collection<Relationship> relationshipsFromResult,
637638
Collection<Node> nodesFromResult) {
638-
return createInstanceOfRelationships(persistentProperty, values, relationshipDescription, baseDescription, genericNodeDescription, relationshipsFromResult, nodesFromResult, true);
639+
return createInstanceOfRelationships(persistentProperty, values, relationshipDescription, baseDescription, relationshipsFromResult, nodesFromResult, true);
639640
}
640641

641642
private Optional<Object> createInstanceOfRelationships(Neo4jPersistentProperty persistentProperty, MapAccessor values,
642-
RelationshipDescription relationshipDescription, NodeDescription<?> baseDescription, NodeDescription<?> genericNodeDescription, Collection<Relationship> relationshipsFromResult,
643+
RelationshipDescription relationshipDescription, NodeDescription<?> baseDescription, Collection<Relationship> relationshipsFromResult,
643644
Collection<Node> nodesFromResult, boolean fetchMore) {
644645

645646
String typeOfRelationship = relationshipDescription.getType();
@@ -673,8 +674,7 @@ private Optional<Object> createInstanceOfRelationships(Neo4jPersistentProperty p
673674
mappedObjectHandler = (type, mappedObject) -> value.add(mappedObject);
674675
}
675676

676-
String collectionName = relationshipDescription.generateRelatedNodesCollectionName(genericNodeDescription);
677-
677+
String collectionName = relationshipDescription.generateRelatedNodesCollectionName(baseDescription);
678678
Value list = values.get(collectionName);
679679

680680
List<Object> relationshipsAndProperties = new ArrayList<>();
@@ -720,12 +720,12 @@ private Optional<Object> createInstanceOfRelationships(Neo4jPersistentProperty p
720720
if (fetchMore) {
721721
mappedObject = sourceNodeId != null && sourceNodeId.equals(targetNodeId)
722722
? knownObjects.getObject("N" + sourceNodeId)
723-
: map(possibleValueNode, concreteTargetNodeDescription, genericNodeDescription, null, null, relationshipsFromResult, nodesFromResult);
723+
: map(possibleValueNode, concreteTargetNodeDescription, baseDescription, null, null, relationshipsFromResult, nodesFromResult);
724724
} else {
725725
Object objectFromStore = knownObjects.getObject("N" + targetNodeId);
726726
mappedObject = objectFromStore != null
727727
? objectFromStore
728-
: map(possibleValueNode, concreteTargetNodeDescription, genericNodeDescription, null, null, relationshipsFromResult, nodesFromResult);
728+
: map(possibleValueNode, concreteTargetNodeDescription, baseDescription, null, null, relationshipsFromResult, nodesFromResult);
729729
}
730730

731731
if (relationshipDescription.hasRelationshipProperties()) {
@@ -757,16 +757,16 @@ private Optional<Object> createInstanceOfRelationships(Neo4jPersistentProperty p
757757

758758
Object valueEntry;
759759
if (fetchMore) {
760-
valueEntry = map(relatedEntity, concreteTargetNodeDescription, genericNodeDescription, null, null, relationshipsFromResult, nodesFromResult);
760+
valueEntry = map(relatedEntity, concreteTargetNodeDescription, genericTargetNodeDescription, null, null, relationshipsFromResult, nodesFromResult);
761761
} else {
762762
Object objectFromStore = knownObjects.getObject(getInternalId(relatedEntity, null));
763763
valueEntry = objectFromStore != null
764764
? objectFromStore
765-
: map(relatedEntity, concreteTargetNodeDescription, genericNodeDescription, null, null, relationshipsFromResult, nodesFromResult);
765+
: map(relatedEntity, concreteTargetNodeDescription, genericTargetNodeDescription, null, null, relationshipsFromResult, nodesFromResult);
766766
}
767767

768768
if (relationshipDescription.hasRelationshipProperties()) {
769-
String sourceLabel = relationshipDescription.getSource().getMostAbstractParentLabel(genericNodeDescription);
769+
String sourceLabel = relationshipDescription.getSource().getMostAbstractParentLabel(baseDescription);
770770
String relationshipSymbolicName = sourceLabel
771771
+ RelationshipDescription.NAME_OF_RELATIONSHIP + targetLabel;
772772
Relationship relatedEntityRelationship = relatedEntity.get(relationshipSymbolicName)

0 commit comments

Comments
 (0)