pinal-shah commented on code in PR #478:
URL: https://github.com/apache/atlas/pull/478#discussion_r3072531414
##########
repository/src/main/java/org/apache/atlas/repository/store/graph/v2/EntityGraphMapper.java:
##########
@@ -1533,6 +1532,98 @@ private void mapRelationshipAttributes(AtlasEntity
entity, AtlasEntityType entit
LOG.debug("<== mapRelationshipAttributes({}, {})", op,
entity.getTypeName());
}
+ private void mapRelationshipAttributeWithMultipleTypes(AtlasEntity entity,
AtlasEntityType entityType, String attrName, Object attrValue, AtlasVertex
vertex, EntityOperation op, EntityMutationContext context) throws
AtlasBaseException {
+ LOG.debug("==> mapRelationshipAttributeWithMultipleTypes({}, {})",
attrName, entity.getTypeName());
+ Set<String> relationshipTypeNames =
entityType.getAttributeRelationshipTypes(attrName);
+
+ if (CollectionUtils.isEmpty(relationshipTypeNames)) {
+ // Fallback to single relationship type processing
+ String relationType =
AtlasEntityUtil.getRelationshipType(attrValue);
+ AtlasAttribute attribute =
entityType.getRelationshipAttribute(attrName, relationType);
+ mapAttribute(attribute, attrValue, vertex, op, context);
+
+ return;
+ }
+
+ if (attrValue instanceof Collection) {
+ Collection<?> relatedObjects = (Collection<?>) attrValue;
+
+ // Group related objects by their appropriate relationship type
+ // e.g., hive_table elements should use hive_table_db
relationship, iceberg_table elements should use iceberg_table_db
+ Map<String, List<Object>> elementsByRelationshipType =
groupElementsByRelationshipType(
+ relatedObjects, attrName, relationshipTypeNames);
+
+ // Process each relationship type with its filtered elements
+ for (Map.Entry<String, List<Object>> entry :
elementsByRelationshipType.entrySet()) {
+ String relationshipTypeName = entry.getKey();
+ List<Object> filteredElements = entry.getValue();
+
+ AtlasAttribute attribute =
entityType.getRelationshipAttribute(attrName, relationshipTypeName);
+
+ if (attribute != null &&
CollectionUtils.isNotEmpty(filteredElements)) {
+ // Use the same collection type as the original (List or
Set)
+ Object filteredValue =
createCollectionOfSameType(attrValue, filteredElements);
+
+ LOG.debug("Processing relationship type {} for attribute
{} with {} elements",
+ relationshipTypeName, attrName,
filteredElements.size());
+
+ mapAttribute(attribute, filteredValue, vertex, op,
context);
+ }
+ }
+ } else {
+ // Single element - prefer explicit relationship type from the
value
+ String appropriateRelType =
AtlasEntityUtil.getRelationshipType(attrValue);
+ AtlasAttribute attribute =
entityType.getRelationshipAttribute(attrName, appropriateRelType);
+ mapAttribute(attribute, attrValue, vertex, op, context);
+ }
+
+ LOG.debug("<== mapRelationshipAttributeWithMultipleTypes({}, {})",
attrName, entity.getTypeName());
+ }
+
+ private Map<String, List<Object>>
groupElementsByRelationshipType(Collection<?> relatedObjects,
+ String attrName,
+ Set<String> relationshipTypeNames) {
+ Map<String, List<Object>> elementsByRelationshipType = new HashMap<>();
+
+ // Group related objects by their appropriate relationship type
+ for (Object element : relatedObjects) {
+ // Prefer the explicit relationship type encoded in the element,
if any
+ String appropriateRelType =
AtlasEntityUtil.getRelationshipType(element);
+
+ if (StringUtils.isEmpty(appropriateRelType)) {
Review Comment:
#1593 - #1609
```
if (StringUtils.isEmpty(relationshipType) ||
!relationshipTypeNames.contains(relationshipType)) {
continue;
}
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]