2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 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=========================================================
21 package org.openecomp.aai.parsers.query;
23 import static org.hamcrest.CoreMatchers.containsString;
24 import static org.hamcrest.Matchers.hasProperty;
25 import static org.hamcrest.Matchers.is;
26 import static org.junit.Assert.assertEquals;
28 import java.io.UnsupportedEncodingException;
30 import java.util.ArrayList;
31 import java.util.List;
33 import javax.ws.rs.core.MultivaluedHashMap;
34 import javax.ws.rs.core.MultivaluedMap;
35 import javax.ws.rs.core.UriBuilder;
37 import org.apache.tinkerpop.gremlin.process.traversal.P;
38 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
39 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
40 import org.apache.tinkerpop.gremlin.structure.Vertex;
41 import org.junit.BeforeClass;
42 import org.junit.Ignore;
43 import org.junit.Rule;
44 import org.junit.Test;
45 import org.junit.rules.ExpectedException;
47 import org.openecomp.aai.db.props.AAIProperties;
48 import org.openecomp.aai.exceptions.AAIException;
49 import org.openecomp.aai.introspection.LoaderFactory;
50 import org.openecomp.aai.introspection.ModelType;
51 import org.openecomp.aai.introspection.Version;
52 import org.openecomp.aai.rest.RestTokens;
53 import org.openecomp.aai.serialization.engines.QueryStyle;
54 import org.openecomp.aai.serialization.engines.TitanDBEngine;
55 import org.openecomp.aai.serialization.engines.TransactionalGraphEngine;
56 import org.openecomp.aai.serialization.queryformats.QueryFormatTestHelper;
57 import org.openecomp.aai.util.AAIConstants;
60 public class GraphTraversalTest {
62 private static TransactionalGraphEngine dbEngine;
64 private static TransactionalGraphEngine dbEnginev9;
67 public ExpectedException thrown = ExpectedException.none();
72 * @throws SecurityException
73 * @throws NoSuchFieldException
76 public static void configure() throws NoSuchFieldException, SecurityException, Exception {
77 System.setProperty("AJSC_HOME", ".");
78 System.setProperty("BUNDLECONFIG_DIR", "src/test/resources/bundleconfig-local");
79 QueryFormatTestHelper.setFinalStatic(AAIConstants.class.getField("AAI_HOME_ETC_OXM"), "src/test/resources/org/openecomp/aai/introspection/");
81 new TitanDBEngine(QueryStyle.TRAVERSAL,
82 LoaderFactory.createLoaderForVersion(ModelType.MOXY, AAIProperties.LATEST),
86 new TitanDBEngine(QueryStyle.TRAVERSAL,
87 LoaderFactory.createLoaderForVersion(ModelType.MOXY, Version.v9),
94 * @throws UnsupportedEncodingException the unsupported encoding exception
95 * @throws AAIException the AAI exception
98 public void parentQuery() throws UnsupportedEncodingException, AAIException {
99 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1").build();
101 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
103 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start().has("physical-location-id", "key1").has("aai-node-type", "complex");
105 "gremlin query should be " + expected.toString(),
107 query.getQueryBuilder().getQuery().toString());
109 "parent gremlin query should be equal to normal query",
111 query.getQueryBuilder().getParentQuery().getQuery().toString());
113 "result type should be complex",
115 query.getResultType());
117 "result type should be empty",
119 query.getParentResultType());
120 assertEquals("dependent",false, query.isDependent());
128 * @throws UnsupportedEncodingException the unsupported encoding exception
129 * @throws AAIException the AAI exception
132 public void childQuery() throws UnsupportedEncodingException, AAIException {
133 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/ctag-pools/ctag-pool/key2/key3").build();
134 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
135 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
136 .has("physical-location-id", "key1").has("aai-node-type", "complex")
138 .has("aai-node-type", "ctag-pool")
139 .has("target-pe", "key2").has("availability-zone-name", "key3");
140 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
141 .has("physical-location-id", "key1").has("aai-node-type", "complex");
143 "gremlin query should be " + expected.toString(),
145 query.getQueryBuilder().getQuery().toString());
147 "parent gremlin query should be equal the query for complex",
148 expectedParent.toString(),
149 query.getQueryBuilder().getParentQuery().getQuery().toString());
151 "result type should be complex",
153 query.getParentResultType());
155 "result type should be ctag-pool",
157 query.getResultType());
158 assertEquals("dependent",true, query.isDependent());
166 * @throws UnsupportedEncodingException the unsupported encoding exception
167 * @throws AAIException the AAI exception
170 public void namingExceptions() throws UnsupportedEncodingException, AAIException {
171 URI uri = UriBuilder.fromPath("network/vces/vce/key1/port-groups/port-group/key2/cvlan-tags/cvlan-tag/655").build();
172 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
173 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
174 .has("vnf-id", "key1").has("aai-node-type", "vce")
176 .has("aai-node-type", "port-group")
177 .has("interface-id", "key2").out("hasCTag")
178 .has("aai-node-type", "cvlan-tag")
179 .has("cvlan-tag", 655);
180 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
181 .has("vnf-id", "key1").has("aai-node-type", "vce")
183 .has("aai-node-type", "port-group")
184 .has("interface-id", "key2");
186 "gremlin query should be " + expected.toString(),
188 query.getQueryBuilder().getQuery().toString());
190 "parent gremlin query should be equal the query for port group",
191 expectedParent.toString(),
192 query.getQueryBuilder().getParentQuery().getQuery().toString());
194 "result type should be cvlan-tag",
196 query.getResultType());
198 "result type should be port-group",
200 query.getParentResultType());
202 "contaner type should be empty",
204 query.getContainerType());
205 assertEquals("dependent",true, query.isDependent());
214 * @throws UnsupportedEncodingException the unsupported encoding exception
215 * @throws AAIException the AAI exception
218 public void getAll() throws UnsupportedEncodingException, AAIException {
219 URI uri = UriBuilder.fromPath("network/vces/vce/key1/port-groups/port-group/key2/cvlan-tags").build();
220 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
221 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
222 .has("vnf-id", "key1").has("aai-node-type", "vce")
224 .has("aai-node-type", "port-group")
225 .has("interface-id", "key2").out("hasCTag")
226 .has("aai-node-type", "cvlan-tag");
227 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
228 .has("vnf-id", "key1").has("aai-node-type", "vce")
230 .has("aai-node-type", "port-group")
231 .has("interface-id", "key2");
233 "gremlin query should be " + expected.toString(),
235 query.getQueryBuilder().getQuery().toString());
237 "parent gremlin query should be equal the query for port group",
238 expectedParent.toString(),
239 query.getQueryBuilder().getParentQuery().getQuery().toString());
241 "result type should be port-group",
243 query.getParentResultType());
245 "result type should be cvlan-tag",
247 query.getResultType());
249 "container type should be cvlan-tags",
251 query.getContainerType());
252 assertEquals("dependent",true, query.isDependent());
258 public void getAllParent() throws UnsupportedEncodingException, AAIException {
259 URI uri = UriBuilder.fromPath("cloud-infrastructure/pservers").build();
260 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
261 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
262 .has("aai-node-type", "pserver");
263 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
264 .has("aai-node-type", "pserver");
266 "gremlin query should be " + expected.toString(),
268 query.getQueryBuilder().getQuery().toString());
270 "parent gremlin query should be equal the query for pserver",
271 expectedParent.toString(),
272 query.getQueryBuilder().getParentQuery().getQuery().toString());
274 "parent result type should be empty",
276 query.getParentResultType());
278 "result type should be pserver",
280 query.getResultType());
282 "container type should be pservers",
284 query.getContainerType());
285 assertEquals("dependent",false, query.isDependent());
292 * Gets the via query param.
294 * @return the via query param
295 * @throws UnsupportedEncodingException the unsupported encoding exception
296 * @throws AAIException the AAI exception
299 public void getViaQueryParam() throws UnsupportedEncodingException, AAIException {
300 URI uri = UriBuilder.fromPath("cloud-infrastructure/cloud-regions/cloud-region/mycloudowner/mycloudregionid/tenants/tenant").build();
301 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
302 map.putSingle("tenant-name", "Tenant1");
303 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
304 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
305 .has("cloud-owner", "mycloudowner").has("cloud-region-id", "mycloudregionid")
306 .has("aai-node-type", "cloud-region")
308 .has("aai-node-type", "tenant")
309 .has("tenant-name", "Tenant1");
311 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
312 .has("cloud-owner", "mycloudowner").has("cloud-region-id", "mycloudregionid")
313 .has("aai-node-type", "cloud-region");
316 "gremlin query should be " + expected.toString(),
318 query.getQueryBuilder().getQuery().toString());
320 "parent gremlin query should be equal the query for cloud-region",
321 expectedParent.toString(),
322 query.getQueryBuilder().getParentQuery().getQuery().toString());
324 "result type should be cloud-region",
326 query.getParentResultType());
328 "result type should be tenant",
330 query.getResultType());
332 "container type should be empty",
334 query.getContainerType());
335 assertEquals("dependent",true, query.isDependent());
340 public void getViaDuplicateQueryParam() throws UnsupportedEncodingException, AAIException {
341 URI uri = UriBuilder.fromPath("cloud-infrastructure/cloud-regions/cloud-region/mycloudowner/mycloudregionid/tenants/tenant").build();
342 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
343 List<String> values = new ArrayList<>();
344 values.add("Tenant1");
345 values.add("Tenant2");
346 map.put("tenant-name", values);
347 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
348 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
349 .has("cloud-owner", "mycloudowner").has("cloud-region-id", "mycloudregionid")
350 .has("aai-node-type", "cloud-region")
352 .has("aai-node-type", "tenant")
353 .has("tenant-name", P.within(values));
355 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
356 .has("cloud-owner", "mycloudowner").has("cloud-region-id", "mycloudregionid")
357 .has("aai-node-type", "cloud-region");
360 "gremlin query should be " + expected.toString(),
362 query.getQueryBuilder().getQuery().toString());
364 "parent gremlin query should be equal the query for cloud-region",
365 expectedParent.toString(),
366 query.getQueryBuilder().getParentQuery().getQuery().toString());
368 "result type should be cloud-region",
370 query.getParentResultType());
372 "result type should be tenant",
374 query.getResultType());
376 "container type should be empty",
378 query.getContainerType());
379 assertEquals("dependent",true, query.isDependent());
384 * Gets the plural via query param.
386 * @return the plural via query param
387 * @throws UnsupportedEncodingException the unsupported encoding exception
388 * @throws AAIException the AAI exception
391 public void getPluralViaQueryParam() throws UnsupportedEncodingException, AAIException {
392 URI uri = UriBuilder.fromPath("network/vnfcs").build();
393 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
394 map.putSingle("prov-status", "up");
395 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
396 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
397 .has("aai-node-type", "vnfc")
398 .has("prov-status", "up");
400 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
401 .has("aai-node-type", "vnfc");
404 "gremlin query should be " + expected.toString(),
406 query.getQueryBuilder().getQuery().toString());
409 expectedParent.toString(),
410 query.getQueryBuilder().getParentQuery().getQuery().toString());
412 "parent result type should be empty",
414 query.getParentResultType());
416 "result type should be vnfc",
418 query.getResultType());
420 "container type should be empty",
422 query.getContainerType());
423 assertEquals("dependent",true, query.isDependent());
428 * Gets the all query param naming exception.
430 * @return the all query param naming exception
431 * @throws UnsupportedEncodingException the unsupported encoding exception
432 * @throws AAIException the AAI exception
435 public void getAllQueryParamNamingException() throws UnsupportedEncodingException, AAIException {
436 URI uri = UriBuilder.fromPath("network/vces/vce/key1/port-groups/port-group/key2/cvlan-tags").build();
437 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
438 map.putSingle("cvlan-tag", "333");
439 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
441 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
442 .has("vnf-id", "key1").has("aai-node-type", "vce")
444 .has("aai-node-type", "port-group")
445 .has("interface-id", "key2").out("hasCTag")
446 .has("aai-node-type", "cvlan-tag")
447 .has("cvlan-tag", 333);
448 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
449 .has("vnf-id", "key1").has("aai-node-type", "vce")
451 .has("aai-node-type", "port-group")
452 .has("interface-id", "key2");
454 "gremlin query should be " + expected.toString(),
456 query.getQueryBuilder().getQuery().toString());
458 "parent gremlin query should be equal the query for port group",
459 expectedParent.toString(),
460 query.getQueryBuilder().getParentQuery().getQuery().toString());
462 "result type should be port-group",
464 query.getParentResultType());
466 "result type should be cvlan-tag",
468 query.getResultType());
470 "container type should be cvlan-tags",
472 query.getContainerType());
473 assertEquals("dependent",true, query.isDependent());
481 * @throws UnsupportedEncodingException the unsupported encoding exception
482 * @throws AAIException the AAI exception
485 public void abstractType() throws UnsupportedEncodingException, AAIException {
486 URI uri = UriBuilder.fromPath("vnf/key1").build();
488 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
490 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
491 .has("vnf-id", "key1").has(AAIProperties.NODE_TYPE, P.within("vce", "generic-vnf"));
493 GraphTraversal<Vertex, Vertex> expectedParent = expected;
495 "gremlin query should be " + expected.toString(),
497 query.getQueryBuilder().getQuery().toString());
499 "parent gremlin query should be equal the query for port group",
500 expectedParent.toString(),
501 query.getQueryBuilder().getParentQuery().getQuery().toString());
503 "result type should be empty",
505 query.getParentResultType());
507 "result type should be vnf",
509 query.getResultType());
511 assertEquals("dependent",false, query.isDependent());
517 * Non parent abstract type.
519 * @throws UnsupportedEncodingException the unsupported encoding exception
520 * @throws AAIException the AAI exception
523 public void nonParentAbstractType() throws UnsupportedEncodingException, AAIException {
524 URI uri = UriBuilder.fromPath("cloud-infrastructure/pservers/pserver/key2/vnf/key1").build();
525 thrown.expect(AAIException.class);
526 thrown.expectMessage(containsString("not a valid path"));
527 dbEngine.getQueryBuilder().createQueryFromURI(uri);
531 public void parentAbstractTypeWithNesting() throws UnsupportedEncodingException, AAIException {
532 URI uri = UriBuilder.fromPath("vnf/key1/vf-modules/vf-module/key2").build();
534 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
536 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
537 .has("vnf-id", "key1").has(AAIProperties.NODE_TYPE, P.within("vce", "generic-vnf"))
538 .union(__.out("has").has(AAIProperties.NODE_TYPE, "vf-module")).has("vf-module-id", "key2");
540 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
541 .has("vnf-id", "key1").has(AAIProperties.NODE_TYPE, P.within("vce", "generic-vnf"));
543 "gremlin query should be " + expected.toString(),
545 query.getQueryBuilder().getQuery().toString());
547 "parent gremlin query should be equal the query for ",
548 expectedParent.toString(),
549 query.getQueryBuilder().getParentQuery().getQuery().toString());
551 "result type should be vnf",
553 query.getParentResultType());
555 "result type should be vf-module",
557 query.getResultType());
559 assertEquals("dependent",true, query.isDependent());
564 public void getViaBadQueryParam() throws UnsupportedEncodingException, AAIException {
565 URI uri = UriBuilder.fromPath("cloud-infrastructure/cloud-regions/cloud-region/a/b/tenants/tenant").build();
566 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
567 map.putSingle("tenant-n231ame", "Tenant1");
568 thrown.expect(AAIException.class);
569 thrown.expect(hasProperty("code", is("AAI_3000")));
571 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
576 public void getPluralViaBadQueryParam() throws UnsupportedEncodingException, AAIException {
577 URI uri = UriBuilder.fromPath("cloud-infrastructure/cloud-regions/cloud-region/a/b/tenants").build();
578 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
579 map.putSingle("tenant-n231ame", "Tenant1");
580 thrown.expect(AAIException.class);
581 thrown.expect(hasProperty("code", is("AAI_3000")));
583 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
588 public void getPluralViaDuplicateQueryParam() throws UnsupportedEncodingException, AAIException {
589 URI uri = UriBuilder.fromPath("network/vnfcs").build();
590 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
591 List<String> values = new ArrayList<>();
597 map.put("prov-status", values);
598 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
599 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
600 .has("aai-node-type", "vnfc")
601 .has("prov-status", P.within(values));
603 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
604 .has("aai-node-type", "vnfc");
607 "gremlin query should be " + expected.toString(),
609 query.getQueryBuilder().getQuery().toString());
612 expectedParent.toString(),
613 query.getQueryBuilder().getParentQuery().getQuery().toString());
615 "parent result type should be empty",
617 query.getParentResultType());
619 "result type should be vnfc",
621 query.getResultType());
623 "container type should be empty",
625 query.getContainerType());
626 assertEquals("dependent",true, query.isDependent());
631 public void dbAliasedSearch() throws UnsupportedEncodingException, AAIException {
632 URI uri = UriBuilder.fromPath("network/test-objects").build();
633 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
634 map.putSingle("persona-model-customization-id", "key2");
635 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri, map);
636 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
637 .has("aai-node-type", "test-object")
638 .has("model-customization-id", "key2");
639 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
640 .has("aai-node-type", "test-object");
643 "gremlin query should be " + expected.toString(),
645 query.getQueryBuilder().getQuery().toString());
648 expectedParent.toString(),
649 query.getQueryBuilder().getParentQuery().getQuery().toString());
652 "result type should be",
654 query.getResultType());
656 "result type should be empty",
658 query.getParentResultType());
659 assertEquals("dependent",true, query.isDependent());
665 public void dataLinkedSearch() throws UnsupportedEncodingException, AAIException {
666 URI uri = UriBuilder.fromPath("network/vpn-bindings").build();
667 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
668 map.putSingle("global-route-target", "key2");
669 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri, map);
670 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
671 .has("aai-node-type", "vpn-binding")
672 .where(__.out("has").has(AAIProperties.NODE_TYPE, "route-target").has("global-route-target", "key2"));
673 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
674 .has("aai-node-type", "vpn-binding");
677 "gremlin query should be " + expected.toString(),
679 query.getQueryBuilder().getQuery().toString());
682 expectedParent.toString(),
683 query.getQueryBuilder().getParentQuery().getQuery().toString());
686 "result type should be",
688 query.getResultType());
690 "result type should be empty",
692 query.getParentResultType());
693 assertEquals("dependent",true, query.isDependent());
698 public void pluralCousin() throws UnsupportedEncodingException, AAIException {
699 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/related-to/pservers").build();
701 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);
702 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
703 .has("physical-location-id", "key1")
704 .has("aai-node-type", "complex")
705 .in("locatedIn").has("aai-node-type", "pserver");
706 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
707 .has("physical-location-id", "key1")
708 .has("aai-node-type", "complex");
711 "gremlin query should be " + expected.toString(),
713 query.getQueryBuilder().getQuery().toString());
716 expectedParent.toString(),
717 query.getQueryBuilder().getParentQuery().getQuery().toString());
720 "result type should be",
722 query.getResultType());
724 "result type should be",
726 query.getParentResultType());
727 //this is controversial but we're not allowing writes on this currently
728 assertEquals("dependent",true, query.isDependent());
733 public void specificCousin() throws UnsupportedEncodingException, AAIException {
734 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/related-to/pservers/pserver/key2").build();
736 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);
737 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
738 .has("physical-location-id", "key1")
739 .has("aai-node-type", "complex")
740 .in("locatedIn").has("aai-node-type", "pserver")
741 .has("hostname", "key2");
742 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
743 .has("physical-location-id", "key1")
744 .has("aai-node-type", "complex");
747 "gremlin query should be " + expected.toString(),
749 query.getQueryBuilder().getQuery().toString());
752 expectedParent.toString(),
753 query.getQueryBuilder().getParentQuery().getQuery().toString());
756 "result type should be",
758 query.getResultType());
760 "result type should be",
762 query.getParentResultType());
763 //this is controversial but we're not allowing writes on this currently
764 assertEquals("dependent",true, query.isDependent());
769 public void doubleSpecificCousin() throws UnsupportedEncodingException, AAIException {
770 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/related-to/pservers/pserver/key2/related-to/vservers/vserver/key3").build();
772 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);
773 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
774 .has("physical-location-id", "key1")
775 .has("aai-node-type", "complex")
776 .in("locatedIn").has("aai-node-type", "pserver")
777 .has("hostname", "key2")
778 .in("runsOnPserver").has("aai-node-type", "vserver")
779 .has("vserver-id", "key3");
780 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
781 .has("physical-location-id", "key1")
782 .has("aai-node-type", "complex")
783 .in("locatedIn").has("aai-node-type", "pserver")
784 .has("hostname", "key2");
787 "gremlin query should be " + expected.toString(),
789 query.getQueryBuilder().getQuery().toString());
792 expectedParent.toString(),
793 query.getQueryBuilder().getParentQuery().getQuery().toString());
796 "result type should be",
798 query.getResultType());
800 "result type should be",
802 query.getParentResultType());
803 //this is controversial but we're not allowing writes on this currently
804 assertEquals("dependent",true, query.isDependent());
809 public void traversalEndsInRelatedTo() throws UnsupportedEncodingException, AAIException {
810 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/related-to").build();
812 thrown.expect(AAIException.class);
813 thrown.expectMessage(containsString(RestTokens.COUSIN.toString()));
814 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);
820 public void pluralCousinToPluralCousin() throws UnsupportedEncodingException, AAIException {
821 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/related-to/pservers").build();
823 thrown.expect(AAIException.class);
824 thrown.expectMessage(containsString("chain plurals"));
825 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);