afd73de624c1fab9ea5b3c08d66a492add9386fe
[aai/aai-common.git] / aai-core / src / test / java / org / onap / aai / query / builder / TraversalURIOptimizedQueryTest.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
4  * ================================================================================
5  * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Modifications Copyright © 2024 Deutsche Telekom.
8  * ================================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *    http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.aai.query.builder;
24
25 import static org.junit.Assert.assertArrayEquals;
26 import static org.junit.Assert.assertEquals;
27
28 import java.util.Collections;
29 import java.util.List;
30 import java.util.Map;
31
32 import org.apache.tinkerpop.gremlin.process.traversal.Path;
33 import org.apache.tinkerpop.gremlin.process.traversal.Step;
34 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
35 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
36 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
37 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
38 import org.apache.tinkerpop.gremlin.structure.Edge;
39 import org.apache.tinkerpop.gremlin.structure.Vertex;
40 import org.janusgraph.core.JanusGraph;
41 import org.janusgraph.core.JanusGraphFactory;
42 import org.junit.Test;
43 import org.junit.experimental.categories.Category;
44 import org.onap.aai.TinkerpopUpgrade;
45 import org.onap.aai.db.props.AAIProperties;
46 import org.onap.aai.introspection.Loader;
47 import org.onap.aai.introspection.LoaderUtil;
48 import org.onap.aai.introspection.exceptions.AAIUnknownObjectException;
49
50 @Category(TinkerpopUpgrade.class)
51 public class TraversalURIOptimizedQueryTest extends TraversalQueryTest {
52
53     @Override
54     protected QueryBuilder<Edge> getNewEdgeTraversalWithTestEdgeRules(Vertex v) {
55         return new TraversalURIOptimizedQuery<>(loader, g, v);
56     }
57
58     @Override
59     protected QueryBuilder<Edge> getNewEdgeTraversalWithTestEdgeRules() {
60         return new TraversalURIOptimizedQuery<>(loader, g);
61     }
62
63     @Override
64     protected QueryBuilder<Vertex> getNewVertexTraversalWithTestEdgeRules(Vertex v) {
65         return new TraversalURIOptimizedQuery<>(loader, g, v);
66     }
67
68     @Override
69     protected QueryBuilder<Vertex> getNewVertexTraversalWithTestEdgeRules() {
70         return new TraversalURIOptimizedQuery<>(loader, g);
71     }
72
73     @Override
74     protected QueryBuilder<Vertex> getNewVertexTraversal() {
75         return new TraversalURIOptimizedQuery<>(loader, g);
76     }
77
78     @Override
79     protected QueryBuilder<Tree> getNewTreeTraversalWithTestEdgeRules(Vertex v) {
80         return new TraversalURIOptimizedQuery<>(loader, g, v);
81     }
82
83     @Override
84     protected QueryBuilder<Tree> getNewTreeTraversalWithTestEdgeRules() {
85         return new TraversalURIOptimizedQuery<>(loader, g);
86     }
87
88     @Override
89     protected QueryBuilder<Path> getNewPathTraversalWithTestEdgeRules(Vertex v) {
90         return new TraversalURIOptimizedQuery<>(loader, g, v);
91     }
92
93     @Override
94     protected QueryBuilder<Path> getNewPathTraversalWithTestEdgeRules() {
95         return new TraversalURIOptimizedQuery<>(loader, g);
96     }
97
98     @Test
99     public void thatTraversalIsPivotedWithinHasContainer() throws AAIUnknownObjectException {
100         JanusGraph graph = JanusGraphFactory.build().set("storage.backend", "inmemory").open();
101         GraphTraversalSource source = graph.newTransaction().traversal();
102         final Loader loader = LoaderUtil.getLatestVersion();
103         GraphTraversal<Vertex, Vertex> traversal = (GraphTraversal<Vertex, Vertex>) __.<Vertex>start();
104         GraphTraversalBuilder graphTraversalBuilder = new TraversalURIOptimizedQuery<>(loader, source);
105         Map<Integer, String> stepToAaiUri = Collections.singletonMap(6, "/smth");
106         TraversalURIOptimizedQuery traversalQuery = new TraversalURIOptimizedQuery<>(traversal, loader, source,
107                 graphTraversalBuilder, stepToAaiUri);
108         traversalQuery.limit(1);
109         traversalQuery.has("propertyKey", "value");
110         traversalQuery.has("propertyKey2", "value2");
111         traversalQuery.limit(2);
112         traversalQuery.has("propertyKey3", "value3");
113         traversalQuery.has("propertyKey4", "value4");
114         traversalQuery.has("propertyKey5", "value5");
115         traversalQuery.limit(3);
116         traversalQuery.limit(4);
117
118         traversalQuery.executeQuery();
119         String query = traversalQuery.completeTraversal.getSteps().toString();
120         assertEquals(
121                 "[GraphStep(vertex,[]), HasStep([aai-uri.eq(/smth)]), HasStep([propertyKey5.eq(value5)]), RangeGlobalStep(0,3), RangeGlobalStep(0,4)]",
122                 query);
123     }
124
125     @Test
126     public void thatTraversalIsPivottedAtRegularStep() throws AAIUnknownObjectException {
127         JanusGraph graph = JanusGraphFactory.build().set("storage.backend", "inmemory").open();
128         GraphTraversalSource source = graph.newTransaction().traversal();
129         final Loader loader = LoaderUtil.getLatestVersion();
130         GraphTraversal<Vertex, Vertex> traversal = (GraphTraversal<Vertex, Vertex>) __.<Vertex>start();
131         GraphTraversalBuilder graphTraversalBuilder = new TraversalURIOptimizedQuery<>(loader, source);
132         Map<Integer, String> stepToAaiUri = Collections.singletonMap(3, "/smth");
133         TraversalURIOptimizedQuery traversalQuery = new TraversalURIOptimizedQuery<>(traversal, loader, source,
134                 graphTraversalBuilder, stepToAaiUri);
135         traversalQuery.limit(1);
136         traversalQuery.has("propertyKey", "value");
137         traversalQuery.has("propertyKey2", "value2");
138         traversalQuery.limit(2);
139         traversalQuery.has("propertyKey3", "value3");
140         traversalQuery.has("propertyKey4", "value4");
141         traversalQuery.has("propertyKey5", "value5");
142         traversalQuery.limit(3);
143         traversalQuery.limit(4);
144
145         GraphTraversal<Vertex, Vertex> expected = __.<Vertex>start()
146                 .has(AAIProperties.AAI_URI, "/smth")
147                 .limit(2)
148                 .has("propertyKey3", "value3")
149                 .has("propertyKey4", "value4")
150                 .has("propertyKey5", "value5")
151                 .limit(3)
152                 .limit(4);
153         List<Step> expectedSteps = expected.asAdmin().getSteps();
154         traversalQuery.executeQuery();
155         List<Step> rawActual = traversalQuery.completeTraversal.getSteps();
156         List<Step> actualStep = rawActual.subList(1, rawActual.size()); // remove GraphStep since I found no way to add
157                                                                         // it to the expected traversal
158         assertArrayEquals(expectedSteps.toArray(), actualStep.toArray());
159     }
160 }