From dda3cd32e4e80274fb416de25eab3ed9f7ee691a Mon Sep 17 00:00:00 2001 From: "Maharajh, Robby (rx2202)" Date: Fri, 11 Aug 2017 17:07:51 -0400 Subject: [PATCH] [AAI-162 Amsterdam] Convert custom queries to not use gremlin Change-Id: I50879849eb0d324d711934f75829cf2648ecff6c Signed-off-by: Maharajh, Robby (rx2202) --- .../aai/query/builder/GraphTraversalBuilder.java | 107 ++++++++++- .../aai/query/builder/GremlinPipelineBuilder.java | 214 --------------------- .../query/builder/GremlinPipelineTraversal.java | 76 -------- .../aai/query/builder/GremlinQueryBuilder.java | 105 +++++++++- .../aai/query/builder/GremlinTraversal.java | 1 - .../openecomp/aai/query/builder/QueryBuilder.java | 18 +- .../engines/TransactionalGraphEngine.java | 12 ++ 7 files changed, 238 insertions(+), 295 deletions(-) delete mode 100644 aai-core/src/main/java/org/openecomp/aai/query/builder/GremlinPipelineBuilder.java delete mode 100644 aai-core/src/main/java/org/openecomp/aai/query/builder/GremlinPipelineTraversal.java diff --git a/aai-core/src/main/java/org/openecomp/aai/query/builder/GraphTraversalBuilder.java b/aai-core/src/main/java/org/openecomp/aai/query/builder/GraphTraversalBuilder.java index 11164d96..73b57d06 100644 --- a/aai-core/src/main/java/org/openecomp/aai/query/builder/GraphTraversalBuilder.java +++ b/aai-core/src/main/java/org/openecomp/aai/query/builder/GraphTraversalBuilder.java @@ -38,7 +38,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper; import org.apache.tinkerpop.gremlin.structure.Direction; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Vertex; - import org.openecomp.aai.db.props.AAIProperties; import org.openecomp.aai.exceptions.AAIException; import org.openecomp.aai.introspection.Introspector; @@ -351,6 +350,112 @@ public abstract class GraphTraversalBuilder extends QueryBuilder { return this; } + @Override + public QueryBuilder store(String name) { + + this.traversal.store(name); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder cap(String name) { + this.traversal.cap(name); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder unfold() { + this.traversal.unfold(); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder dedup() { + + this.traversal.dedup(); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder emit() { + + this.traversal.emit(); + stepIndex++; + + return this; + + } + + @Override + public QueryBuilder repeat(QueryBuilder builder) { + + this.traversal.repeat((GraphTraversal)builder.getQuery()); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder outE() { + this.traversal.outE(); + stepIndex++; + return (QueryBuilder)this; + } + + @Override + public QueryBuilder inE() { + this.traversal.inE(); + stepIndex++; + return (QueryBuilder)this; + } + + @Override + public QueryBuilder outV() { + this.traversal.outV(); + stepIndex++; + return (QueryBuilder)this; + } + + @Override + public QueryBuilder inV() { + this.traversal.inV(); + stepIndex++; + return (QueryBuilder)this; + } + + @Override + public QueryBuilder as(String name) { + this.traversal.as(name); + + stepIndex++; + return this; + } + + @Override + public QueryBuilder not(QueryBuilder builder) { + this.traversal.not(builder.getQuery()); + + stepIndex++; + return this; + } + + @Override + public QueryBuilder select(String name) { + this.traversal.select(name); + + stepIndex++; + + return this; + } + /** * Edge query. * diff --git a/aai-core/src/main/java/org/openecomp/aai/query/builder/GremlinPipelineBuilder.java b/aai-core/src/main/java/org/openecomp/aai/query/builder/GremlinPipelineBuilder.java deleted file mode 100644 index 729acbb4..00000000 --- a/aai-core/src/main/java/org/openecomp/aai/query/builder/GremlinPipelineBuilder.java +++ /dev/null @@ -1,214 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.openecomp.aai - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -/* -package org.openecomp.aai.query.builder; - -import java.util.LinkedHashMap; -import java.util.List; - -import org.apache.tinkerpop.gremlin.structure.Vertex; - -import org.openecomp.aai.db.AAIProperties; -import org.openecomp.aai.exceptions.AAIException; -import org.openecomp.aai.introspection.Introspector; -import org.openecomp.aai.introspection.Loader; -import org.openecomp.aai.serialization.db.EdgeRule; -import org.openecomp.aai.serialization.db.EdgeRules; - -public abstract class GremlinPipelineBuilder extends QueryBuilder { - - private GremlinPipeline pipeline = null; - private EdgeRules edgeRules = EdgeRules.getInstance(); - private int parentStepIndex = 0; - private int stepIndex = 0; - - public GremlinPipelineBuilder(Loader loader) { - super(loader); - - pipeline = new GremlinPipeline(new IdentityPipe()).V(); - - } - - public GremlinPipelineBuilder(Loader loader, Vertex start) { - super(loader, start); - - pipeline = new GremlinPipeline(start); - - } - - @Override - public QueryBuilder getVerticesByIndexedProperty(String key, Object value) { - - return this.getVerticesByProperty(key, value); - } - - @Override - public QueryBuilder getVerticesByProperty(String key, Object value) { - - //this is because the index is registered as an Integer - if (value != null && value.getClass().equals(Long.class)) { - pipeline.has(key,new Integer(value.toString())); - } else { - pipeline.has(key, value); - } - stepIndex++; - return this; - } - - @Override - public QueryBuilder getChildVerticesFromParent(String parentKey, String parentValue, String childType) { - pipeline.has(parentKey, parentValue).has(AAIProperties.NODE_TYPE, childType); - stepIndex++; - return this; - } - - @Override - public QueryBuilder getTypedVerticesByMap(String type, LinkedHashMap map) { - - for (String key : map.keySet()) { - pipeline.has(key, map.get(key)); - stepIndex++; - } - pipeline.has(AAIProperties.NODE_TYPE, type); - stepIndex++; - return this; - } - - @Override - public QueryBuilder createDBQuery(Introspector obj) { - this.createKeyQuery(obj); - this.createContainerQuery(obj); - return this; - } - - @Override - public QueryBuilder createKeyQuery(Introspector obj) { - List keys = obj.getKeys(); - Object val = null; - for (String key : keys) { - val = obj.getValue(key); - //this is because the index is registered as an Integer - if (val != null && val.getClass().equals(Long.class)) { - pipeline.has(key,new Integer(val.toString())); - } else { - pipeline.has(key, val); - } - stepIndex++; - } - return this; - } - - @Override - - public QueryBuilder createContainerQuery(Introspector obj) { - String type = obj.getChildDBName(); - String abstractType = obj.getMetadata("abstract"); - if (abstractType != null) { - String[] inheritors = obj.getMetadata("inheritors").split(","); - GremlinPipeline[] pipes = new GremlinPipeline[inheritors.length]; - for (int i = 0; i < inheritors.length; i++) { - pipes[i] = new GremlinPipeline(new IdentityPipe()).has(AAIProperties.NODE_TYPE, inheritors[i]); - } - pipeline.or(pipes); - } else { - pipeline.has(AAIProperties.NODE_TYPE, type); - } - stepIndex++; - return this; - } - - @Override - public QueryBuilder createEdgeTraversal(Introspector parent, Introspector child) { - String parentName = parent.getDbName(); - String childName = child.getDbName(); - String isAbstractType = parent.getMetadata("abstract"); - if ("true".equals(isAbstractType)) { - formBoundary(); - pipeline.outE().has("isParent", true).inV(); - } else { - if (parent.isContainer()) { - parentName = parent.getChildDBName(); - } - if (child.isContainer()) { - childName = child.getChildDBName(); - } - this.edgeQuery(parentName, childName); - } - return this; - - } - - @Override - public QueryBuilder createEdgeTraversal(Vertex parent, Introspector child) { - - String nodeType = parent.getProperty(AAIProperties.NODE_TYPE); - this.edgeQuery(nodeType, child.getDbName()); - return this; - - } - - private void edgeQuery(String outType, String inType) { - formBoundary(); - EdgeRule rule; - String label = ""; - try { - rule = edgeRules.getEdgeRule(outType, inType); - label = rule.getLabel(); - } catch (AAIException e) { - // TODO Auto-generated catch block - } - pipeline = pipeline.out(label); - stepIndex++; - } - - @Override - public Object getQuery() { - return this.pipeline; - } - - @Override - public Object getParentQuery() { - GremlinPipeline parent = new GremlinPipeline(); - if (parentStepIndex == 0) { - parentStepIndex = stepIndex; - } - List pipes = this.pipeline.getPipes(); - //add two for the garbage identity pipes - for (int i = 0; i < parentStepIndex + 2; i++) { - parent.add(pipes.get(i)); - } - - return parent; - } - - @Override - public void formBoundary() { - parentStepIndex = stepIndex; - } - - - @Override - public Vertex getStart() { - return this.start; - } - -} -*/ diff --git a/aai-core/src/main/java/org/openecomp/aai/query/builder/GremlinPipelineTraversal.java b/aai-core/src/main/java/org/openecomp/aai/query/builder/GremlinPipelineTraversal.java deleted file mode 100644 index c29c367b..00000000 --- a/aai-core/src/main/java/org/openecomp/aai/query/builder/GremlinPipelineTraversal.java +++ /dev/null @@ -1,76 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * org.openecomp.aai - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============LICENSE_END========================================================= - */ - -/* -package org.openecomp.aai.query.builder; - -import java.io.UnsupportedEncodingException; -import java.net.URI; - -import javax.ws.rs.core.MultivaluedMap; - -import org.apache.tinkerpop.gremlin.structure.Vertex; - -import org.openecomp.aai.exceptions.AAIException; -import org.openecomp.aai.introspection.Introspector; -import org.openecomp.aai.introspection.Loader; -import org.openecomp.aai.parsers.query.QueryParser; -import org.openecomp.aai.parsers.query.TraversalStrategy; - -public class GremlinPipelineTraversal extends GremlinPipelineBuilder { - - public GremlinPipelineTraversal(Loader loader) { - super(loader); - this.factory = new TraversalStrategy(this.loader, this); - } - - public GremlinPipelineTraversal(Loader loader, Vertex start) { - super(loader, start); - this.factory = new TraversalStrategy(this.loader, this); - } - - @Override - public QueryParser createQueryFromURI(URI uri) throws UnsupportedEncodingException, AAIException { - return factory.buildURIParser(uri); - } - - @Override - public QueryParser createQueryFromRelationship(Introspector relationship) throws UnsupportedEncodingException, AAIException { - return factory.buildRelationshipParser(relationship); - } - - @Override - public QueryParser createQueryFromURI(URI uri, MultivaluedMap queryParams) - throws UnsupportedEncodingException, AAIException { - return factory.buildURIParser(uri, queryParams); - } - - @Override - public QueryBuilder newInstance(Vertex start) { - return new GremlinPipelineTraversal(loader, start); - } - - @Override - public QueryBuilder newInstance() { - return new GremlinPipelineTraversal(loader); - } - -} -*/ diff --git a/aai-core/src/main/java/org/openecomp/aai/query/builder/GremlinQueryBuilder.java b/aai-core/src/main/java/org/openecomp/aai/query/builder/GremlinQueryBuilder.java index e4e1fd5a..f93bc484 100644 --- a/aai-core/src/main/java/org/openecomp/aai/query/builder/GremlinQueryBuilder.java +++ b/aai-core/src/main/java/org/openecomp/aai/query/builder/GremlinQueryBuilder.java @@ -32,7 +32,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSo import org.apache.tinkerpop.gremlin.structure.Direction; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Vertex; - import org.openecomp.aai.db.props.AAIProperties; import org.openecomp.aai.exceptions.AAIException; import org.openecomp.aai.introspection.Introspector; @@ -43,6 +42,7 @@ import org.openecomp.aai.serialization.db.EdgeRule; import org.openecomp.aai.serialization.db.EdgeRules; import org.openecomp.aai.serialization.db.EdgeType; import org.openecomp.aai.serialization.db.exceptions.NoEdgeRuleFoundException; + import com.google.common.base.Joiner; /** @@ -345,6 +345,109 @@ public abstract class GremlinQueryBuilder extends QueryBuilder { return this; } + @Override + public QueryBuilder store(String name) { + this.list.add(".store('"+ name + "')"); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder cap(String name) { + this.list.add(".cap('"+ name + "')"); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder unfold() { + this.list.add(".unfold()"); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder dedup() { + this.list.add(".dedup()"); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder emit() { + this.list.add(".emit()"); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder repeat(QueryBuilder builder) { + this.list.add(".repeat(__" + builder.getQuery() + ")"); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder outE() { + this.list.add(".outE()"); + stepIndex++; + + return (QueryBuilder)this; + } + + @Override + public QueryBuilder inE() { + this.list.add(".inE()"); + stepIndex++; + + return (QueryBuilder)this; + } + + @Override + public QueryBuilder outV() { + this.list.add(".outV()"); + stepIndex++; + + return (QueryBuilder)this; + } + + @Override + public QueryBuilder inV() { + this.list.add(".inV()"); + stepIndex++; + + return (QueryBuilder)this; + } + + @Override + public QueryBuilder not(QueryBuilder builder) { + this.list.add(".not(" + "__" + builder.getQuery() + ")"); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder as(String name) { + this.list.add(".as('" + name + "')"); + stepIndex++; + + return this; + } + + @Override + public QueryBuilder select(String name) { + this.list.add(".select('" + name + "')"); + stepIndex++; + + return this; + } /** * @{inheritDoc} */ diff --git a/aai-core/src/main/java/org/openecomp/aai/query/builder/GremlinTraversal.java b/aai-core/src/main/java/org/openecomp/aai/query/builder/GremlinTraversal.java index 3daad5ef..daf795fd 100644 --- a/aai-core/src/main/java/org/openecomp/aai/query/builder/GremlinTraversal.java +++ b/aai-core/src/main/java/org/openecomp/aai/query/builder/GremlinTraversal.java @@ -29,7 +29,6 @@ import javax.ws.rs.core.MultivaluedMap; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.structure.Vertex; - import org.openecomp.aai.exceptions.AAIException; import org.openecomp.aai.introspection.Introspector; import org.openecomp.aai.introspection.Loader; diff --git a/aai-core/src/main/java/org/openecomp/aai/query/builder/QueryBuilder.java b/aai-core/src/main/java/org/openecomp/aai/query/builder/QueryBuilder.java index 565e8682..009f4fdf 100644 --- a/aai-core/src/main/java/org/openecomp/aai/query/builder/QueryBuilder.java +++ b/aai-core/src/main/java/org/openecomp/aai/query/builder/QueryBuilder.java @@ -31,7 +31,6 @@ import javax.ws.rs.core.MultivaluedMap; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Vertex; - import org.openecomp.aai.exceptions.AAIException; import org.openecomp.aai.introspection.Introspector; import org.openecomp.aai.introspection.Loader; @@ -285,7 +284,22 @@ public abstract class QueryBuilder implements Iterator { public abstract QueryBuilder union(QueryBuilder... builder); public abstract QueryBuilder where(QueryBuilder... builder); - public abstract void markContainer(); + + public abstract QueryBuilder store(String name); + public abstract QueryBuilder cap(String name); + public abstract QueryBuilder unfold(); + public abstract QueryBuilder dedup(); + public abstract QueryBuilder emit(); + public abstract QueryBuilder repeat(QueryBuilder builder); + public abstract QueryBuilder outE(); + public abstract QueryBuilder inE(); + public abstract QueryBuilder inV(); + public abstract QueryBuilder outV(); + public abstract QueryBuilder not(QueryBuilder builder); + public abstract QueryBuilder as(String name); + public abstract QueryBuilder select(String name); + + public abstract void markContainer(); public abstract QueryBuilder getContainerQuery(); diff --git a/aai-core/src/main/java/org/openecomp/aai/serialization/engines/TransactionalGraphEngine.java b/aai-core/src/main/java/org/openecomp/aai/serialization/engines/TransactionalGraphEngine.java index 9192b589..ffe866ed 100644 --- a/aai-core/src/main/java/org/openecomp/aai/serialization/engines/TransactionalGraphEngine.java +++ b/aai-core/src/main/java/org/openecomp/aai/serialization/engines/TransactionalGraphEngine.java @@ -145,7 +145,15 @@ public abstract class TransactionalGraphEngine { return getQueryBuilder(this.loader); } + public QueryBuilder getQueryBuilder(QueryStyle style) { + return getQueryBuilder(style, this.loader); + } + public QueryBuilder getQueryBuilder(Loader loader) { + return getQueryBuilder(this.style, loader); + } + + public QueryBuilder getQueryBuilder(QueryStyle style, Loader loader) { if (style.equals(QueryStyle.GREMLIN_TRAVERSAL)) { return new GremlinTraversal<>(loader, this.asAdmin().getTraversalSource()); } else if (style.equals(QueryStyle.GREMLIN_UNIQUE)) { @@ -170,6 +178,10 @@ public abstract class TransactionalGraphEngine { } public QueryBuilder getQueryBuilder(Loader loader, Vertex start) { + return getQueryBuilder(this.style, loader, start); + } + + public QueryBuilder getQueryBuilder(QueryStyle style, Loader loader, Vertex start) { if (style.equals(QueryStyle.GREMLIN_TRAVERSAL)) { return new GremlinTraversal<>(loader, this.asAdmin().getTraversalSource(), start); } else if (style.equals(QueryStyle.GREMLIN_UNIQUE)) { -- 2.16.6