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