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