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 org.apache.tinkerpop.gremlin.process.traversal.P;
24 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
25 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
26 import org.apache.tinkerpop.gremlin.structure.Vertex;
27 import org.junit.Before;
28 import org.junit.Rule;
29 import org.junit.Test;
30 import org.junit.rules.ExpectedException;
31 import org.openecomp.aai.AAISetup;
32 import org.openecomp.aai.db.props.AAIProperties;
33 import org.openecomp.aai.exceptions.AAIException;
34 import org.openecomp.aai.introspection.LoaderFactory;
35 import org.openecomp.aai.introspection.ModelType;
36 import org.openecomp.aai.introspection.Version;
37 import org.openecomp.aai.rest.RestTokens;
38 import org.openecomp.aai.serialization.engines.QueryStyle;
39 import org.openecomp.aai.serialization.engines.TitanDBEngine;
40 import org.openecomp.aai.serialization.engines.TransactionalGraphEngine;
42 import javax.ws.rs.core.MultivaluedHashMap;
43 import javax.ws.rs.core.MultivaluedMap;
44 import javax.ws.rs.core.UriBuilder;
45 import java.io.UnsupportedEncodingException;
47 import java.util.ArrayList;
48 import java.util.List;
50 import static org.hamcrest.CoreMatchers.containsString;
51 import static org.hamcrest.Matchers.hasProperty;
52 import static org.hamcrest.Matchers.is;
53 import static org.junit.Assert.assertEquals;
55 public class GraphTraversalTest extends AAISetup {
57 private TransactionalGraphEngine dbEngine;
58 private TransactionalGraphEngine dbEnginev9;
61 public ExpectedException thrown = ExpectedException.none();
66 * @throws SecurityException
67 * @throws NoSuchFieldException
70 public void configure() throws Exception {
72 new TitanDBEngine(QueryStyle.TRAVERSAL,
73 LoaderFactory.createLoaderForVersion(ModelType.MOXY, AAIProperties.LATEST),
77 new TitanDBEngine(QueryStyle.TRAVERSAL,
78 LoaderFactory.createLoaderForVersion(ModelType.MOXY, Version.v9),
85 * @throws UnsupportedEncodingException the unsupported encoding exception
86 * @throws AAIException the AAI exception
89 public void parentQuery() throws UnsupportedEncodingException, AAIException {
90 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1").build();
92 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
94 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start().has("physical-location-id", "key1").has("aai-node-type", "complex");
96 "gremlin query should be " + expected.toString(),
98 query.getQueryBuilder().getQuery().toString());
100 "parent gremlin query should be equal to normal query",
102 query.getQueryBuilder().getParentQuery().getQuery().toString());
104 "result type should be complex",
106 query.getResultType());
108 "result type should be empty",
110 query.getParentResultType());
111 assertEquals("dependent",false, query.isDependent());
119 * @throws UnsupportedEncodingException the unsupported encoding exception
120 * @throws AAIException the AAI exception
123 public void childQuery() throws UnsupportedEncodingException, AAIException {
124 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/ctag-pools/ctag-pool/key2/key3").build();
125 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
126 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
127 .has("physical-location-id", "key1").has("aai-node-type", "complex")
129 .has("aai-node-type", "ctag-pool")
130 .has("target-pe", "key2").has("availability-zone-name", "key3");
131 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
132 .has("physical-location-id", "key1").has("aai-node-type", "complex");
134 "gremlin query should be " + expected.toString(),
136 query.getQueryBuilder().getQuery().toString());
138 "parent gremlin query should be equal the query for complex",
139 expectedParent.toString(),
140 query.getQueryBuilder().getParentQuery().getQuery().toString());
142 "result type should be complex",
144 query.getParentResultType());
146 "result type should be ctag-pool",
148 query.getResultType());
149 assertEquals("dependent",true, query.isDependent());
157 * @throws UnsupportedEncodingException the unsupported encoding exception
158 * @throws AAIException the AAI exception
161 public void namingExceptions() throws UnsupportedEncodingException, AAIException {
162 URI uri = UriBuilder.fromPath("network/vces/vce/key1/port-groups/port-group/key2/cvlan-tags/cvlan-tag/655").build();
163 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
164 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
165 .has("vnf-id", "key1").has("aai-node-type", "vce")
167 .has("aai-node-type", "port-group")
168 .has("interface-id", "key2").out("hasCTag")
169 .has("aai-node-type", "cvlan-tag")
170 .has("cvlan-tag", 655);
171 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
172 .has("vnf-id", "key1").has("aai-node-type", "vce")
174 .has("aai-node-type", "port-group")
175 .has("interface-id", "key2");
177 "gremlin query should be " + expected.toString(),
179 query.getQueryBuilder().getQuery().toString());
181 "parent gremlin query should be equal the query for port group",
182 expectedParent.toString(),
183 query.getQueryBuilder().getParentQuery().getQuery().toString());
185 "result type should be cvlan-tag",
187 query.getResultType());
189 "result type should be port-group",
191 query.getParentResultType());
193 "contaner type should be empty",
195 query.getContainerType());
196 assertEquals("dependent",true, query.isDependent());
205 * @throws UnsupportedEncodingException the unsupported encoding exception
206 * @throws AAIException the AAI exception
209 public void getAll() throws UnsupportedEncodingException, AAIException {
210 URI uri = UriBuilder.fromPath("network/vces/vce/key1/port-groups/port-group/key2/cvlan-tags").build();
211 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
212 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
213 .has("vnf-id", "key1").has("aai-node-type", "vce")
215 .has("aai-node-type", "port-group")
216 .has("interface-id", "key2").out("hasCTag")
217 .has("aai-node-type", "cvlan-tag");
218 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
219 .has("vnf-id", "key1").has("aai-node-type", "vce")
221 .has("aai-node-type", "port-group")
222 .has("interface-id", "key2");
224 "gremlin query should be " + expected.toString(),
226 query.getQueryBuilder().getQuery().toString());
228 "parent gremlin query should be equal the query for port group",
229 expectedParent.toString(),
230 query.getQueryBuilder().getParentQuery().getQuery().toString());
232 "result type should be port-group",
234 query.getParentResultType());
236 "result type should be cvlan-tag",
238 query.getResultType());
240 "container type should be cvlan-tags",
242 query.getContainerType());
243 assertEquals("dependent",true, query.isDependent());
249 public void getAllParent() throws UnsupportedEncodingException, AAIException {
250 URI uri = UriBuilder.fromPath("cloud-infrastructure/pservers").build();
251 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
252 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
253 .has("aai-node-type", "pserver");
254 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
255 .has("aai-node-type", "pserver");
257 "gremlin query should be " + expected.toString(),
259 query.getQueryBuilder().getQuery().toString());
261 "parent gremlin query should be equal the query for pserver",
262 expectedParent.toString(),
263 query.getQueryBuilder().getParentQuery().getQuery().toString());
265 "parent result type should be empty",
267 query.getParentResultType());
269 "result type should be pserver",
271 query.getResultType());
273 "container type should be pservers",
275 query.getContainerType());
276 assertEquals("dependent",false, query.isDependent());
283 * Gets the via query param.
285 * @return the via query param
286 * @throws UnsupportedEncodingException the unsupported encoding exception
287 * @throws AAIException the AAI exception
290 public void getViaQueryParam() throws UnsupportedEncodingException, AAIException {
291 URI uri = UriBuilder.fromPath("cloud-infrastructure/cloud-regions/cloud-region/mycloudowner/mycloudregionid/tenants/tenant").build();
292 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
293 map.putSingle("tenant-name", "Tenant1");
294 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
295 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
296 .has("cloud-owner", "mycloudowner").has("cloud-region-id", "mycloudregionid")
297 .has("aai-node-type", "cloud-region")
299 .has("aai-node-type", "tenant")
300 .has("tenant-name", "Tenant1");
302 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
303 .has("cloud-owner", "mycloudowner").has("cloud-region-id", "mycloudregionid")
304 .has("aai-node-type", "cloud-region");
307 "gremlin query should be " + expected.toString(),
309 query.getQueryBuilder().getQuery().toString());
311 "parent gremlin query should be equal the query for cloud-region",
312 expectedParent.toString(),
313 query.getQueryBuilder().getParentQuery().getQuery().toString());
315 "result type should be cloud-region",
317 query.getParentResultType());
319 "result type should be tenant",
321 query.getResultType());
323 "container type should be empty",
325 query.getContainerType());
326 assertEquals("dependent",true, query.isDependent());
331 public void getViaDuplicateQueryParam() throws UnsupportedEncodingException, AAIException {
332 URI uri = UriBuilder.fromPath("cloud-infrastructure/cloud-regions/cloud-region/mycloudowner/mycloudregionid/tenants/tenant").build();
333 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
334 List<String> values = new ArrayList<>();
335 values.add("Tenant1");
336 values.add("Tenant2");
337 map.put("tenant-name", values);
338 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
339 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
340 .has("cloud-owner", "mycloudowner").has("cloud-region-id", "mycloudregionid")
341 .has("aai-node-type", "cloud-region")
343 .has("aai-node-type", "tenant")
344 .has("tenant-name", P.within(values));
346 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
347 .has("cloud-owner", "mycloudowner").has("cloud-region-id", "mycloudregionid")
348 .has("aai-node-type", "cloud-region");
351 "gremlin query should be " + expected.toString(),
353 query.getQueryBuilder().getQuery().toString());
355 "parent gremlin query should be equal the query for cloud-region",
356 expectedParent.toString(),
357 query.getQueryBuilder().getParentQuery().getQuery().toString());
359 "result type should be cloud-region",
361 query.getParentResultType());
363 "result type should be tenant",
365 query.getResultType());
367 "container type should be empty",
369 query.getContainerType());
370 assertEquals("dependent",true, query.isDependent());
375 * Gets the plural via query param.
377 * @return the plural via query param
378 * @throws UnsupportedEncodingException the unsupported encoding exception
379 * @throws AAIException the AAI exception
382 public void getPluralViaQueryParam() throws UnsupportedEncodingException, AAIException {
383 URI uri = UriBuilder.fromPath("network/vnfcs").build();
384 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
385 map.putSingle("prov-status", "up");
386 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
387 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
388 .has("aai-node-type", "vnfc")
389 .has("prov-status", "up");
391 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
392 .has("aai-node-type", "vnfc");
395 "gremlin query should be " + expected.toString(),
397 query.getQueryBuilder().getQuery().toString());
400 expectedParent.toString(),
401 query.getQueryBuilder().getParentQuery().getQuery().toString());
403 "parent result type should be empty",
405 query.getParentResultType());
407 "result type should be vnfc",
409 query.getResultType());
411 "container type should be empty",
413 query.getContainerType());
414 assertEquals("dependent",true, query.isDependent());
419 * Gets the all query param naming exception.
421 * @return the all query param naming exception
422 * @throws UnsupportedEncodingException the unsupported encoding exception
423 * @throws AAIException the AAI exception
426 public void getAllQueryParamNamingException() throws UnsupportedEncodingException, AAIException {
427 URI uri = UriBuilder.fromPath("network/vces/vce/key1/port-groups/port-group/key2/cvlan-tags").build();
428 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
429 map.putSingle("cvlan-tag", "333");
430 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
432 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
433 .has("vnf-id", "key1").has("aai-node-type", "vce")
435 .has("aai-node-type", "port-group")
436 .has("interface-id", "key2").out("hasCTag")
437 .has("aai-node-type", "cvlan-tag")
438 .has("cvlan-tag", 333);
439 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
440 .has("vnf-id", "key1").has("aai-node-type", "vce")
442 .has("aai-node-type", "port-group")
443 .has("interface-id", "key2");
445 "gremlin query should be " + expected.toString(),
447 query.getQueryBuilder().getQuery().toString());
449 "parent gremlin query should be equal the query for port group",
450 expectedParent.toString(),
451 query.getQueryBuilder().getParentQuery().getQuery().toString());
453 "result type should be port-group",
455 query.getParentResultType());
457 "result type should be cvlan-tag",
459 query.getResultType());
461 "container type should be cvlan-tags",
463 query.getContainerType());
464 assertEquals("dependent",true, query.isDependent());
472 * @throws UnsupportedEncodingException the unsupported encoding exception
473 * @throws AAIException the AAI exception
476 public void abstractType() throws UnsupportedEncodingException, AAIException {
477 URI uri = UriBuilder.fromPath("vnf/key1").build();
479 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
481 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
482 .has("vnf-id", "key1").has(AAIProperties.NODE_TYPE, P.within("vce", "generic-vnf"));
484 GraphTraversal<Vertex, Vertex> expectedParent = expected;
486 "gremlin query should be " + expected.toString(),
488 query.getQueryBuilder().getQuery().toString());
490 "parent gremlin query should be equal the query for port group",
491 expectedParent.toString(),
492 query.getQueryBuilder().getParentQuery().getQuery().toString());
494 "result type should be empty",
496 query.getParentResultType());
498 "result type should be vnf",
500 query.getResultType());
502 assertEquals("dependent",false, query.isDependent());
508 * Non parent abstract type.
510 * @throws UnsupportedEncodingException the unsupported encoding exception
511 * @throws AAIException the AAI exception
514 public void nonParentAbstractType() throws UnsupportedEncodingException, AAIException {
515 URI uri = UriBuilder.fromPath("cloud-infrastructure/pservers/pserver/key2/vnf/key1").build();
516 thrown.expect(AAIException.class);
517 thrown.expectMessage(containsString("not a valid path"));
518 dbEngine.getQueryBuilder().createQueryFromURI(uri);
522 public void parentAbstractTypeWithNesting() throws UnsupportedEncodingException, AAIException {
523 URI uri = UriBuilder.fromPath("vnf/key1/vf-modules/vf-module/key2").build();
525 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri);
527 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
528 .has("vnf-id", "key1").has(AAIProperties.NODE_TYPE, P.within("vce", "generic-vnf"))
529 .union(__.out("has").has(AAIProperties.NODE_TYPE, "vf-module")).has("vf-module-id", "key2");
531 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
532 .has("vnf-id", "key1").has(AAIProperties.NODE_TYPE, P.within("vce", "generic-vnf"));
534 "gremlin query should be " + expected.toString(),
536 query.getQueryBuilder().getQuery().toString());
538 "parent gremlin query should be equal the query for ",
539 expectedParent.toString(),
540 query.getQueryBuilder().getParentQuery().getQuery().toString());
542 "result type should be vnf",
544 query.getParentResultType());
546 "result type should be vf-module",
548 query.getResultType());
550 assertEquals("dependent",true, query.isDependent());
555 public void getViaBadQueryParam() throws UnsupportedEncodingException, AAIException {
556 URI uri = UriBuilder.fromPath("cloud-infrastructure/cloud-regions/cloud-region/a/b/tenants/tenant").build();
557 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
558 map.putSingle("tenant-n231ame", "Tenant1");
559 thrown.expect(AAIException.class);
560 thrown.expect(hasProperty("code", is("AAI_3000")));
562 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
567 public void getPluralViaBadQueryParam() throws UnsupportedEncodingException, AAIException {
568 URI uri = UriBuilder.fromPath("cloud-infrastructure/cloud-regions/cloud-region/a/b/tenants").build();
569 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
570 map.putSingle("tenant-n231ame", "Tenant1");
571 thrown.expect(AAIException.class);
572 thrown.expect(hasProperty("code", is("AAI_3000")));
574 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
579 public void getPluralViaDuplicateQueryParam() throws UnsupportedEncodingException, AAIException {
580 URI uri = UriBuilder.fromPath("network/vnfcs").build();
581 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
582 List<String> values = new ArrayList<>();
588 map.put("prov-status", values);
589 QueryParser query = dbEngine.getQueryBuilder().createQueryFromURI(uri, map);
590 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
591 .has("aai-node-type", "vnfc")
592 .has("prov-status", P.within(values));
594 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
595 .has("aai-node-type", "vnfc");
598 "gremlin query should be " + expected.toString(),
600 query.getQueryBuilder().getQuery().toString());
603 expectedParent.toString(),
604 query.getQueryBuilder().getParentQuery().getQuery().toString());
606 "parent result type should be empty",
608 query.getParentResultType());
610 "result type should be vnfc",
612 query.getResultType());
614 "container type should be empty",
616 query.getContainerType());
617 assertEquals("dependent",true, query.isDependent());
622 public void dbAliasedSearch() throws UnsupportedEncodingException, AAIException {
623 URI uri = UriBuilder.fromPath("network/test-objects").build();
624 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
625 map.putSingle("persona-model-customization-id", "key2");
626 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri, map);
627 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
628 .has("aai-node-type", "test-object")
629 .has("model-customization-id", "key2");
630 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
631 .has("aai-node-type", "test-object");
634 "gremlin query should be " + expected.toString(),
636 query.getQueryBuilder().getQuery().toString());
639 expectedParent.toString(),
640 query.getQueryBuilder().getParentQuery().getQuery().toString());
643 "result type should be",
645 query.getResultType());
647 "result type should be empty",
649 query.getParentResultType());
650 assertEquals("dependent",true, query.isDependent());
656 public void dataLinkedSearch() throws UnsupportedEncodingException, AAIException {
657 URI uri = UriBuilder.fromPath("network/vpn-bindings").build();
658 MultivaluedMap<String, String> map = new MultivaluedHashMap<>();
659 map.putSingle("global-route-target", "key2");
660 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri, map);
661 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
662 .has("aai-node-type", "vpn-binding")
663 .where(__.out("has").has(AAIProperties.NODE_TYPE, "route-target").has("global-route-target", "key2"));
664 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
665 .has("aai-node-type", "vpn-binding");
668 "gremlin query should be " + expected.toString(),
670 query.getQueryBuilder().getQuery().toString());
673 expectedParent.toString(),
674 query.getQueryBuilder().getParentQuery().getQuery().toString());
677 "result type should be",
679 query.getResultType());
681 "result type should be empty",
683 query.getParentResultType());
684 assertEquals("dependent",true, query.isDependent());
688 public void pluralCousin() throws UnsupportedEncodingException, AAIException {
689 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/related-to/pservers").build();
691 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);
692 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
693 .has("physical-location-id", "key1")
694 .has("aai-node-type", "complex")
695 .in("locatedIn").has("aai-node-type", "pserver");
696 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
697 .has("physical-location-id", "key1")
698 .has("aai-node-type", "complex");
701 "gremlin query should be " + expected.toString(),
703 query.getQueryBuilder().getQuery().toString());
706 expectedParent.toString(),
707 query.getQueryBuilder().getParentQuery().getQuery().toString());
710 "result type should be",
712 query.getResultType());
714 "result type should be",
716 query.getParentResultType());
717 //this is controversial but we're not allowing writes on this currently
718 assertEquals("dependent",true, query.isDependent());
722 public void specificCousin() throws UnsupportedEncodingException, AAIException {
723 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/related-to/pservers/pserver/key2").build();
725 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);
726 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
727 .has("physical-location-id", "key1")
728 .has("aai-node-type", "complex")
729 .in("locatedIn").has("aai-node-type", "pserver")
730 .has("hostname", "key2");
731 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
732 .has("physical-location-id", "key1")
733 .has("aai-node-type", "complex");
736 "gremlin query should be " + expected.toString(),
738 query.getQueryBuilder().getQuery().toString());
741 expectedParent.toString(),
742 query.getQueryBuilder().getParentQuery().getQuery().toString());
745 "result type should be",
747 query.getResultType());
749 "result type should be",
751 query.getParentResultType());
752 //this is controversial but we're not allowing writes on this currently
753 assertEquals("dependent",true, query.isDependent());
757 public void doubleSpecificCousin() throws UnsupportedEncodingException, AAIException {
758 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/related-to/pservers/pserver/key2/related-to/vservers/vserver/key3").build();
760 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);
761 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
762 .has("physical-location-id", "key1")
763 .has("aai-node-type", "complex")
764 .in("locatedIn").has("aai-node-type", "pserver")
765 .has("hostname", "key2")
766 .in("runsOnPserver").has("aai-node-type", "vserver")
767 .has("vserver-id", "key3");
768 GraphTraversal<Vertex, Vertex> expectedParent = __.<Vertex>start()
769 .has("physical-location-id", "key1")
770 .has("aai-node-type", "complex")
771 .in("locatedIn").has("aai-node-type", "pserver")
772 .has("hostname", "key2");
775 "gremlin query should be " + expected.toString(),
777 query.getQueryBuilder().getQuery().toString());
780 expectedParent.toString(),
781 query.getQueryBuilder().getParentQuery().getQuery().toString());
784 "result type should be",
786 query.getResultType());
788 "result type should be",
790 query.getParentResultType());
791 //this is controversial but we're not allowing writes on this currently
792 assertEquals("dependent",true, query.isDependent());
796 public void traversalEndsInRelatedTo() throws UnsupportedEncodingException, AAIException {
797 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/complex/key1/related-to").build();
799 thrown.expect(AAIException.class);
800 thrown.expectMessage(containsString(RestTokens.COUSIN.toString()));
801 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);
806 public void pluralCousinToPluralCousin() throws UnsupportedEncodingException, AAIException {
807 URI uri = UriBuilder.fromPath("cloud-infrastructure/complexes/related-to/pservers").build();
809 thrown.expect(AAIException.class);
810 thrown.expectMessage(containsString("chain plurals"));
811 QueryParser query = dbEnginev9.getQueryBuilder().createQueryFromURI(uri);