ATLAS-1943: Fix IT failure due to incorrect inverse reference check using relationship
Signed-off-by: Madhan Neethiraj <madhan@apache.org>
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasRelationshipStore.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasRelationshipStore.java
index 341711a..8043760 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasRelationshipStore.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasRelationshipStore.java
@@ -46,6 +46,13 @@
AtlasRelationship getById(String guid) throws AtlasBaseException;
/**
+ * Retrieve a relationship if it exists or creates a new relationship instance.
+ * @param relationship relationship instance definition
+ * @return AtlasRelationship
+ */
+ AtlasRelationship getOrCreate(AtlasRelationship relationship) throws AtlasBaseException;
+
+ /**
* Delete a relationship instance using guid.
* @param guid relationship instance guid
*/
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasRelationshipStoreV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasRelationshipStoreV1.java
index 8d9e4be..3ff6fbe 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasRelationshipStoreV1.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasRelationshipStoreV1.java
@@ -117,6 +117,31 @@
@Override
@GraphTransaction
+ public AtlasRelationship getOrCreate(AtlasRelationship relationship) throws AtlasBaseException {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("==> getOrCreate({})", relationship);
+ }
+
+ validateRelationship(relationship);
+
+ AtlasVertex end1Vertex = getVertexFromEndPoint(relationship.getEnd1());
+ AtlasVertex end2Vertex = getVertexFromEndPoint(relationship.getEnd2());
+ AtlasRelationship ret;
+
+ // check if relationship exists
+ AtlasEdge relationshipEdge = getRelationshipEdge(end1Vertex, end2Vertex, relationship);
+
+ ret = (relationshipEdge != null) ? mapEdgeToAtlasRelationship(relationshipEdge) : create(relationship);
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("<== getOrCreate({}): {}", relationship, ret);
+ }
+
+ return ret;
+ }
+
+ @Override
+ @GraphTransaction
public AtlasRelationship update(AtlasRelationship relationship) throws AtlasBaseException {
if (LOG.isDebugEnabled()) {
LOG.debug("==> update({})", relationship);
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java
index d5c1e86..68f8370 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java
@@ -422,7 +422,9 @@
AtlasEntityType entityType = (AtlasEntityType) inverseAttributeType;
if (entityType.hasRelationshipAttribute(inverseAttributeName)) {
- ret = createRelationship(inverseVertex, vertex, inverseAttribute.getRelationshipEdgeLabel());
+ String relationshipName = graphHelper.getRelationshipDefName(inverseVertex, entityType, inverseAttributeName);
+
+ ret = getOrCreateRelationship(inverseVertex, vertex, relationshipName);
} else {
if (LOG.isDebugEnabled()) {
@@ -584,7 +586,7 @@
} else {
String relationshipName = graphHelper.getRelationshipDefName(entityVertex, entityType, attributeName);
- ret = createRelationship(entityVertex, attributeVertex, relationshipName);
+ ret = getOrCreateRelationship(entityVertex, attributeVertex, relationshipName);
}
} else {
@@ -951,7 +953,7 @@
relationshipName = currentEdge.getLabel();
}
- ret = createRelationship(currentEdge.getOutVertex(), entityVertex, relationshipName);
+ ret = getOrCreateRelationship(currentEdge.getOutVertex(), entityVertex, relationshipName);
}
return ret;
@@ -1180,11 +1182,11 @@
}
}
- private AtlasEdge createRelationship(AtlasVertex end1Vertex, AtlasVertex end2Vertex, String relationshipName) throws AtlasBaseException {
+ private AtlasEdge getOrCreateRelationship(AtlasVertex end1Vertex, AtlasVertex end2Vertex, String relationshipName) throws AtlasBaseException {
AtlasEdge ret = null;
AtlasObjectId end1 = new AtlasObjectId(AtlasGraphUtilsV1.getIdFromVertex(end1Vertex), AtlasGraphUtilsV1.getTypeName(end1Vertex));
AtlasObjectId end2 = new AtlasObjectId(AtlasGraphUtilsV1.getIdFromVertex(end2Vertex), AtlasGraphUtilsV1.getTypeName(end2Vertex));
- AtlasRelationship relationship = relationshipStore.create(new AtlasRelationship(relationshipName, end1, end2));
+ AtlasRelationship relationship = relationshipStore.getOrCreate(new AtlasRelationship(relationshipName, end1, end2));
// return newly created AtlasEdge
// if multiple edges are returned, compare using id to pick the right one