This is an automated email from the ASF dual-hosted git repository. madhan pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/atlas.git
commit fe5fa7f56e2d9872a199dbb872b642e74ae33bef Author: Ashutosh Mestry <[email protected]> AuthorDate: Mon May 4 18:46:17 2020 -0700 ATLAS-3762: Improve edge creation using genuine iterator. Part 2 (cherry picked from commit 23aea76fff6c8f530816319649218583f4dfd091) --- .../atlas/repository/graphdb/AtlasGraph.java | 13 +++++++++-- .../repository/graphdb/janus/AtlasJanusGraph.java | 11 ++++++++++ .../apache/atlas/repository/graph/GraphHelper.java | 20 +++++++++-------- .../store/graph/v2/AtlasRelationshipStoreV2.java | 25 +--------------------- 4 files changed, 34 insertions(+), 35 deletions(-) diff --git a/graphdb/api/src/main/java/org/apache/atlas/repository/graphdb/AtlasGraph.java b/graphdb/api/src/main/java/org/apache/atlas/repository/graphdb/AtlasGraph.java index 7bd5f2d..c016f63 100644 --- a/graphdb/api/src/main/java/org/apache/atlas/repository/graphdb/AtlasGraph.java +++ b/graphdb/api/src/main/java/org/apache/atlas/repository/graphdb/AtlasGraph.java @@ -48,10 +48,19 @@ public interface AtlasGraph<V, E> { AtlasEdge<V, E> addEdge(AtlasVertex<V, E> outVertex, AtlasVertex<V, E> inVertex, String label); /** - * Adds a vertex to the graph. - * + * Fetch edges between two vertices using relationshipLabel + * @param fromVertex + * @param toVertex + * @param relationshipLabel * @return */ + AtlasEdge<V, E> getEdgeBetweenVertices(AtlasVertex fromVertex, AtlasVertex toVertex, String relationshipLabel); + + /** + * Adds a vertex to the graph. + * + * @return + */ AtlasVertex<V, E> addVertex(); /** diff --git a/graphdb/janus/src/main/java/org/apache/atlas/repository/graphdb/janus/AtlasJanusGraph.java b/graphdb/janus/src/main/java/org/apache/atlas/repository/graphdb/janus/AtlasJanusGraph.java index a30dbc7..35274c9 100644 --- a/graphdb/janus/src/main/java/org/apache/atlas/repository/graphdb/janus/AtlasJanusGraph.java +++ b/graphdb/janus/src/main/java/org/apache/atlas/repository/graphdb/janus/AtlasJanusGraph.java @@ -172,6 +172,17 @@ public class AtlasJanusGraph implements AtlasGraph<AtlasJanusVertex, AtlasJanusE } @Override + public AtlasEdge getEdgeBetweenVertices(AtlasVertex fromVertex, AtlasVertex toVertex, String edgeLabel) { + GraphTraversal gt = V(fromVertex.getId()).outE(edgeLabel).where(__.otherV().hasId(toVertex.getId())); + Object o = gt.hasNext() ? gt.next() : null; + if (o == null) { + return null; + } + + return GraphDbObjectFactory.createEdge(this, (Edge) o); + } + + @Override public AtlasEdge<AtlasJanusVertex, AtlasJanusEdge> getEdge(String edgeId) { Iterator<Edge> it = getGraph().edges(edgeId); Edge e = getSingleElement(it, edgeId); diff --git a/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java b/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java index b9e3a5e..b1368e5 100755 --- a/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java +++ b/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java @@ -739,19 +739,21 @@ public final class GraphHelper { public static List<AtlasVertex> getPropagationEnabledClassificationVertices(AtlasVertex entityVertex) { List<AtlasVertex> ret = new ArrayList<>(); - Iterable edges = entityVertex.query().direction(AtlasEdgeDirection.OUT).label(CLASSIFICATION_LABEL).edges(); + if (entityVertex.hasEdges(AtlasEdgeDirection.OUT, CLASSIFICATION_LABEL)) { + Iterable edges = entityVertex.query().direction(AtlasEdgeDirection.OUT).label(CLASSIFICATION_LABEL).edges(); - if (edges != null) { - Iterator<AtlasEdge> iterator = edges.iterator(); + if (edges != null) { + Iterator<AtlasEdge> iterator = edges.iterator(); - while (iterator.hasNext()) { - AtlasEdge edge = iterator.next(); + while (iterator.hasNext()) { + AtlasEdge edge = iterator.next(); - if (edge != null) { - AtlasVertex classificationVertex = edge.getInVertex(); + if (edge != null) { + AtlasVertex classificationVertex = edge.getInVertex(); - if (isPropagationEnabled(classificationVertex)) { - ret.add(classificationVertex); + if (isPropagationEnabled(classificationVertex)) { + ret.add(classificationVertex); + } } } } diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasRelationshipStoreV2.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasRelationshipStoreV2.java index ab431bc..8d74489 100644 --- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasRelationshipStoreV2.java +++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasRelationshipStoreV2.java @@ -784,36 +784,13 @@ public class AtlasRelationshipStoreV2 implements AtlasRelationshipStore { AtlasEdge ret = null; if (toVertex.hasEdges(AtlasEdgeDirection.IN, relationshipLabel) && fromVertex.hasEdges(AtlasEdgeDirection.OUT, relationshipLabel)) { - long fromVertexOutgoingEdgeCount = graphHelper.getOutGoingEdgesCountByLabel(fromVertex, relationshipLabel); - long toVertexIncomingEdgeCount = graphHelper.getInComingEdgesCountByLabel(toVertex, relationshipLabel); - if (toVertexIncomingEdgeCount < fromVertexOutgoingEdgeCount) { - Iterator<AtlasEdge> edgesIteratorIn = graphHelper.getIncomingEdgesByLabel(toVertex, relationshipLabel); - ret = getActiveEdgeFromList(edgesIteratorIn, fromVertex.getId(), e -> e.getOutVertex().getId()); - } else { - Iterator<AtlasEdge> edgesIteratorOut = graphHelper.getOutGoingEdgesByLabel(fromVertex, relationshipLabel); - ret = getActiveEdgeFromList(edgesIteratorOut, toVertex.getId(), e -> e.getInVertex().getId()); - } + ret = graph.getEdgeBetweenVertices(fromVertex, toVertex, relationshipLabel); } RequestContext.get().endMetricRecord(metric); return ret; } - private AtlasEdge getActiveEdgeFromList(Iterator<AtlasEdge> edgesIterator, Object vertexIdToCompare, Function<AtlasEdge, Object> edgeIdFn) { - while (edgesIterator != null && edgesIterator.hasNext()) { - AtlasEdge edge = edgesIterator.next(); - if (edge != null) { - Status status = graphHelper.getStatus(edge); - - if ((status == null || status == ACTIVE) && edgeIdFn.apply(edge).equals(vertexIdToCompare)) { - return edge; - } - } - } - - return null; - } - private Long getRelationshipVersion(AtlasRelationship relationship) { Long ret = relationship != null ? relationship.getVersion() : null;
