Commit b445a1d2 by Sarath Subramanian

ATLAS-1984: Use AtlasRelatedObjectId to refer to relationship attributes during…

ATLAS-1984: Use AtlasRelatedObjectId to refer to relationship attributes during entity create/update
parent 2f6d7b24
......@@ -85,6 +85,12 @@ public class AtlasRelationship extends AtlasStruct implements Serializable {
init(nextInternalId(), end1, end2, null, null, null, null, null, null, 0L);
}
public AtlasRelationship(String typeName, AtlasObjectId end1, AtlasObjectId end2, Map<String, Object> attributes) {
super(typeName, attributes);
init(nextInternalId(), end1, end2, null, null, null, null, null, null, 0L);
}
public AtlasRelationship(String typeName, String attrName, Object attrValue) {
super(typeName, attrName, attrValue);
......
......@@ -126,6 +126,14 @@ public class AtlasStruct implements Serializable {
}
}
public void removeAttribute(String name) {
Map<String, Object> a = this.attributes;
if (a != null && a.containsKey(name)) {
a.remove(name);
}
}
public StringBuilder toString(StringBuilder sb) {
if (sb == null) {
sb = new StringBuilder();
......
......@@ -19,6 +19,7 @@ package org.apache.atlas.type;
import org.apache.atlas.AtlasErrorCode;
import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.model.instance.AtlasEntity;
import org.apache.atlas.model.instance.AtlasStruct;
import org.apache.atlas.model.typedef.AtlasStructDef;
import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
......@@ -330,13 +331,24 @@ public class AtlasStructType extends AtlasType {
if (value != null) {
ret = dataType.validateValue(value, fieldName, messages) && ret;
} else if (!attributeDef.getIsOptional()) {
// if required attribute is null, check if attribute value specified in relationship
if (structObj instanceof AtlasEntity) {
AtlasEntity entityObj = (AtlasEntity) structObj;
if (entityObj.getRelationshipAttribute(attrName) == null) {
ret = false;
messages.add(fieldName + ": mandatory attribute value missing in type " + getTypeName());
}
} else {
ret = false;
messages.add(fieldName + ": mandatory attribute value missing in type " + getTypeName());
}
}
}
}
} else if (obj instanceof Map) {
Map attributes = AtlasTypeUtil.toStructAttributes((Map)obj);
Map relationshipAttributes = AtlasTypeUtil.toRelationshipAttributes((Map)obj);
for (AtlasAttributeDef attributeDef : structDef.getAttributeDefs()) {
String attrName = attributeDef.getName();
......@@ -350,11 +362,14 @@ public class AtlasStructType extends AtlasType {
if (value != null) {
ret = dataType.validateValue(value, fieldName, messages) && ret;
} else if (!attributeDef.getIsOptional()) {
// if required attribute is null, check if attribute value specified in relationship
if (MapUtils.isEmpty(relationshipAttributes) || !relationshipAttributes.containsKey(attrName)) {
ret = false;
messages.add(fieldName + ": mandatory attribute value missing in type " + getTypeName());
}
}
}
}
} else {
ret = false;
messages.add(objName + "=" + obj + ": invalid value for type " + getTypeName());
......
......@@ -316,11 +316,13 @@ public class AtlasTypeUtil {
}
public static Map toRelationshipAttributes(Map map) {
Map ret = null;
if (map != null && map.containsKey("typeName") && map.containsKey("relationshipAttributes") && map.get("relationshipAttributes") instanceof Map) {
return (Map)map.get("relationshipAttributes");
ret = (Map) map.get("relationshipAttributes");
}
return map;
return ret;
}
public static AtlasObjectId getAtlasObjectId(AtlasEntity entity) {
......
......@@ -301,21 +301,38 @@ public class AtlasEntityGraphDiscoveryV1 implements EntityGraphDiscovery {
visitStruct(structType, struct);
}
void visitStruct(AtlasStructType structType, AtlasStruct struct) throws AtlasBaseException {
for (AtlasAttribute attribute : structType.getAllAttributes().values()) {
void visitEntity(AtlasEntityType entityType, AtlasEntity entity) throws AtlasBaseException {
List<String> visitedAttributes = new ArrayList<>();
// visit relationship attributes
for (AtlasAttribute attribute : entityType.getRelationshipAttributes().values()) {
AtlasType attrType = attribute.getAttributeType();
Object attrVal = struct.getAttribute(attribute.getName());
String attrName = attribute.getName();
Object attrVal = entity.getRelationshipAttribute(attrName);
if (entity.hasRelationshipAttribute(attrName)) {
visitAttribute(attrType, attrVal);
visitedAttributes.add(attrName);
}
}
void visitEntity(AtlasEntityType entityType, AtlasEntity entity) throws AtlasBaseException {
visitStruct(entityType, entity);
// visit struct attributes
for (AtlasAttribute attribute : entityType.getAllAttributes().values()) {
AtlasType attrType = attribute.getAttributeType();
String attrName = attribute.getName();
Object attrVal = entity.getAttribute(attrName);
for (AtlasAttribute attribute : entityType.getRelationshipAttributes().values()) {
if (entity.hasAttribute(attrName) && !visitedAttributes.contains(attrName)) {
visitAttribute(attrType, attrVal);
}
}
}
void visitStruct(AtlasStructType structType, AtlasStruct struct) throws AtlasBaseException {
for (AtlasAttribute attribute : structType.getAllAttributes().values()) {
AtlasType attrType = attribute.getAttributeType();
Object attrVal = entity.getRelationshipAttribute(attribute.getName());
Object attrVal = struct.getAttribute(attribute.getName());
visitAttribute(attrType, attrVal);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment