in repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerV1.java [243:358]
public Collection<GraphHelper.VertexInfo> getOwnedVertices(AtlasVertex entityVertex) throws AtlasBaseException {
final Map<String, GraphHelper.VertexInfo> vertexInfoMap = new HashMap<>();
final Stack<AtlasVertex> vertices = new Stack<>();
final boolean isPurgeRequested = RequestContext.get().isPurgeRequested();
vertices.push(entityVertex);
while (!vertices.isEmpty()) {
AtlasVertex vertex = vertices.pop();
AtlasEntity.Status state = getState(vertex);
//In case of purge If the reference vertex is active then skip it or else
//If the vertex marked for deletion, skip it
if (state == (isPurgeRequested ? ACTIVE : DELETED)) {
continue;
}
String guid = GraphHelper.getGuid(vertex);
if (vertexInfoMap.containsKey(guid)) {
continue;
}
AtlasEntityHeader entity = entityRetriever.toAtlasEntityHeader(vertex);
String typeName = entity.getTypeName();
AtlasEntityType entityType = typeRegistry.getEntityTypeByName(typeName);
if (entityType == null) {
throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID, TypeCategory.ENTITY.name(), typeName);
}
vertexInfoMap.put(guid, new GraphHelper.VertexInfo(entity, vertex));
for (AtlasStructType.AtlasAttribute attributeInfo : entityType.getOwnedRefAttributes()) {
String edgeLabel = attributeInfo.getRelationshipEdgeLabel();
AtlasType attrType = attributeInfo.getAttributeType();
TypeCategory typeCategory = attrType.getTypeCategory();
if (typeCategory == OBJECT_ID_TYPE) {
if (attributeInfo.getAttributeDef().isSoftReferenced()) {
String softRefVal = vertex.getProperty(attributeInfo.getVertexPropertyName(), String.class);
AtlasObjectId refObjId = AtlasEntityUtil.parseSoftRefValue(softRefVal);
AtlasVertex refVertex = refObjId != null ? AtlasGraphUtilsV2.findByGuid(this.graphHelper.getGraph(), refObjId.getGuid()) : null;
if (refVertex != null) {
vertices.push(refVertex);
}
} else {
AtlasEdge edge = graphHelper.getEdgeForLabel(vertex, edgeLabel);
if (edge == null || (getState(edge) == (isPurgeRequested ? ACTIVE : DELETED))) {
continue;
}
vertices.push(edge.getInVertex());
}
} else if (typeCategory == ARRAY || typeCategory == MAP) {
TypeCategory elementType = null;
if (typeCategory == ARRAY) {
elementType = ((AtlasArrayType) attrType).getElementType().getTypeCategory();
} else if (typeCategory == MAP) {
elementType = ((AtlasMapType) attrType).getValueType().getTypeCategory();
}
if (elementType != OBJECT_ID_TYPE) {
continue;
}
if (attributeInfo.getAttributeDef().isSoftReferenced()) {
if (typeCategory == ARRAY) {
List softRefVal = vertex.getListProperty(attributeInfo.getVertexPropertyName(), List.class);
List<AtlasObjectId> refObjIds = AtlasEntityUtil.parseSoftRefValue(softRefVal);
if (CollectionUtils.isNotEmpty(refObjIds)) {
for (AtlasObjectId refObjId : refObjIds) {
AtlasVertex refVertex = AtlasGraphUtilsV2.findByGuid(this.graphHelper.getGraph(), refObjId.getGuid());
if (refVertex != null) {
vertices.push(refVertex);
}
}
}
} else if (typeCategory == MAP) {
Map softRefVal = vertex.getProperty(attributeInfo.getVertexPropertyName(), Map.class);
Map<String, AtlasObjectId> refObjIds = AtlasEntityUtil.parseSoftRefValue(softRefVal);
if (MapUtils.isNotEmpty(refObjIds)) {
for (AtlasObjectId refObjId : refObjIds.values()) {
AtlasVertex refVertex = AtlasGraphUtilsV2.findByGuid(this.graphHelper.getGraph(), refObjId.getGuid());
if (refVertex != null) {
vertices.push(refVertex);
}
}
}
}
} else {
List<AtlasEdge> edges = getCollectionElementsUsingRelationship(vertex, attributeInfo);
if (CollectionUtils.isNotEmpty(edges)) {
for (AtlasEdge edge : edges) {
if (edge == null || (getState(edge) == (isPurgeRequested ? ACTIVE : DELETED))) {
continue;
}
vertices.push(edge.getInVertex());
}
}
}
}
}
}
return vertexInfoMap.values();
}