* limitations under the License.
* ============LICENSE_END=========================================================
*/
+
package org.onap.aai.query.builder;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.onap.aai.introspection.Loader;
import org.onap.aai.schema.enums.ObjectMetadata;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
public class TraversalURIOptimizedQuery<E> extends TraversalQuery {
- protected Map<Integer, String> stepToAaiUri = new HashMap<>();
-
- public TraversalURIOptimizedQuery(Loader loader, GraphTraversalSource source) {
- super(loader, source);
- optimize = true;
- }
-
- public TraversalURIOptimizedQuery(Loader loader, GraphTraversalSource source, Vertex start) {
- super(loader, source, start);
- optimize = true;
- }
-
- protected TraversalURIOptimizedQuery(GraphTraversal traversal, Loader loader, GraphTraversalSource source, GraphTraversalBuilder gtb) {
- super(traversal, loader, source, gtb);
- optimize = true;
- }
-
- protected TraversalURIOptimizedQuery(GraphTraversal traversal, Loader loader, GraphTraversalSource source, GraphTraversalBuilder gtb, Map<Integer, String> stepToAaiUri) {
- super(traversal, loader, source, gtb);
- optimize = gtb.optimize;
- this.stepToAaiUri = stepToAaiUri;
- }
+ protected Map<Integer, String> stepToAaiUri = new HashMap<>();
- @Override
- protected void executeQuery() {
+ public TraversalURIOptimizedQuery(Loader loader, GraphTraversalSource source) {
+ super(loader, source);
+ optimize = true;
+ }
- this.completeTraversal = this.traversal.asAdmin().clone();
+ public TraversalURIOptimizedQuery(Loader loader, GraphTraversalSource source, Vertex start) {
+ super(loader, source, start);
+ optimize = true;
+ }
- if (this.optimize) {
- this.completeTraversal = this.pivotTraversal(this.completeTraversal);
- }
+ protected TraversalURIOptimizedQuery(GraphTraversal traversal, Loader loader, GraphTraversalSource source,
+ GraphTraversalBuilder gtb) {
+ super(traversal, loader, source, gtb);
+ optimize = true;
+ }
- if (start == null) {
- Traversal.Admin admin = source.V().asAdmin();
- TraversalHelper.insertTraversal(admin.getEndStep(), completeTraversal, admin);
+ protected TraversalURIOptimizedQuery(GraphTraversal traversal, Loader loader, GraphTraversalSource source,
+ GraphTraversalBuilder gtb, Map<Integer, String> stepToAaiUri) {
+ super(traversal, loader, source, gtb);
+ optimize = gtb.optimize;
+ this.stepToAaiUri = stepToAaiUri;
+ }
- this.completeTraversal = (Traversal.Admin<Vertex, E>) admin;
+ @Override
+ protected void executeQuery() {
- }
+ this.completeTraversal = this.traversal.asAdmin().clone();
- }
+ if (this.optimize) {
+ this.completeTraversal = this.pivotTraversal(this.completeTraversal);
+ }
- private Traversal.Admin<Vertex,E> pivotTraversal(Traversal.Admin<Vertex, E> traversalAdmin) {
+ if (start == null) {
+ Traversal.Admin admin = source.V().asAdmin();
+ TraversalHelper.insertTraversal(admin.getEndStep(), completeTraversal, admin);
- List<Step> steps = traversalAdmin.getSteps();
+ this.completeTraversal = (Traversal.Admin<Vertex, E>) admin;
- Traversal.Admin<Vertex, E> traversalAdminStart = traversalAdmin.clone();
+ }
- //if we do not have an index or other conditions do no optimization
- if (stepToAaiUri.isEmpty()) {
- return traversalAdmin;
- }
+ }
- int lastURIStepKey = getLastURIStepKey();
+ private Traversal.Admin<Vertex, E> pivotTraversal(Traversal.Admin<Vertex, E> traversalAdmin) {
- //clean up traversal steps
- for (int i = 0; i < steps.size(); i++) {
- traversalAdminStart.removeStep(0);
- }
+ List<Step> steps = traversalAdmin.getSteps();
- ((GraphTraversal<Vertex, E>)traversalAdminStart).has(AAIProperties.AAI_URI, stepToAaiUri.get(lastURIStepKey));
- for (int i = lastURIStepKey; i < steps.size(); i++) {
- traversalAdminStart.addStep(steps.get(i));
- }
+ Traversal.Admin<Vertex, E> traversalAdminStart = traversalAdmin.clone();
- return traversalAdminStart;
- }
+ // if we do not have an index or other conditions do no optimization
+ if (stepToAaiUri.isEmpty()) {
+ return traversalAdmin;
+ }
- @Override
- public QueryBuilder<Vertex> createKeyQuery(Introspector obj) {
- super.createKeyQuery(obj);
+ int lastURIStepKey = getLastURIStepKey();
- if (shouldAddStepUri(obj)) {
- Optional<String> uri = getStepUriFromIntrospector(obj);
- if (uri.isPresent()) {
- if (stepToAaiUri.isEmpty()) {
- stepToAaiUri.put(stepIndex + 1, uri.get());
- } else {
- stepToAaiUri.put(stepIndex, uri.get());
- }
- }
- } else {
- optimize = false;
- stepToAaiUri = new HashMap<>();
- }
- return (QueryBuilder<Vertex>) this;
- }
+ // clean up traversal steps
+ for (int i = 0; i < steps.size(); i++) {
+ traversalAdminStart.removeStep(0);
+ }
- private boolean shouldAddStepUri(Introspector obj) {
- boolean shouldOptimize = optimize;
+ ((GraphTraversal<Vertex, E>) traversalAdminStart).has(AAIProperties.AAI_URI, stepToAaiUri.get(lastURIStepKey));
+ for (int i = lastURIStepKey; i < steps.size(); i++) {
+ traversalAdminStart.addStep(steps.get(i));
+ }
- if (shouldOptimize && start != null) {
- shouldOptimize = false;
- }
+ return traversalAdminStart;
+ }
- if (shouldOptimize && stepToAaiUri.isEmpty() && !obj.isTopLevel()) {
- shouldOptimize = false;
- }
+ @Override
+ public QueryBuilder<Vertex> createKeyQuery(Introspector obj) {
+ super.createKeyQuery(obj);
- if (shouldOptimize && obj.getMetadata(ObjectMetadata.ABSTRACT) != null) {
- shouldOptimize = false;
- }
-
- return shouldOptimize;
+ if (shouldAddStepUri(obj)) {
+ Optional<String> uri = getStepUriFromIntrospector(obj);
+ if (uri.isPresent()) {
+ if (stepToAaiUri.isEmpty()) {
+ stepToAaiUri.put(stepIndex + 1, uri.get());
+ } else {
+ stepToAaiUri.put(stepIndex, uri.get());
+ }
+ }
+ } else {
+ optimize = false;
+ stepToAaiUri = new HashMap<>();
+ }
+ return (QueryBuilder<Vertex>) this;
+ }
- }
+ private boolean shouldAddStepUri(Introspector obj) {
+ boolean shouldOptimize = optimize;
- private Optional<String> getStepUriFromIntrospector(Introspector obj) {
- String uri = "";
- try {
- uri = obj.getURI();
- } catch (Exception e) {
- }
+ if (shouldOptimize && start != null) {
+ shouldOptimize = false;
+ }
- if ("".equals(uri)) {
- return Optional.empty();
- }
+ if (shouldOptimize && stepToAaiUri.isEmpty() && !obj.isTopLevel()) {
+ shouldOptimize = false;
+ }
+
+ if (shouldOptimize && obj.getMetadata(ObjectMetadata.ABSTRACT) != null) {
+ shouldOptimize = false;
+ }
+
+ return shouldOptimize;
+
+ }
+
+ private Optional<String> getStepUriFromIntrospector(Introspector obj) {
+ String uri = "";
+ try {
+ uri = obj.getURI();
+ } catch (Exception e) {
+ }
- if (!stepToAaiUri.isEmpty()) {
- uri = stepToAaiUri.get(getLastURIStepKey()) + uri;
- }
+ if ("".equals(uri)) {
+ return Optional.empty();
+ }
- return Optional.of(uri);
- }
+ if (!stepToAaiUri.isEmpty()) {
+ uri = stepToAaiUri.get(getLastURIStepKey()) + uri;
+ }
- private int getLastURIStepKey() {
- return stepToAaiUri.keySet().stream().mapToInt(Integer::intValue).max().getAsInt();
- }
+ return Optional.of(uri);
+ }
- private Map<Integer, String> getStepToAaiUriWithoutStepGreaterThan(final int index) {
- return stepToAaiUri.entrySet().stream().filter(kv -> kv.getKey() <= index).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
- }
+ private int getLastURIStepKey() {
+ return stepToAaiUri.keySet().stream().mapToInt(Integer::intValue).max().getAsInt();
+ }
+
+ private Map<Integer, String> getStepToAaiUriWithoutStepGreaterThan(final int index) {
+ return stepToAaiUri.entrySet().stream().filter(kv -> kv.getKey() <= index)
+ .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+ }
- @Override
- protected QueryBuilder<E> cloneQueryAtStep(int index) {
- GraphTraversal.Admin<Vertex, E> cloneAdmin = getCloneAdmin(index);
- return new TraversalURIOptimizedQuery<>(cloneAdmin, loader, source, this, getStepToAaiUriWithoutStepGreaterThan(index));
- }
+ @Override
+ protected QueryBuilder<E> cloneQueryAtStep(int index) {
+ GraphTraversal.Admin<Vertex, E> cloneAdmin = getCloneAdmin(index);
+ return new TraversalURIOptimizedQuery<>(cloneAdmin, loader, source, this,
+ getStepToAaiUriWithoutStepGreaterThan(index));
+ }
}