2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
20 * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22 package org.onap.aai.parsers.query;
24 import org.apache.tinkerpop.gremlin.process.traversal.P;
25 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
26 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
27 import org.apache.tinkerpop.gremlin.structure.Vertex;
28 import org.junit.Before;
29 import org.junit.Rule;
30 import org.junit.Test;
31 import org.junit.rules.ExpectedException;
32 import org.onap.aai.AAISetup;
33 import org.onap.aai.db.props.AAIProperties;
34 import org.onap.aai.exceptions.AAIException;
35 import org.onap.aai.introspection.LoaderFactory;
36 import org.onap.aai.introspection.ModelType;
37 import org.onap.aai.introspection.Version;
38 import org.onap.aai.rest.RestTokens;
39 import org.onap.aai.serialization.engines.QueryStyle;
40 import org.onap.aai.serialization.engines.TitanDBEngine;
41 import org.onap.aai.serialization.engines.TransactionalGraphEngine;
43 import javax.ws.rs.core.MultivaluedHashMap;
44 import javax.ws.rs.core.MultivaluedMap;
45 import javax.ws.rs.core.UriBuilder;
46 import java.io.UnsupportedEncodingException;
48 import java.util.ArrayList;
49 import java.util.List;
51 import static org.hamcrest.CoreMatchers.containsString;
52 import static org.hamcrest.Matchers.hasProperty;
53 import static org.hamcrest.Matchers.is;
54 import static org.junit.Assert.assertEquals;
56 public class GraphTraversalTest extends AAISetup {
58 private TransactionalGraphEngine dbEngine;
59 private TransactionalGraphEngine dbEnginev9;
62 public ExpectedException thrown = ExpectedException.none();
67 * @throws SecurityException
68 * @throws NoSuchFieldException
71 public void configure() throws Exception {
73 new TitanDBEngine(QueryStyle.TRAVERSAL,
74 LoaderFactory.createLoaderForVersion(ModelType.MOXY, AAIProperties.LATEST),
78 new TitanDBEngine(QueryStyle.TRAVERSAL,
79 LoaderFactory.createLoaderForVersion(ModelType.MOXY, Version.v9),
86 * @throws UnsupportedEncodingException the unsupported encoding exception
87 * @throws AAIException the AAI exception
90 public void parentQuery() throws UnsupportedEncodingException, AAIException {
91 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1").build();
93 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
95 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start().has("physical-location-id", "key1").has("aai-node-type", "complex");
97 "gremlin query should be " + expected.toString(),
99 query.getQueryBuilder().getQuery().toString());
101 "parent gremlin query should be equal to normal query",
103 query.getQueryBuilder().getParentQuery().getQuery().toString());
105 "result type should be complex",
107 query.getResultType());
109 "result type should be empty",
111 query.getParentResultType());
112 assertEquals("dependent",false, query.isDependent());
120 * @throws UnsupportedEncodingException the unsupported encoding exception
121 * @throws AAIException the AAI exception
124 public void childQuery() throws UnsupportedEncodingException, AAIException {
125 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/ctag-pools/ctag-pool/key2/key3").build();
126 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
127 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
128 .has("physical-location-id", "key1").has("aai-node-type", "complex")
129 .in("org.onap.relationships.inventory.BelongsTo")
130 .has("aai-node-type", "ctag-pool")
131 .has("target-pe", "key2").has("availability-zone-name", "key3");
132 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
133 .has("physical-location-id", "key1").has("aai-node-type", "complex");
135 "gremlin query should be " + expected.toString(),
137 query.getQueryBuilder().getQuery().toString());
139 "parent gremlin query should be equal the query for complex",
140 expectedParent.toString(),
141 query.getQueryBuilder().getParentQuery().getQuery().toString());
143 "result type should be complex",
145 query.getParentResultType());
147 "result type should be ctag-pool",
149 query.getResultType());
150 assertEquals("dependent",true, query.isDependent());
158 * @throws UnsupportedEncodingException the unsupported encoding exception
159 * @throws AAIException the AAI exception
162 public void namingExceptions() throws UnsupportedEncodingException, AAIException {
163 URI uri = UriBuilder.fromPath("network/vces/vce/key1/port-groups/port-group/key2/cvlan-tags/cvlan-tag/655").build();
164 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
165 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
166 .has("vnf-id", "key1").has("aai-node-type", "vce")
167 .in("org.onap.relationships.inventory.BelongsTo")
168 .has("aai-node-type", "port-group")
169 .has("interface-id", "key2").in("org.onap.relationships.inventory.BelongsTo")
170 .has("aai-node-type", "cvlan-tag")
171 .has("cvlan-tag", 655);
172 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
173 .has("vnf-id", "key1").has("aai-node-type", "vce")
174 .in("org.onap.relationships.inventory.BelongsTo")
175 .has("aai-node-type", "port-group")
176 .has("interface-id", "key2");
178 "gremlin query should be " + expected.toString(),
180 query.getQueryBuilder().getQuery().toString());
182 "parent gremlin query should be equal the query for port group",
183 expectedParent.toString(),
184 query.getQueryBuilder().getParentQuery().getQuery().toString());
186 "result type should be cvlan-tag",
188 query.getResultType());
190 "result type should be port-group",
192 query.getParentResultType());
194 "contaner type should be empty",
196 query.getContainerType());
197 assertEquals("dependent",true, query.isDependent());
206 * @throws UnsupportedEncodingException the unsupported encoding exception
207 * @throws AAIException the AAI exception
210 public void getAll() throws UnsupportedEncodingException, AAIException {
211 URI uri = UriBuilder.fromPath("network/vces/vce/key1/port-groups/port-group/key2/cvlan-tags").build();
212 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
213 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
214 .has("vnf-id", "key1").has("aai-node-type", "vce")
215 .in("org.onap.relationships.inventory.BelongsTo")
216 .has("aai-node-type", "port-group")
217 .has("interface-id", "key2").in("org.onap.relationships.inventory.BelongsTo")
218 .has("aai-node-type", "cvlan-tag");
219 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
220 .has("vnf-id", "key1").has("aai-node-type", "vce")
221 .in("org.onap.relationships.inventory.BelongsTo")
222 .has("aai-node-type", "port-group")
223 .has("interface-id", "key2");
225 "gremlin query should be " + expected.toString(),
227 query.getQueryBuilder().getQuery().toString());
229 "parent gremlin query should be equal the query for port group",
230 expectedParent.toString(),
231 query.getQueryBuilder().getParentQuery().getQuery().toString());
233 "result type should be port-group",
235 query.getParentResultType());
237 "result type should be cvlan-tag",
239 query.getResultType());
241 "container type should be cvlan-tags",
243 query.getContainerType());
244 assertEquals("dependent",true, query.isDependent());
250 public void getAllParent() throws UnsupportedEncodingException, AAIException {
251 URI uri = UriBuilder.fromPath("cloud-infrastructure/pservers").build();
252 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
253 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
254 .has("aai-node-type", "pserver");
255 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
256 .has("aai-node-type", "pserver");
258 "gremlin query should be " + expected.toString(),
260 query.getQueryBuilder().getQuery().toString());
262 "parent gremlin query should be equal the query for pserver",
263 expectedParent.toString(),
264 query.getQueryBuilder().getParentQuery().getQuery().toString());
266 "parent result type should be empty",
268 query.getParentResultType());
270 "result type should be pserver",
272 query.getResultType());
274 "container type should be pservers",
276 query.getContainerType());
277 assertEquals("dependent",false, query.isDependent());
284 * Gets the via query param.
286 * @return the via query param
287 * @throws UnsupportedEncodingException the unsupported encoding exception
288 * @throws AAIException the AAI exception
291 public void getViaQueryParam() throws UnsupportedEncodingException, AAIException {
292 URI uri = UriBuilder.fromPath("cloud-infrastructure/cloud-regions/cloud-region/mycloudowner/mycloudregionid/tenants/tenant").build();
293 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
294 map.putSingle("tenant-name", "Tenant1");
295 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
296 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
297 .has("cloud-owner", "mycloudowner").has("cloud-region-id", "mycloudregionid")
298 .has("aai-node-type", "cloud-region")
299 .in("org.onap.relationships.inventory.BelongsTo")
300 .has("aai-node-type", "tenant")
301 .has("tenant-name", "Tenant1");
303 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
304 .has("cloud-owner", "mycloudowner").has("cloud-region-id", "mycloudregionid")
305 .has("aai-node-type", "cloud-region");
308 "gremlin query should be " + expected.toString(),
310 query.getQueryBuilder().getQuery().toString());
312 "parent gremlin query should be equal the query for cloud-region",
313 expectedParent.toString(),
314 query.getQueryBuilder().getParentQuery().getQuery().toString());
316 "result type should be cloud-region",
318 query.getParentResultType());
320 "result type should be tenant",
322 query.getResultType());
324 "container type should be empty",
326 query.getContainerType());
327 assertEquals("dependent",true, query.isDependent());
332 public void getViaDuplicateQueryParam() throws UnsupportedEncodingException, AAIException {
333 URI uri = UriBuilder.fromPath("cloud-infrastructure/cloud-regions/cloud-region/mycloudowner/mycloudregionid/tenants/tenant").build();
334 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
335 List<String> values = new ArrayList<>();
336 values.add("Tenant1");
337 values.add("Tenant2");
338 map.put("tenant-name", values);
339 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
340 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
341 .has("cloud-owner", "mycloudowner").has("cloud-region-id", "mycloudregionid")
342 .has("aai-node-type", "cloud-region")
343 .in("org.onap.relationships.inventory.BelongsTo")
344 .has("aai-node-type", "tenant")
345 .has("tenant-name", P.within(values));
347 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
348 .has("cloud-owner", "mycloudowner").has("cloud-region-id", "mycloudregionid")
349 .has("aai-node-type", "cloud-region");
352 "gremlin query should be " + expected.toString(),
354 query.getQueryBuilder().getQuery().toString());
356 "parent gremlin query should be equal the query for cloud-region",
357 expectedParent.toString(),
358 query.getQueryBuilder().getParentQuery().getQuery().toString());
360 "result type should be cloud-region",
362 query.getParentResultType());
364 "result type should be tenant",
366 query.getResultType());
368 "container type should be empty",
370 query.getContainerType());
371 assertEquals("dependent",true, query.isDependent());
376 * Gets the plural via query param.
378 * @return the plural via query param
379 * @throws UnsupportedEncodingException the unsupported encoding exception
380 * @throws AAIException the AAI exception
383 public void getPluralViaQueryParam() throws UnsupportedEncodingException, AAIException {
384 URI uri = UriBuilder.fromPath("network/vnfcs").build();
385 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
386 map.putSingle("prov-status", "up");
387 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
388 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
389 .has("aai-node-type", "vnfc")
390 .has("prov-status", "up");
392 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
393 .has("aai-node-type", "vnfc");
396 "gremlin query should be " + expected.toString(),
398 query.getQueryBuilder().getQuery().toString());
401 expectedParent.toString(),
402 query.getQueryBuilder().getParentQuery().getQuery().toString());
404 "parent result type should be empty",
406 query.getParentResultType());
408 "result type should be vnfc",
410 query.getResultType());
412 "container type should be empty",
414 query.getContainerType());
415 assertEquals("dependent",true, query.isDependent());
420 * Gets the all query param naming exception.
422 * @return the all query param naming exception
423 * @throws UnsupportedEncodingException the unsupported encoding exception
424 * @throws AAIException the AAI exception
427 public void getAllQueryParamNamingException() throws UnsupportedEncodingException, AAIException {
428 URI uri = UriBuilder.fromPath("network/vces/vce/key1/port-groups/port-group/key2/cvlan-tags").build();
429 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
430 map.putSingle("cvlan-tag", "333");
431 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
433 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
434 .has("vnf-id", "key1").has("aai-node-type", "vce")
435 .in("org.onap.relationships.inventory.BelongsTo")
436 .has("aai-node-type", "port-group")
437 .has("interface-id", "key2").in("org.onap.relationships.inventory.BelongsTo")
438 .has("aai-node-type", "cvlan-tag")
439 .has("cvlan-tag", 333);
440 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
441 .has("vnf-id", "key1").has("aai-node-type", "vce")
442 .in("org.onap.relationships.inventory.BelongsTo")
443 .has("aai-node-type", "port-group")
444 .has("interface-id", "key2");
446 "gremlin query should be " + expected.toString(),
448 query.getQueryBuilder().getQuery().toString());
450 "parent gremlin query should be equal the query for port group",
451 expectedParent.toString(),
452 query.getQueryBuilder().getParentQuery().getQuery().toString());
454 "result type should be port-group",
456 query.getParentResultType());
458 "result type should be cvlan-tag",
460 query.getResultType());
462 "container type should be cvlan-tags",
464 query.getContainerType());
465 assertEquals("dependent",true, query.isDependent());
473 * @throws UnsupportedEncodingException the unsupported encoding exception
474 * @throws AAIException the AAI exception
477 public void abstractType() throws UnsupportedEncodingException, AAIException {
478 URI uri = UriBuilder.fromPath("vnf/key1").build();
480 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
482 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
483 .has("vnf-id", "key1").has(AAIProperties.NODE_TYPE, P.within("vce", "generic-vnf"));
485 GraphTraversal<Vertex, Vertex> expectedParent = expected;
487 "gremlin query should be " + expected.toString(),
489 query.getQueryBuilder().getQuery().toString());
491 "parent gremlin query should be equal the query for port group",
492 expectedParent.toString(),
493 query.getQueryBuilder().getParentQuery().getQuery().toString());
495 "result type should be empty",
497 query.getParentResultType());
499 "result type should be vnf",
501 query.getResultType());
503 assertEquals("dependent",false, query.isDependent());
509 * Non parent abstract type.
511 * @throws UnsupportedEncodingException the unsupported encoding exception
512 * @throws AAIException the AAI exception
515 public void nonParentAbstractType() throws UnsupportedEncodingException, AAIException {
516 URI uri = UriBuilder.fromPath("cloud-infrastructure/pservers/pserver/key2/vnf/key1").build();
517 thrown.expect(AAIException.class);
518 thrown.expectMessage(containsString("not a valid path"));
519 dbEngine.getQueryBuilder().createQueryFromURI(uri);
523 public void parentAbstractTypeWithNesting() throws UnsupportedEncodingException, AAIException {
524 URI uri = UriBuilder.fromPath("vnf/key1/vf-modules/vf-module/key2").build();
526 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
528 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
529 .has("vnf-id", "key1").has(AAIProperties.NODE_TYPE, P.within("vce", "generic-vnf"))
530 .union(__.in("org.onap.relationships.inventory.BelongsTo").has(AAIProperties.NODE_TYPE, "vf-module")).has("vf-module-id", "key2");
532 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
533 .has("vnf-id", "key1").has(AAIProperties.NODE_TYPE, P.within("vce", "generic-vnf"));
535 "gremlin query should be " + expected.toString(),
537 query.getQueryBuilder().getQuery().toString());
539 "parent gremlin query should be equal the query for ",
540 expectedParent.toString(),
541 query.getQueryBuilder().getParentQuery().getQuery().toString());
543 "result type should be vnf",
545 query.getParentResultType());
547 "result type should be vf-module",
549 query.getResultType());
551 assertEquals("dependent",true, query.isDependent());
556 public void getViaBadQueryParam() throws UnsupportedEncodingException, AAIException {
557 URI uri = UriBuilder.fromPath("cloud-infrastructure/cloud-regions/cloud-region/a/b/tenants/tenant").build();
558 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
559 map.putSingle("tenant-n231ame", "Tenant1");
560 thrown.expect(AAIException.class);
561 thrown.expect(hasProperty("code", is("AAI_3000")));
563 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
568 public void getPluralViaBadQueryParam() throws UnsupportedEncodingException, AAIException {
569 URI uri = UriBuilder.fromPath("cloud-infrastructure/cloud-regions/cloud-region/a/b/tenants").build();
570 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
571 map.putSingle("tenant-n231ame", "Tenant1");
572 thrown.expect(AAIException.class);
573 thrown.expect(hasProperty("code", is("AAI_3000")));
575 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
580 public void getPluralViaDuplicateQueryParam() throws UnsupportedEncodingException, AAIException {
581 URI uri = UriBuilder.fromPath("network/vnfcs").build();
582 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
583 List<String> values = new ArrayList<>();
589 map.put("prov-status", values);
590 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
591 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
592 .has("aai-node-type", "vnfc")
593 .has("prov-status", P.within(values));
595 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
596 .has("aai-node-type", "vnfc");
599 "gremlin query should be " + expected.toString(),
601 query.getQueryBuilder().getQuery().toString());
604 expectedParent.toString(),
605 query.getQueryBuilder().getParentQuery().getQuery().toString());
607 "parent result type should be empty",
609 query.getParentResultType());
611 "result type should be vnfc",
613 query.getResultType());
615 "container type should be empty",
617 query.getContainerType());
618 assertEquals("dependent",true, query.isDependent());
623 public void dbAliasedSearch() throws UnsupportedEncodingException, AAIException {
624 URI uri = UriBuilder.fromPath("network/generic-vnfs").build();
625 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
626 map.putSingle("persona-model-customization-id", "key2");
627 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri, map);
628 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
629 .has("aai-node-type", "generic-vnf")
630 .has("model-customization-id", "key2");
631 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
632 .has("aai-node-type", "generic-vnf");
635 "gremlin query should be " + expected.toString(),
637 query.getQueryBuilder().getQuery().toString());
640 expectedParent.toString(),
641 query.getQueryBuilder().getParentQuery().getQuery().toString());
644 "result type should be",
646 query.getResultType());
648 "result type should be empty",
650 query.getParentResultType());
651 assertEquals("dependent",true, query.isDependent());
657 public void dataLinkedSearch() throws UnsupportedEncodingException, AAIException {
658 URI uri = UriBuilder.fromPath("network/vpn-bindings").build();
659 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
660 map.putSingle("global-route-target", "key2");
661 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri, map);
662 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
663 .has("aai-node-type", "vpn-binding")
664 .where(__.in("org.onap.relationships.inventory.BelongsTo").has(AAIProperties.NODE_TYPE, "route-target").has("global-route-target", "key2"));
665 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
666 .has("aai-node-type", "vpn-binding");
669 "gremlin query should be " + expected.toString(),
671 query.getQueryBuilder().getQuery().toString());
674 expectedParent.toString(),
675 query.getQueryBuilder().getParentQuery().getQuery().toString());
678 "result type should be",
680 query.getResultType());
682 "result type should be empty",
684 query.getParentResultType());
685 assertEquals("dependent",true, query.isDependent());
689 public void pluralCousin() throws UnsupportedEncodingException, AAIException {
690 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/related-to/pservers").build();
692 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);
693 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
694 .has("physical-location-id", "key1")
695 .has("aai-node-type", "complex")
696 .in("org.onap.relationships.inventory.LocatedIn").has("aai-node-type", "pserver");
697 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
698 .has("physical-location-id", "key1")
699 .has("aai-node-type", "complex");
702 "gremlin query should be " + expected.toString(),
704 query.getQueryBuilder().getQuery().toString());
707 expectedParent.toString(),
708 query.getQueryBuilder().getParentQuery().getQuery().toString());
711 "result type should be",
713 query.getResultType());
715 "result type should be",
717 query.getParentResultType());
718 //this is controversial but we're not allowing writes on this currently
719 assertEquals("dependent",true, query.isDependent());
723 public void specificCousin() throws UnsupportedEncodingException, AAIException {
724 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/related-to/pservers/pserver/key2").build();
726 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);
727 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
728 .has("physical-location-id", "key1")
729 .has("aai-node-type", "complex")
730 .in("org.onap.relationships.inventory.LocatedIn").has("aai-node-type", "pserver")
731 .has("hostname", "key2");
732 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
733 .has("physical-location-id", "key1")
734 .has("aai-node-type", "complex");
737 "gremlin query should be " + expected.toString(),
739 query.getQueryBuilder().getQuery().toString());
742 expectedParent.toString(),
743 query.getQueryBuilder().getParentQuery().getQuery().toString());
746 "result type should be",
748 query.getResultType());
750 "result type should be",
752 query.getParentResultType());
753 //this is controversial but we're not allowing writes on this currently
754 assertEquals("dependent",true, query.isDependent());
758 public void doubleSpecificCousin() throws UnsupportedEncodingException, AAIException {
759 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/related-to/pservers/pserver/key2/related-to/vservers/vserver/key3").build();
761 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);
762 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
763 .has("physical-location-id", "key1")
764 .has("aai-node-type", "complex")
765 .in("org.onap.relationships.inventory.LocatedIn").has("aai-node-type", "pserver")
766 .has("hostname", "key2")
767 .in("tosca.relationships.HostedOn").has("aai-node-type", "vserver")
768 .has("vserver-id", "key3");
769 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
770 .has("physical-location-id", "key1")
771 .has("aai-node-type", "complex")
772 .in("org.onap.relationships.inventory.LocatedIn").has("aai-node-type", "pserver")
773 .has("hostname", "key2");
776 "gremlin query should be " + expected.toString(),
778 query.getQueryBuilder().getQuery().toString());
781 expectedParent.toString(),
782 query.getQueryBuilder().getParentQuery().getQuery().toString());
785 "result type should be",
787 query.getResultType());
789 "result type should be",
791 query.getParentResultType());
792 //this is controversial but we're not allowing writes on this currently
793 assertEquals("dependent",true, query.isDependent());
797 public void traversalEndsInRelatedTo() throws UnsupportedEncodingException, AAIException {
798 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/related-to").build();
800 thrown.expect(AAIException.class);
801 thrown.expectMessage(containsString(RestTokens.COUSIN.toString()));
802 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);
807 public void pluralCousinToPluralCousin() throws UnsupportedEncodingException, AAIException {
808 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/related-to/pservers").build();
810 thrown.expect(AAIException.class);
811 thrown.expectMessage(containsString("chain plurals"));
812 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);