Added support for Multiple Edges
[aai/aai-common.git] / aai-core / src / test / java / org / onap / aai / query / builder / TraversalQueryTest.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
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
10  *
11  *    http://www.apache.org/licenses/LICENSE-2.0
12  *
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=========================================================
19  *
20  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
21  */
22 package org.onap.aai.query.builder;
23
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertTrue;
26
27 import java.io.UnsupportedEncodingException;
28 import java.net.URI;
29 import java.net.URISyntaxException;
30 import java.util.List;
31
32 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
33 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
34 import org.apache.tinkerpop.gremlin.structure.Edge;
35 import org.apache.tinkerpop.gremlin.structure.Vertex;
36 import org.junit.Test;
37 import org.onap.aai.db.props.AAIProperties;
38 import org.onap.aai.exceptions.AAIException;
39 import org.onap.aai.serialization.db.EdgeType;
40
41 public class TraversalQueryTest extends QueryBuilderTestAbstraction {
42
43         
44         @Override
45         protected QueryBuilder<Edge> getNewEdgeTraversal(Vertex v) {
46                 return new TraversalQuery<>(loader, g, v, testEdgeRules);
47         }
48         
49         @Override
50         protected QueryBuilder<Edge> getNewEdgeTraversal() {
51                 return new TraversalQuery<>(loader, g, testEdgeRules);
52         }
53         
54         @Override
55         protected QueryBuilder<Vertex> getNewVertexTraversal(Vertex v) {
56                 return new TraversalQuery<>(loader, g, v, testEdgeRules);
57         }
58         
59         @Override
60         protected QueryBuilder<Vertex> getNewVertexTraversal() {
61                 return new TraversalQuery<>(loader, g, testEdgeRules);
62         }
63         
64         @Test
65         public void unionQuery() {
66                 QueryBuilder<Vertex> tQ = new TraversalQuery<>(loader, g);
67                 QueryBuilder<Vertex> tQ2 = new TraversalQuery<>(loader, g);
68                 QueryBuilder<Vertex> tQ3 = new TraversalQuery<>(loader, g);
69                 tQ.union(
70                                 tQ2.getVerticesByProperty("test1", "value1"),
71                                 tQ3.getVerticesByIndexedProperty("test2", "value2"));
72                 
73                 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
74                                 .union(__.has("test1", "value1"),__.has("test2", "value2"));
75                 
76                 assertEquals("they are equal", expected, tQ.getQuery());
77                 
78                 g.tx().rollback();
79         }
80
81         @Test
82         public void traversalClones() throws UnsupportedEncodingException, AAIException, URISyntaxException {
83                 QueryBuilder<Vertex> tQ = new TraversalQuery<>(loader, g);
84                 QueryBuilder<Vertex> builder = tQ.createQueryFromURI(new URI("network/test-objects/test-object/key1")).getQueryBuilder();
85                 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start().has("vnf-id", "key1").has("aai-node-type", "test-object");
86                 GraphTraversal<Vertex, Vertex> containerExpected = __.<Vertex>start().has("aai-node-type", "test-object");
87                 
88                 assertEquals("query object", expected.toString(), builder.getQuery().toString());
89                 assertEquals("container query object", containerExpected.toString(), builder.getContainerQuery().getQuery().toString());
90                 
91                 g.tx().rollback();
92         }
93
94         @Test
95         public void nestedTraversalClones() throws UnsupportedEncodingException, AAIException, URISyntaxException {
96                 
97                 QueryBuilder<Vertex> tQ = new TraversalQuery<>(loader, g);
98                 QueryBuilder<Vertex> builder = tQ.createQueryFromURI(new URI("network/generic-vnfs/generic-vnf/key1/l-interfaces/l-interface/key2")).getQueryBuilder();
99                 GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start().has("vnf-id", "key1").has("aai-node-type", "generic-vnf").out("hasLInterface").has(AAIProperties.NODE_TYPE, "l-interface").has("interface-name", "key2");
100                 GraphTraversal<Vertex, Vertex> containerExpected = __.<Vertex>start().has("vnf-id", "key1").has("aai-node-type", "generic-vnf").out("hasLInterface").has(AAIProperties.NODE_TYPE, "l-interface");
101                 
102                 assertEquals("query object", expected.toString(), builder.getQuery().toString());
103                 assertEquals("container query object", containerExpected.toString(), builder.getContainerQuery().getQuery().toString());
104                 
105                 g.tx().rollback();
106         }
107         
108         @Test
109         public void abstractEdgeToVertexTraversalTest() throws AAIException {
110                                 
111                 Vertex gvnf = g.addV("aai-node-type","generic-vnf","vnf-id","gvnf").next();
112                 Vertex vnfc1 = g.addV("aai-node-type","vnfc","vnfc-name","a-name").next();
113                 
114                 testEdgeRules.addEdge(g, gvnf, vnfc1);
115                 
116                 QueryBuilder<Vertex> tQ = getNewVertexTraversal(gvnf);
117                 tQ.createEdgeTraversal(EdgeType.COUSIN, "vnf", "vnfc");
118                 
119                 List<Vertex> list = tQ.toList();
120
121                 assertEquals("Has 1 vertexes ", 1, list.size());
122                 assertTrue("Has vertex on the default edge ", list.contains(vnfc1));
123                 
124                 g.tx().rollback();
125         }
126         
127         @Test
128         public void abstractEdgeToVertexTraversalSingleOutRuleTest() throws AAIException {
129                                 
130                 Vertex vce = g.addV("aai-node-type","vce","vnf-id","vce").next();
131                 Vertex vnfc1 = g.addV("aai-node-type","vnfc","vnfc-name","a-name").next();
132                 
133                 testEdgeRules.addEdge(g, vce, vnfc1);
134                 
135                 QueryBuilder<Vertex> tQ1 = new TraversalQuery<>(loader, g, vce, testEdgeRules);
136                 tQ1.createEdgeTraversal(EdgeType.COUSIN, "vnf", "vnfc");
137                 
138                 QueryBuilder<Vertex> tQ2 = new TraversalQuery<>(loader, g, vnfc1, testEdgeRules);
139                 tQ2.createEdgeTraversal(EdgeType.COUSIN, "vnfc", "vnf");
140                 
141                 List<Vertex> list1 = tQ1.toList();
142                 List<Vertex> list2 = tQ2.toList();
143                 
144                 assertEquals("1 - Has 1 vertexes ", 1, list1.size());
145                 assertTrue("1 - traversal results in vnfc ", list1.contains(vnfc1));
146                 assertEquals("2 - Has 1 vertexes ", 1, list2.size());
147                 assertTrue("2 - traversal results in vce ", list2.contains(vce));
148                 
149                 g.tx().rollback();
150         }
151         
152         @Test
153         public void abstractEdgeToVertexTraversalSingleInRuleTest() throws AAIException {
154                                 
155                 Vertex vce = g.addV("aai-node-type","vce","vnf-id","vce").next();
156                 Vertex pserver = g.addV("aai-node-type","pserver","hostname","a-name").next();
157                 
158                 testEdgeRules.addEdge(g, vce, pserver);
159                 
160                 QueryBuilder<Vertex> tQ1 = new TraversalQuery<>(loader, g, vce, testEdgeRules);
161                 tQ1.createEdgeTraversal(EdgeType.COUSIN, "vnf", "pserver");
162                 
163                 List<Vertex> list = tQ1.toList();
164
165                 assertEquals("1 - Has 1 vertexes ", 1, list.size());
166                 assertTrue("1 - traversal results in vnfc ", list.contains(pserver));
167                 
168                 g.tx().rollback();
169         }
170         
171         @Test
172         public void abstractEdgeToVertexMultiRuleTraversalTest() throws AAIException {
173                                 
174                 Vertex gvnf = g.addV("aai-node-type","generic-vnf","vnf-id","gvnf").next();
175                 Vertex vnfc1 = g.addV("aai-node-type","vnfc","vnfc-name","a-name").next();
176                 Vertex vnfc2 = g.addV("aai-node-type","vnfc","vnfc-name","b-name").next();
177                 
178                 testEdgeRules.addEdge(g, gvnf, vnfc1);
179                 testEdgeRules.addEdge(g, gvnf, vnfc2, "re-uses");
180                 
181                 QueryBuilder<Vertex> tQ = getNewVertexTraversal(gvnf);
182                 tQ.createEdgeTraversal(EdgeType.COUSIN, "vnf", "vnfc");
183                 
184                 List<Vertex> list = tQ.toList();
185
186                 assertEquals("Has 2 vertexes ", 2, list.size());
187                 assertTrue("Has vertex on the default edge ", list.contains(vnfc1));
188                 assertTrue("Has vertex on the re-uses edge ", list.contains(vnfc2));
189                 
190                 g.tx().rollback();
191         }
192         
193         @Test
194         public void abstractEdgeToVertexMultiRuleOutTraversalTest() throws AAIException {
195                         
196                 Vertex gvnf = g.addV("aai-node-type","generic-vnf","vnf-id","gvnf").next();
197                 Vertex pserver = g.addV("aai-node-type","pserver","hostname","a-name").next();
198                 
199                 testEdgeRules.addEdge(g, gvnf, pserver);
200                 testEdgeRules.addEdge(g, gvnf, pserver, "generic-vnf-pserver-B");
201                 
202                 QueryBuilder<Vertex> tQ = getNewVertexTraversal(gvnf);
203                 tQ.createEdgeTraversal(EdgeType.COUSIN, "vnf", "pserver");
204                 
205                 List<Vertex> list = tQ.toList();
206         
207                 assertEquals("Has 2 vertexes ", 2, list.size());
208                 assertTrue("result has pserver ", list.contains(pserver));
209                 
210                 g.tx().rollback();
211         }
212         
213         @Test
214         public void abstractEdgeToVertexMultiRuleInTraversalTest() throws AAIException {
215                         
216                 Vertex gvnf = g.addV("aai-node-type","generic-vnf","vnf-id","gvnf").next();
217                 Vertex complex = g.addV("aai-node-type","complex","physical-location-id","a-name").next();
218                 
219                 testEdgeRules.addEdge(g, gvnf, complex);
220                 testEdgeRules.addEdge(g, gvnf, complex, "complex-generic-vnf-B");
221                 
222                 QueryBuilder<Vertex> tQ = getNewVertexTraversal(gvnf);
223                 tQ.createEdgeTraversal(EdgeType.COUSIN, "vnf", "complex");
224                 
225                 List<Vertex> list = tQ.toList();
226         
227                 assertEquals("Has 2 vertexes ", 2, list.size());
228                 assertTrue("result has pserver ", list.contains(complex));
229                 
230                 g.tx().rollback();
231         }
232         
233         
234         
235 }