From f0d0c453645d19788da666d0e3c7c6ed9bb2516a Mon Sep 17 00:00:00 2001 From: "Maharajh, Robby (rx2202)" Date: Thu, 22 Mar 2018 16:12:12 -0400 Subject: Add to aai-common query builder get parent step Issue-ID: AAI-962 Change-Id: Ib4aa4ec3453f2c7099e1d7191917b44b323f2bb6 Signed-off-by: Maharajh, Robby (rx2202) --- .../aai/query/builder/GraphTraversalBuilder.java | 16 +++++++++ .../aai/query/builder/GremlinQueryBuilder.java | 18 ++++++++++ .../org/onap/aai/query/builder/QueryBuilder.java | 39 +++++++++++++++++++-- .../aai/query/builder/GremlinTraversalTest.java | 11 ++++++ .../query/builder/QueryBuilderTestAbstraction.java | 40 +++++++++++++++++++++- .../onap/aai/query/builder/TraversalQueryTest.java | 11 ++++++ .../DbEdgeRules_TraversalQueryTest.json | 12 +++++++ 7 files changed, 144 insertions(+), 3 deletions(-) diff --git a/aai-core/src/main/java/org/onap/aai/query/builder/GraphTraversalBuilder.java b/aai-core/src/main/java/org/onap/aai/query/builder/GraphTraversalBuilder.java index 85b484a7..b298dbb9 100644 --- a/aai-core/src/main/java/org/onap/aai/query/builder/GraphTraversalBuilder.java +++ b/aai-core/src/main/java/org/onap/aai/query/builder/GraphTraversalBuilder.java @@ -26,6 +26,7 @@ import java.util.Optional; import java.util.Set; import org.apache.tinkerpop.gremlin.process.traversal.P; +import org.apache.tinkerpop.gremlin.process.traversal.Path; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traversal.Admin; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; @@ -477,6 +478,16 @@ public abstract class GraphTraversalBuilder extends QueryBuilder { stepIndex++; return this; } + + /** + * {@inheritDoc} + */ + @Override + public QueryBuilder path(){ + this.traversal.path(); + stepIndex++; + return (QueryBuilder)this; + } @Override public QueryBuilder outE() { @@ -757,4 +768,9 @@ public abstract class GraphTraversalBuilder extends QueryBuilder { return this.completeTraversal.toList(); } + protected QueryBuilder has(String key, String value) { + traversal.has(key, value); + + return (QueryBuilder)this; + } } diff --git a/aai-core/src/main/java/org/onap/aai/query/builder/GremlinQueryBuilder.java b/aai-core/src/main/java/org/onap/aai/query/builder/GremlinQueryBuilder.java index 55faa4dc..010dfa50 100644 --- a/aai-core/src/main/java/org/onap/aai/query/builder/GremlinQueryBuilder.java +++ b/aai-core/src/main/java/org/onap/aai/query/builder/GremlinQueryBuilder.java @@ -25,6 +25,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import com.google.common.base.Joiner; +import org.apache.tinkerpop.gremlin.process.traversal.Path; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.structure.Direction; @@ -525,6 +527,16 @@ public abstract class GremlinQueryBuilder extends QueryBuilder { stepIndex++; return this; } + + /** + * {@inheritDoc} + */ + @Override + public QueryBuilder path(){ + this.list.add(".path()"); + stepIndex++; + return (QueryBuilder)this; + } @Override public QueryBuilder outE() { @@ -678,5 +690,11 @@ public abstract class GremlinQueryBuilder extends QueryBuilder { return (List)this.completeTraversal.toList(); } + + protected QueryBuilder has(String key, String value) { + this.list.add(".has('" + key + "','" + value + "')"); + + return (QueryBuilder)this; + } } diff --git a/aai-core/src/main/java/org/onap/aai/query/builder/QueryBuilder.java b/aai-core/src/main/java/org/onap/aai/query/builder/QueryBuilder.java index 89c15f25..0350aba2 100644 --- a/aai-core/src/main/java/org/onap/aai/query/builder/QueryBuilder.java +++ b/aai-core/src/main/java/org/onap/aai/query/builder/QueryBuilder.java @@ -27,6 +27,7 @@ import java.util.Map; import javax.ws.rs.core.MultivaluedMap; +import org.apache.tinkerpop.gremlin.process.traversal.Path; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Vertex; @@ -36,6 +37,8 @@ import org.onap.aai.introspection.Introspector; import org.onap.aai.introspection.Loader; import org.onap.aai.parsers.query.QueryParser; import org.onap.aai.parsers.query.QueryParserStrategy; +import org.onap.aai.serialization.db.AAIDirection; +import org.onap.aai.serialization.db.EdgeProperty; import org.onap.aai.serialization.db.EdgeType; /** @@ -405,16 +408,48 @@ public abstract class QueryBuilder implements Iterator { * @return a QueryBuilder with the simplePath step appended to its traversal */ public abstract QueryBuilder simplePath(); + + /** + * + * @return QueryBuilder with the path step appended to its traversal + */ + public abstract QueryBuilder path(); public abstract void markContainer(); public abstract QueryBuilder getContainerQuery(); public abstract List toList(); - + + /** + * Used to skip step if there is an optional property missing. + * @param key + * @param value + * @return + */ public QueryBuilder getVerticesByProperty(String key, MissingOptionalParameter value) { return (QueryBuilder) this; } - + /** + * TODO the edge direction is hardcoded here, make it more generic + * Returns the parent edge of the vertex + * @return + */ + public QueryBuilder getParentEdge() { + this.outE().has(EdgeProperty.CONTAINS.toString(), AAIDirection.IN.toString()); + return (QueryBuilder)this; + } + + /** + * TODO the edge direction is hardcoded here, make it more generic + * Returns the parent vertex of the vertex + * @return + */ + public QueryBuilder getParentVertex() { + this.getParentEdge().inV(); + return (QueryBuilder)this; + } + + protected abstract QueryBuilder has(String key, String value); } diff --git a/aai-core/src/test/java/org/onap/aai/query/builder/GremlinTraversalTest.java b/aai-core/src/test/java/org/onap/aai/query/builder/GremlinTraversalTest.java index 3632543f..18f4714c 100644 --- a/aai-core/src/test/java/org/onap/aai/query/builder/GremlinTraversalTest.java +++ b/aai-core/src/test/java/org/onap/aai/query/builder/GremlinTraversalTest.java @@ -19,6 +19,7 @@ */ package org.onap.aai.query.builder; +import org.apache.tinkerpop.gremlin.process.traversal.Path; import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Vertex; @@ -55,5 +56,15 @@ public class GremlinTraversalTest extends QueryBuilderTestAbstraction { return new GremlinTraversal<>(loader, g, testEdgeRules); } + @Override + protected QueryBuilder getNewPathTraversalWithTestEdgeRules(Vertex v) { + return new GremlinTraversal<>(loader, g, v, testEdgeRules); + } + + @Override + protected QueryBuilder getNewPathTraversalWithTestEdgeRules() { + return new GremlinTraversal<>(loader, g, testEdgeRules); + } + } diff --git a/aai-core/src/test/java/org/onap/aai/query/builder/QueryBuilderTestAbstraction.java b/aai-core/src/test/java/org/onap/aai/query/builder/QueryBuilderTestAbstraction.java index 6d45d947..de1ed44c 100644 --- a/aai-core/src/test/java/org/onap/aai/query/builder/QueryBuilderTestAbstraction.java +++ b/aai-core/src/test/java/org/onap/aai/query/builder/QueryBuilderTestAbstraction.java @@ -19,13 +19,14 @@ */ package org.onap.aai.query.builder; -import org.janusgraph.core.JanusGraphFactory; +import org.apache.tinkerpop.gremlin.process.traversal.Path; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet; import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.janusgraph.core.JanusGraphFactory; import org.junit.*; import org.onap.aai.AAISetup; import org.onap.aai.db.props.AAIProperties; @@ -42,6 +43,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.collection.IsIterableContainingInOrder.contains; import static org.junit.Assert.*; public abstract class QueryBuilderTestAbstraction extends AAISetup { @@ -105,6 +108,38 @@ public abstract class QueryBuilderTestAbstraction extends AAISetup { } + + @SuppressWarnings("rawtypes") + @Test + public void createEdgeLinterfaceToLogicalLinkTraversal_Path() throws AAIException { + Vertex pInterface = g.addV("aai-node-type","p-interface","interface-name","p-interface-a").next(); + Vertex lInterface = g.addV("aai-node-type","l-interface","interface-name","l-interface-a").next(); + Vertex logicalLink = g.addV("aai-node-type","logical-link","link-name","logical-link-a").next(); + testEdgeRules.addEdge(g, lInterface, logicalLink); + testEdgeRules.addTreeEdge(g, pInterface, lInterface); + + QueryBuilder tQ = getNewPathTraversalWithTestEdgeRules(pInterface).createEdgeTraversal(EdgeType.TREE, + loader.introspectorFromName("p-interface" ), loader.introspectorFromName("l-interface")).createEdgeTraversal(EdgeType.COUSIN, + loader.introspectorFromName("l-interface" ), loader.introspectorFromName("logical-link")).path(); + + Path path = tQ.next(); + assertThat(path.objects(), contains(pInterface, lInterface, logicalLink)); + } + + @SuppressWarnings("rawtypes") + @Test + public void parentVertexTest() throws AAIException { + Vertex pInterface = g.addV("aai-node-type","p-interface","interface-name","p-interface-a").next(); + Vertex lInterface = g.addV("aai-node-type","l-interface","interface-name","l-interface-a").next(); + + testEdgeRules.addTreeEdge(g, pInterface, lInterface); + + QueryBuilder tQ = getNewEdgeTraversalWithTestEdgeRules(lInterface).getParentVertex(); + + Vertex parent = tQ.next(); + assertThat(parent, is(pInterface)); + } + @Test public void createEdgeLinterfaceToLogicalLinkIntrospectorTraversal() throws AAIException { @@ -644,5 +679,8 @@ public abstract class QueryBuilderTestAbstraction extends AAISetup { protected abstract QueryBuilder getNewTreeTraversalWithTestEdgeRules(); + protected abstract QueryBuilder getNewPathTraversalWithTestEdgeRules(Vertex v); + + protected abstract QueryBuilder getNewPathTraversalWithTestEdgeRules(); } diff --git a/aai-core/src/test/java/org/onap/aai/query/builder/TraversalQueryTest.java b/aai-core/src/test/java/org/onap/aai/query/builder/TraversalQueryTest.java index 1eeca6f0..b38d13d6 100644 --- a/aai-core/src/test/java/org/onap/aai/query/builder/TraversalQueryTest.java +++ b/aai-core/src/test/java/org/onap/aai/query/builder/TraversalQueryTest.java @@ -19,6 +19,7 @@ */ package org.onap.aai.query.builder; +import org.apache.tinkerpop.gremlin.process.traversal.Path; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree; @@ -74,6 +75,16 @@ public class TraversalQueryTest extends QueryBuilderTestAbstraction { protected QueryBuilder getNewTreeTraversalWithTestEdgeRules() { return new TraversalQuery<>(loader, g, testEdgeRules); } + + @Override + protected QueryBuilder getNewPathTraversalWithTestEdgeRules(Vertex v) { + return new TraversalQuery<>(loader, g, v, testEdgeRules); + } + + @Override + protected QueryBuilder getNewPathTraversalWithTestEdgeRules() { + return new TraversalQuery<>(loader, g, testEdgeRules); + } @Test public void unionQuery() { diff --git a/aai-core/src/test/resources/dbedgerules/DbEdgeRules_TraversalQueryTest.json b/aai-core/src/test/resources/dbedgerules/DbEdgeRules_TraversalQueryTest.json index 515831e9..d68ad35b 100644 --- a/aai-core/src/test/resources/dbedgerules/DbEdgeRules_TraversalQueryTest.json +++ b/aai-core/src/test/resources/dbedgerules/DbEdgeRules_TraversalQueryTest.json @@ -152,6 +152,18 @@ "prevent-delete": "NONE", "default": "true", "description": "Hard to describe" + }, + { + "from": "l-interface", + "to": "p-interface", + "label": "tosca.relationships.network.BindsTo", + "direction": "OUT", + "multiplicity": "MANY2ONE", + "contains-other-v": "!${direction}", + "SVC-INFRA": "${direction}", + "delete-other-v": "!${direction}", + "prevent-delete": "NONE", + "default": "true" } ] } -- cgit 1.2.3-korg