From 2a62c13ecfcf3fe0c22d8cd21d66d46e58105018 Mon Sep 17 00:00:00 2001 From: MichaelMorris Date: Wed, 19 May 2021 17:23:13 +0100 Subject: Support adding of relationship type to model Signed-off-by: MichaelMorris Issue-ID: SDC-3610 Change-Id: If315e21fa40e491cb1977dd9ceaf3e9b607e2f6f --- .../be/dao/janusgraph/JanusGraphGenericDao.java | 117 ++++++++++++++++++--- .../sdc/be/dao/neo4j/GraphEdgeLabels.java | 1 + .../sdc/be/dao/neo4j/GraphEdgeLabelsTest.java | 2 +- 3 files changed, 102 insertions(+), 18 deletions(-) (limited to 'catalog-dao') diff --git a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/janusgraph/JanusGraphGenericDao.java b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/janusgraph/JanusGraphGenericDao.java index 0b2a8e11b9..19f78ced24 100644 --- a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/janusgraph/JanusGraphGenericDao.java +++ b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/janusgraph/JanusGraphGenericDao.java @@ -26,9 +26,12 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.StreamSupport; import javax.validation.constraints.NotNull; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.ImmutableTriple; import org.apache.tinkerpop.gremlin.structure.Direction; @@ -51,6 +54,7 @@ import org.openecomp.sdc.be.dao.graph.datatype.GraphElementTypeEnum; import org.openecomp.sdc.be.dao.graph.datatype.GraphNode; import org.openecomp.sdc.be.dao.graph.datatype.GraphRelation; import org.openecomp.sdc.be.dao.graph.datatype.RelationEndPoint; +import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum; import org.openecomp.sdc.be.dao.neo4j.GraphEdgeLabels; import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary; import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum; @@ -313,17 +317,38 @@ public class JanusGraphGenericDao { * @return */ public Either getNode(String keyName, Object keyValue, Class clazz) { + log.debug("Try to get node for key [{}] with value [{}] ", keyName, keyValue); + Either vertexByProperty = getVertexByProperty(keyName, keyValue); + if (vertexByProperty.isLeft()) { + try { + Vertex vertex = vertexByProperty.left().value(); + Map properties = getProperties(vertex); + T node = GraphElementFactory + .createElement((String) properties.get(GraphPropertiesDictionary.LABEL.getProperty()), GraphElementTypeEnum.Node, properties, + clazz); + return Either.left(node); + } catch (Exception e) { + log.debug("Failed to get node for key [{}] with value [{}] ", keyName, keyValue, e); + return Either.right(JanusGraphClient.handleJanusGraphException(e)); + } + } else { + log.debug("Failed to get node for key [{}] with value [{}] ", keyName, keyValue, vertexByProperty.right().value()); + return Either.right(vertexByProperty.right().value()); + } + } + + public Either getNode(final String keyName, final Object keyValue, final Class clazz, final String model) { log.debug("Try to get node for key [{}] with value [{}] ", keyName, keyValue); - Either vertexByProperty = getVertexByProperty(keyName, keyValue); + final Either vertexByProperty = getVertexByPropertyForModel(keyName, keyValue, model); if (vertexByProperty.isLeft()) { try { - Vertex vertex = vertexByProperty.left().value(); - Map properties = getProperties(vertex); - T node = GraphElementFactory + final Vertex vertex = vertexByProperty.left().value(); + final Map properties = getProperties(vertex); + final T node = GraphElementFactory .createElement((String) properties.get(GraphPropertiesDictionary.LABEL.getProperty()), GraphElementTypeEnum.Node, properties, clazz); return Either.left(node); - } catch (Exception e) { + } catch (final Exception e) { log.debug("Failed to get node for key [{}] with value [{}] ", keyName, keyValue, e); return Either.right(JanusGraphClient.handleJanusGraphException(e)); } @@ -601,23 +626,48 @@ public class JanusGraphGenericDao { return Either.right(graph.right().value()); } } + + public Either getVertexByPropertyForModel(final String name, final Object value, final String model) { + final Either, JanusGraphOperationStatus> vertices = getVerticesByProperty(name, value); + + if (vertices.isLeft()) { + final Predicate filterPredicate = StringUtils.isEmpty(model) ? this::vertexNotConnectedToAnyModel : vertex -> vertexValidForModel(vertex, model); + final List verticesForModel = StreamSupport.stream(vertices.left().value().spliterator(), false).filter(filterPredicate).collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(verticesForModel)) { + if (log.isDebugEnabled()) { + log.debug("No vertex in graph for key ={} and value = {}", name, value); + } + return Either.right(JanusGraphOperationStatus.NOT_FOUND); + } + return Either.left(verticesForModel.get(0)); + } + return Either.right(vertices.right().value()); + } + + public Either getVertexByProperty(final String name, final Object value) { + final Either, JanusGraphOperationStatus> vertices = getVerticesByProperty(name, value); + if (vertices.isLeft()) { + return Either.left(vertices.left().value().iterator().next()); + } + return Either.right(vertices.right().value()); + } - public Either getVertexByProperty(String name, Object value) { - Either graph = janusGraphClient.getGraph(); + + public Either, JanusGraphOperationStatus> getVerticesByProperty(final String name, final Object value) { + final Either graph = janusGraphClient.getGraph(); if (value == null) { if (log.isDebugEnabled()) { log.debug("No vertex in graph for key = {} and value = {}", name, value); } - return Either.right(JanusGraphOperationStatus.NOT_FOUND); + return Either.right(JanusGraphOperationStatus.NOT_FOUND); } if (graph.isLeft()) { try { - JanusGraph tGraph = graph.left().value(); - @SuppressWarnings("unchecked") Iterable vertecies = tGraph.query().has(name, value).vertices(); - java.util.Iterator iterator = vertecies.iterator(); - if (iterator.hasNext()) { - JanusGraphVertex vertex = iterator.next(); - return Either.left(vertex); + final JanusGraph tGraph = graph.left().value(); + @SuppressWarnings("unchecked") Iterable vertices = tGraph.query().has(name, value).vertices(); + if (vertices.iterator().hasNext()) { + return Either.left(vertices); } else { if (log.isDebugEnabled()) { log.debug("No vertex in graph for key ={} and value = {}", name, value); @@ -637,6 +687,24 @@ public class JanusGraphGenericDao { return Either.right(graph.right().value()); } } + + private boolean vertexValidForModel(final JanusGraphVertex vertex, final String model) { + final Either>, JanusGraphOperationStatus> modelVertices = getParentVerticies(vertex, GraphEdgeLabels.MODEL_ELEMENT); + + if (modelVertices.isLeft()) { + for (ImmutablePair vertexPair : modelVertices.left().value()) { + if (model.equals((String)vertexPair.getLeft().property("name").value())) { + return true; + } + } + } + return false; + } + + private boolean vertexNotConnectedToAnyModel(final JanusGraphVertex vertex) { + return !vertex.edges(Direction.IN, EdgeLabelEnum.MODEL_ELEMENT.name()).hasNext(); + } + public Either, JanusGraphOperationStatus> getByCriteria(NodeTypeEnum type, Map hasProps, Map hasNotProps, Class clazz) { @@ -1220,12 +1288,27 @@ public class JanusGraphGenericDao { if (vertices == null || !vertices.iterator().hasNext()) { return Either.right(JanusGraphOperationStatus.INVALID_ID); } - Vertex rootVertex = vertices.iterator().next(); - Iterator edgesCreatorIterator = rootVertex.edges(Direction.OUT, edgeType.getProperty()); + return getChildrenVerticies(vertices.iterator().next(), edgeType); + } + + public Either>, JanusGraphOperationStatus> getChildrenVerticies( + final JanusGraphVertex rootVertex, final GraphEdgeLabels edgeType) { + return getEdgeVerticies(rootVertex, Direction.OUT, edgeType); + } + + public Either>, JanusGraphOperationStatus> getParentVerticies( + final JanusGraphVertex rootVertex, final GraphEdgeLabels edgeType) { + return getEdgeVerticies(rootVertex, Direction.IN, edgeType); + } + + public Either>, JanusGraphOperationStatus> getEdgeVerticies( + final JanusGraphVertex rootVertex, final Direction direction, final GraphEdgeLabels edgeType) { + final List> immutablePairs = new ArrayList<>(); + final Iterator edgesCreatorIterator = rootVertex.edges(direction, edgeType.getProperty()); if (edgesCreatorIterator != null) { while (edgesCreatorIterator.hasNext()) { Edge edge = edgesCreatorIterator.next(); - JanusGraphVertex vertex = (JanusGraphVertex) edge.inVertex(); + JanusGraphVertex vertex = Direction.OUT.equals(direction)? (JanusGraphVertex) edge.inVertex() : (JanusGraphVertex) edge.outVertex(); ImmutablePair immutablePair = new ImmutablePair<>(vertex, edge); immutablePairs.add(immutablePair); } diff --git a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/neo4j/GraphEdgeLabels.java b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/neo4j/GraphEdgeLabels.java index 2ebfbe0060..7dbcc87eb4 100644 --- a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/neo4j/GraphEdgeLabels.java +++ b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/neo4j/GraphEdgeLabels.java @@ -70,6 +70,7 @@ public enum GraphEdgeLabels { GENERATED_FROM("GENERATED_FROM"), PARAMETER_VALUE("PARAMETER_VALUE"), PARAMETER_IMPL("PARAMETER_IMPL"), + MODEL_ELEMENT("MODEL_ELEMENT"), // VF additions CALCULATED_REQUIREMENT("CALCULATED_REQUIREMENT"), CALCULATED_CAPABILITY("CALCULATED_CAPABILITY"), diff --git a/catalog-dao/src/test/java/org/openecomp/sdc/be/dao/neo4j/GraphEdgeLabelsTest.java b/catalog-dao/src/test/java/org/openecomp/sdc/be/dao/neo4j/GraphEdgeLabelsTest.java index c5723b1007..bfa940929a 100644 --- a/catalog-dao/src/test/java/org/openecomp/sdc/be/dao/neo4j/GraphEdgeLabelsTest.java +++ b/catalog-dao/src/test/java/org/openecomp/sdc/be/dao/neo4j/GraphEdgeLabelsTest.java @@ -28,7 +28,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; public class GraphEdgeLabelsTest { @Test public void testGetAllProperties() throws Exception { - assertEquals(55, GraphEdgeLabels.getAllProperties().size()); + assertEquals(56, GraphEdgeLabels.getAllProperties().size()); } @Test -- cgit 1.2.3-korg