2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Modifications Copyright © 2024 DEUTSCHE TELEKOM AG.
8 * ================================================================================
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 * ============LICENSE_END=========================================================
23 package org.onap.aai.query.builder;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertTrue;
28 import java.io.UnsupportedEncodingException;
30 import java.net.URISyntaxException;
31 import java.util.List;
33 import org.apache.tinkerpop.gremlin.process.traversal.Path;
34 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
35 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
36 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
37 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
38 import org.apache.tinkerpop.gremlin.structure.Edge;
39 import org.apache.tinkerpop.gremlin.structure.Vertex;
40 import org.janusgraph.core.JanusGraph;
41 import org.janusgraph.core.JanusGraphFactory;
42 import org.junit.Ignore;
43 import org.junit.Test;
44 import org.junit.experimental.categories.Category;
45 import org.onap.aai.TinkerpopUpgrade;
46 import org.onap.aai.db.props.AAIProperties;
47 import org.onap.aai.edges.enums.EdgeType;
48 import org.onap.aai.exceptions.AAIException;
49 import org.onap.aai.introspection.Introspector;
50 import org.onap.aai.introspection.Loader;
51 import org.onap.aai.introspection.LoaderUtil;
52 import org.onap.aai.introspection.exceptions.AAIUnknownObjectException;
54 @Category(TinkerpopUpgrade.class)
55 public class TraversalQueryTest extends QueryBuilderTestAbstraction {
58 protected QueryBuilder<Edge> getNewEdgeTraversalWithTestEdgeRules(Vertex v) {
59 return new TraversalQuery<>(loader, g, v);
63 protected QueryBuilder<Edge> getNewEdgeTraversalWithTestEdgeRules() {
64 return new TraversalQuery<>(loader, g);
68 protected QueryBuilder<Vertex> getNewVertexTraversalWithTestEdgeRules(Vertex v) {
69 return new TraversalQuery<>(loader, g, v);
73 protected QueryBuilder<Vertex> getNewVertexTraversalWithTestEdgeRules() {
74 return new TraversalQuery<>(loader, g);
77 protected QueryBuilder<Vertex> getNewVertexTraversal() {
78 return new TraversalQuery<>(loader, g);
82 protected QueryBuilder<Tree> getNewTreeTraversalWithTestEdgeRules(Vertex v) {
83 return new TraversalQuery<>(loader, g, v);
87 protected QueryBuilder<Tree> getNewTreeTraversalWithTestEdgeRules() {
88 return new TraversalQuery<>(loader, g);
92 protected QueryBuilder<Path> getNewPathTraversalWithTestEdgeRules(Vertex v) {
93 return new TraversalQuery<>(loader, g, v);
97 protected QueryBuilder<Path> getNewPathTraversalWithTestEdgeRules() {
98 return new TraversalQuery<>(loader, g);
102 public void unionQuery() {
103 QueryBuilder<Vertex> tQ = getNewVertexTraversal();
104 QueryBuilder<Vertex> tQ2 = getNewVertexTraversal();
105 QueryBuilder<Vertex> tQ3 = getNewVertexTraversal();
106 tQ.union(tQ2.getVerticesByProperty("test1", "value1"), tQ3.getVerticesByIndexedProperty("test2", "value2"));
108 GraphTraversal<Vertex, Vertex> expected =
109 __.<Vertex>start().union(__.has("test1", "value1"), __.has("test2", "value2"));
111 assertEquals("they are equal", expected, tQ.getQuery());
116 public void traversalClones() throws UnsupportedEncodingException, AAIException, URISyntaxException {
117 QueryBuilder<Vertex> tQ = getNewVertexTraversal();
118 QueryBuilder<Vertex> builder =
119 tQ.createQueryFromURI(new URI("network/generic-vnfs/generic-vnf/key1")).getQueryBuilder();
120 GraphTraversal<Vertex, Vertex> expected =
121 __.<Vertex>start().has("vnf-id", "key1").has("aai-node-type", "generic-vnf");
122 GraphTraversal<Vertex, Vertex> containerExpected = __.<Vertex>start().has("aai-node-type", "generic-vnf");
124 assertEquals("query object", expected.toString(), builder.getQuery().toString());
125 assertEquals("container query object", containerExpected.toString(),
126 builder.getContainerQuery().getQuery().toString());
130 // TODO - Identify why this unit test is failing and if this
131 // is going to cause any problems
133 @Ignore("Not working ever since the change to using model driven development")
134 public void nestedTraversalClones() throws UnsupportedEncodingException, AAIException, URISyntaxException {
136 QueryBuilder<Vertex> tQ = getNewVertexTraversal();
137 QueryBuilder<Vertex> builder =
138 tQ.createQueryFromURI(new URI("network/generic-vnfs/generic-vnf/key1/l-interfaces/l-interface/key2"))
140 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start().has("vnf-id", "key1")
141 .has("aai-node-type", "generic-vnf").in("org.onap.relationships.inventory.BelongsTo")
142 .has(AAIProperties.NODE_TYPE, "l-interface").has("interface-name", "key2");
143 GraphTraversal<Vertex, Vertex> containerExpected =
144 __.<Vertex>start().has("vnf-id", "key1").has("aai-node-type", "generic-vnf")
145 .in("org.onap.relationships.inventory.BelongsTo").has(AAIProperties.NODE_TYPE, "l-interface");
147 assertEquals("query object", expected.toString(), builder.getQuery().toString());
148 assertEquals("container query object", containerExpected.toString(),
149 builder.getContainerQuery().getQuery().toString());
154 public void abstractEdgeToVertexTraversalTest() throws AAIException {
156 Vertex gvnf = this.addVHelper(g, "vertex", "aai-node-type", "generic-vnf", "vnf-id", "gvnf").next();
157 Vertex vnfc1 = this.addVHelper(g, "vertex", "aai-node-type", "vnfc", "vnfc-name", "a-name").next();
159 testEdgeSer.addEdge(g, gvnf, vnfc1);
161 QueryBuilder<Vertex> tQ = getNewVertexTraversalWithTestEdgeRules(gvnf);
162 tQ.createEdgeTraversal(EdgeType.COUSIN, "vnf", "vnfc");
164 List<Vertex> list = tQ.toList();
166 assertEquals("Has 1 vertexes ", 1, list.size());
167 assertTrue("Has vertex on the default edge ", list.contains(vnfc1));
172 public void abstractEdgeToVertexTraversalSingleOutRuleTest() throws AAIException {
174 Vertex vce = this.addVHelper(g, "vertex", "aai-node-type", "vce", "vnf-id", "vce").next();
175 Vertex vnfc1 = this.addVHelper(g, "vertex", "aai-node-type", "vnfc", "vnfc-name", "a-name").next();
177 testEdgeSer.addEdge(g, vce, vnfc1);
179 QueryBuilder<Vertex> tQ1 = getNewVertexTraversalWithTestEdgeRules(vce);
180 tQ1.createEdgeTraversal(EdgeType.COUSIN, "vnf", "vnfc");
182 QueryBuilder<Vertex> tQ2 = getNewVertexTraversalWithTestEdgeRules(vnfc1);
183 tQ2.createEdgeTraversal(EdgeType.COUSIN, "vnfc", "vnf");
185 List<Vertex> list1 = tQ1.toList();
186 List<Vertex> list2 = tQ2.toList();
188 assertEquals("1 - Has 1 vertexes ", 1, list1.size());
189 assertTrue("1 - traversal results in vnfc ", list1.contains(vnfc1));
190 assertEquals("2 - Has 1 vertexes ", 1, list2.size());
191 assertTrue("2 - traversal results in vce ", list2.contains(vce));
196 public void abstractEdgeToVertexTraversalSingleInRuleTest() throws AAIException {
198 Vertex vce = this.addVHelper(g, "vertex", "aai-node-type", "vce", "vnf-id", "vce").next();
199 Vertex pserver = this.addVHelper(g, "vertex", "aai-node-type", "pserver", "hostname", "a-name").next();
201 testEdgeSer.addEdge(g, vce, pserver);
203 QueryBuilder<Vertex> tQ1 = getNewVertexTraversalWithTestEdgeRules(vce);
204 tQ1.createEdgeTraversal(EdgeType.COUSIN, "vnf", "pserver");
206 List<Vertex> list = tQ1.toList();
208 assertEquals("1 - Has 1 vertexes ", 1, list.size());
209 assertTrue("1 - traversal results in vnfc ", list.contains(pserver));
214 public void abstractEdgeToVertexMultiRuleTraversalTest() throws AAIException {
216 Vertex gvnf = this.addVHelper(g, "vertex", "aai-node-type", "generic-vnf", "vnf-id", "gvnf").next();
217 Vertex vnfc1 = this.addVHelper(g, "vertex", "aai-node-type", "vnfc", "vnfc-name", "a-name").next();
218 Vertex vnfc2 = this.addVHelper(g, "vertex", "aai-node-type", "vnfc", "vnfc-name", "b-name").next();
220 testEdgeSer.addEdge(g, gvnf, vnfc1);
221 testEdgeSer.addEdge(g, gvnf, vnfc2, "re-uses");
223 QueryBuilder<Vertex> tQ = getNewVertexTraversalWithTestEdgeRules(gvnf);
224 tQ.createEdgeTraversal(EdgeType.COUSIN, "vnf", "vnfc");
226 List<Vertex> list = tQ.toList();
228 assertEquals("Has 2 vertexes ", 2, list.size());
229 assertTrue("Has vertex on the default edge ", list.contains(vnfc1));
230 assertTrue("Has vertex on the re-uses edge ", list.contains(vnfc2));
235 public void abstractEdgeToVertexMultiRuleOutTraversalTest() throws AAIException {
237 Vertex gvnf = this.addVHelper(g, "vertex", "aai-node-type", "generic-vnf", "vnf-id", "gvnf").next();
238 Vertex pserver = this.addVHelper(g, "vertex", "aai-node-type", "pserver", "hostname", "a-name").next();
240 testEdgeSer.addEdge(g, gvnf, pserver);
241 testEdgeSer.addEdge(g, gvnf, pserver, "generic-vnf-pserver-B");
243 QueryBuilder<Vertex> tQ = getNewVertexTraversalWithTestEdgeRules(gvnf);
244 tQ.createEdgeTraversal(EdgeType.COUSIN, "vnf", "pserver");
246 List<Vertex> list = tQ.toList();
248 assertEquals("Has 2 vertexes ", 2, list.size());
249 assertTrue("result has pserver ", list.contains(pserver));
254 public void abstractEdgeToVertexMultiRuleInTraversalTest() throws AAIException {
256 Vertex gvnf = this.addVHelper(g, "vertex", "aai-node-type", "generic-vnf", "vnf-id", "gvnf").next();
258 this.addVHelper(g, "vertex", "aai-node-type", "complex", "physical-location-id", "a-name").next();
260 testEdgeSer.addEdge(g, gvnf, complex);
261 testEdgeSer.addEdge(g, gvnf, complex, "complex-generic-vnf-B");
263 QueryBuilder<Vertex> tQ = getNewVertexTraversalWithTestEdgeRules(gvnf);
264 tQ.createEdgeTraversal(EdgeType.COUSIN, "vnf", "complex");
266 List<Vertex> list = tQ.toList();
268 assertEquals("Has 2 vertexes ", 2, list.size());
269 assertTrue("result has pserver ", list.contains(complex));
274 public void createDBQueryTest() throws AAIUnknownObjectException {
275 JanusGraph graph = JanusGraphFactory.build().set("storage.backend", "inmemory").open();
276 GraphTraversalSource source = graph.newTransaction().traversal();
277 final Loader loader = LoaderUtil.getLatestVersion();
278 GraphTraversal<Vertex, Vertex> traversal = __.<Vertex>start();
279 TraversalQuery traversalQuery = new TraversalQuery<>(loader, source, traversal);
280 Introspector obj = loader.introspectorFromName("vpn-binding");
281 obj.setValue("vpn-id", "modifyKey");
283 traversalQuery.createKeyQuery(obj);
284 assertEquals(1, traversal.asAdmin().getSteps().size());
285 assertEquals("HasStep([vpn-id.eq(modifyKey)])", traversal.asAdmin().getSteps().get(0).toString());
286 traversalQuery.createContainerQuery(obj);
287 assertEquals(1, traversal.asAdmin().getSteps().size());
288 assertEquals("HasStep([vpn-id.eq(modifyKey), aai-node-type.eq(vpn-binding)])", traversal.asAdmin().getSteps().get(0).toString());
292 public void removeQueryStepsBetweenTest() throws AAIUnknownObjectException {
293 JanusGraph graph = JanusGraphFactory.build().set("storage.backend", "inmemory").open();
294 GraphTraversalSource source = graph.newTransaction().traversal();
295 final Loader loader = LoaderUtil.getLatestVersion();
296 TraversalQuery traversalQuery = new TraversalQuery<>(loader, source);
297 traversalQuery.has("propertyKey", "value");
299 QueryBuilder clonedQuery = traversalQuery.removeQueryStepsBetween(0, 1);
300 String query = clonedQuery.getQuery().toString();
301 assertEquals("[HasStep([propertyKey.eq(value)])]", query);
305 public void removeQueryStepsBetweenTest02() throws AAIUnknownObjectException {
306 JanusGraph graph = JanusGraphFactory.build().set("storage.backend", "inmemory").open();
307 GraphTraversalSource source = graph.newTransaction().traversal();
308 final Loader loader = LoaderUtil.getLatestVersion();
309 TraversalQuery traversalQuery = new TraversalQuery<>(loader, source);
310 traversalQuery.has("propertyKey", "value");
312 QueryBuilder clonedQuery = traversalQuery.removeQueryStepsBetween(0, 2);
313 String query = clonedQuery.getQuery().toString();
314 assertEquals("[]", query);
318 public void removeQueryStepsBetweenTest07() throws AAIUnknownObjectException {
319 JanusGraph graph = JanusGraphFactory.build().set("storage.backend", "inmemory").open();
320 GraphTraversalSource source = graph.newTransaction().traversal();
321 final Loader loader = LoaderUtil.getLatestVersion();
322 TraversalQuery traversalQuery = new TraversalQuery<>(loader, source);
323 traversalQuery.limit(1);
324 traversalQuery.has("propertyKey", "value");
325 traversalQuery.has("propertyKey2", "value2");
326 traversalQuery.limit(2);
327 traversalQuery.has("propertyKey3", "value3");
328 traversalQuery.has("propertyKey4", "value4");
329 traversalQuery.has("propertyKey5", "value5");
330 traversalQuery.limit(3);
331 traversalQuery.limit(4);
333 QueryBuilder clonedQuery = traversalQuery.removeQueryStepsBetween(0, 7);
334 String query = clonedQuery.getQuery().toString();
335 assertEquals("[HasStep([propertyKey5.eq(value5)]), RangeGlobalStep(0,3), RangeGlobalStep(0,4)]", query);
339 @Ignore("Enable once removeQueryStepsBetween supports a start index > 0")
340 public void removeQueryStepsBetweenTest27() throws AAIUnknownObjectException {
341 JanusGraph graph = JanusGraphFactory.build().set("storage.backend", "inmemory").open();
342 GraphTraversalSource source = graph.newTransaction().traversal();
343 final Loader loader = LoaderUtil.getLatestVersion();
344 TraversalQuery traversalQuery = new TraversalQuery<>(loader, source);
345 traversalQuery.limit(1);
346 traversalQuery.has("propertyKey", "value");
347 traversalQuery.has("propertyKey2", "value2");
348 traversalQuery.limit(2);
349 traversalQuery.has("propertyKey3", "value3");
350 traversalQuery.has("propertyKey4", "value4");
351 traversalQuery.has("propertyKey5", "value5");
352 traversalQuery.limit(3);
353 traversalQuery.limit(4);
355 QueryBuilder clonedQuery = traversalQuery.removeQueryStepsBetween(2, 7);
356 String query = clonedQuery.getQuery().toString();
357 assertEquals("[RangeGlobalStep(0,1), HasStep([propertyKey.eq(value)]), HasStep([propertyKey5.eq(value5)]), RangeGlobalStep(0,3), RangeGlobalStep(0,4)]", query);