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