sheetalshah1007 commented on code in PR #478:
URL: https://github.com/apache/atlas/pull/478#discussion_r3186099438
##########
repository/src/main/java/org/apache/atlas/repository/store/graph/v2/EntityGraphMapper.java:
##########
@@ -1533,6 +1527,88 @@ private void mapRelationshipAttributes(AtlasEntity
entity, AtlasEntityType entit
LOG.debug("<== mapRelationshipAttributes({}, {})", op,
entity.getTypeName());
}
+ private void mapRelationshipAttribute(AtlasEntity entity, AtlasEntityType
entityType, String attrName, Object attrValue, AtlasVertex vertex,
EntityOperation op, EntityMutationContext context) throws AtlasBaseException {
+ LOG.debug("==> mapRelationshipAttribute({}, {})", attrName,
entity.getTypeName());
+ Set<String> relationshipTypeNames =
entityType.getAttributeRelationshipTypes(attrName);
+
+ if (CollectionUtils.isEmpty(relationshipTypeNames)) {
+ mapRelationshipAttributeUsingInferredType(entityType, attrName,
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, delta_table elements should use delta_table_db
+ Map<String, List<Object>> elementsByRelationshipType =
groupElementsByRelationshipType(
+ relatedObjects, attrName, relationshipTypeNames);
+
+ 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 if (attrValue instanceof Map) {
+ LOG.warn("mapRelationshipAttribute: attribute {} on {}: Map-valued
relationship attribute is not supported", attrName, entity.getTypeName());
+ } else if (relationshipTypeNames.size() == 1) {
+ String onlyRelationshipType =
relationshipTypeNames.iterator().next();
+ AtlasAttribute attribute =
entityType.getRelationshipAttribute(attrName, onlyRelationshipType);
+ mapAttribute(attribute, attrValue, vertex, op, context);
+ } else {
+ mapRelationshipAttributeUsingInferredType(entityType, attrName,
attrValue, vertex, op, context);
+ }
+
+ LOG.debug("<== mapRelationshipAttribute({}, {})", attrName,
entity.getTypeName());
+ }
+
+ private void mapRelationshipAttributeUsingInferredType(AtlasEntityType
entityType, String attrName, Object attrValue, AtlasVertex vertex,
EntityOperation op, EntityMutationContext context) throws AtlasBaseException {
+ String relationType =
AtlasEntityUtil.getRelationshipType(attrValue);
+ AtlasAttribute attribute =
entityType.getRelationshipAttribute(attrName, relationType);
+ mapAttribute(attribute, attrValue, vertex, op, context);
+ }
+
+ 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) {
+ String relationshipType =
AtlasEntityUtil.getRelationshipType(element);
+
+ if (StringUtils.isEmpty(relationshipType) && relationshipTypeNames
!= null && relationshipTypeNames.size() == 1) {
Review Comment:
Done
--
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]