summaryrefslogtreecommitdiffstats
path: root/aai-traversal/src/main/java/org/onap/aai/rest/dsl/DslQueryBuilder.java
diff options
context:
space:
mode:
Diffstat (limited to 'aai-traversal/src/main/java/org/onap/aai/rest/dsl/DslQueryBuilder.java')
-rw-r--r--aai-traversal/src/main/java/org/onap/aai/rest/dsl/DslQueryBuilder.java72
1 files changed, 62 insertions, 10 deletions
diff --git a/aai-traversal/src/main/java/org/onap/aai/rest/dsl/DslQueryBuilder.java b/aai-traversal/src/main/java/org/onap/aai/rest/dsl/DslQueryBuilder.java
index 59f4443..fce8a98 100644
--- a/aai-traversal/src/main/java/org/onap/aai/rest/dsl/DslQueryBuilder.java
+++ b/aai-traversal/src/main/java/org/onap/aai/rest/dsl/DslQueryBuilder.java
@@ -21,6 +21,7 @@ package org.onap.aai.rest.dsl;
import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
import java.util.stream.Collectors;
import org.antlr.v4.runtime.tree.TerminalNode;
@@ -32,15 +33,24 @@ import org.onap.aai.edges.EdgeIngestor;
import org.onap.aai.edges.EdgeRuleQuery;
import org.onap.aai.edges.enums.EdgeType;
import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.introspection.Introspector;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.exceptions.AAIUnknownObjectException;
+
+import com.jcabi.log.Logger;
public class DslQueryBuilder {
private StringBuilder query;
+ private StringBuilder queryException;
private final EdgeIngestor edgeRules;
+ private final Loader loader;
- public DslQueryBuilder(EdgeIngestor edgeIngestor) {
+ public DslQueryBuilder(EdgeIngestor edgeIngestor, Loader loader) {
this.edgeRules = edgeIngestor;
+ this.loader = loader;
query = new StringBuilder();
+ queryException = new StringBuilder();
}
public StringBuilder getQuery() {
@@ -51,6 +61,14 @@ public class DslQueryBuilder {
this.query = query;
}
+ public StringBuilder getQueryException() {
+ return queryException;
+ }
+
+ public void setQueryException(StringBuilder queryException) {
+ this.queryException = queryException;
+ }
+
public DslQueryBuilder start() {
query.append("builder");
return this;
@@ -68,6 +86,8 @@ public class DslQueryBuilder {
public DslQueryBuilder nodeQuery(DslContext context) {
query.append(".getVerticesByProperty('aai-node-type', '").append(context.getCurrentNode()).append("')");
+ if(context.isStartNode() && context.getStartNode().isEmpty())
+ context.setStartNode(context.getCurrentNode());
return this;
}
@@ -76,7 +96,7 @@ public class DslQueryBuilder {
String edgeType = "";
if (!edgeRules.hasRule(baseQ.build())) {
throw new AAIException("AAI_6120", "No EdgeRule found for passed nodeTypes: " + context.getPreviousNode()
- + ", " + context.getCurrentNode());
+ + ", " + context.getCurrentNode());
} else if (edgeRules.hasRule(baseQ.edgeType(EdgeType.TREE).build())) {
edgeType = "EdgeType.TREE";
} else if (edgeRules.hasRule(baseQ.edgeType(EdgeType.COUSIN).build())) {
@@ -85,7 +105,7 @@ public class DslQueryBuilder {
edgeType = "EdgeType.COUSIN";
query.append(".createEdgeTraversal(").append(edgeType).append(", '").append(context.getPreviousNode())
- .append("','").append(context.getCurrentNode()).append("')");
+ .append("','").append(context.getCurrentNode()).append("')");
return this;
}
@@ -142,21 +162,53 @@ public class DslQueryBuilder {
}
+ public DslQueryBuilder validateFilter(DslContext context) throws AAIException {
+ Introspector obj = loader.introspectorFromName(context.getStartNode());
+ if(context.getStartNodeKeys().isEmpty()){
+ queryException.append("No keys sent. Valid keys for " + context.getStartNode() + " are "
+ + String.join(",", obj.getIndexedProperties()));
+ return this;
+ }
+ boolean notIndexed = context.getStartNodeKeys().stream()
+ .filter((prop) -> obj.getIndexedProperties().contains(prop)).collect(Collectors.toList()).isEmpty();
+ if (notIndexed)
+ queryException.append("Non indexed keys sent. Valid keys for " + context.getStartNode() + " "
+ + String.join(",", obj.getIndexedProperties()));
+
+ return this;
+ }
+
public DslQueryBuilder filterPropertyKeys(DslContext context) {
AAIDslParser.FilterStepContext ctx = (AAIDslParser.FilterStepContext) context.getCtx();
final String key = ctx.KEY(0).getText();
-
- query.append(key);
+ /*
+ * This key should be indexed if it is start node
+ */
+ if (context.isStartNode() && context.getStartNodeKeys().isEmpty()) {
+ // check if key is not indexed, then throw exception
+ context.getStartNodeKeys().add(key.replaceAll("'", ""));
+ }
+ query.append(key);
List<TerminalNode> nodes = ctx.KEY();
+ List<TerminalNode> numberValues = ctx.NODE();
+ /*
+ * Add all String values
+ */
List<String> valuesArray = nodes.stream().filter((node) -> !key.equals(node.getText()))
- .map((node) -> "'" + node.getText().replace("'", "").trim() + "'")
- .collect(Collectors.toList());
+ .map((node) -> "'" + node.getText().replace("'", "").trim() + "'").collect(Collectors.toList());
+
+ /*
+ * Add all numeric values
+ */
+ valuesArray.addAll(numberValues.stream().filter((node) -> !key.equals(node.getText()) )
+ .map((node) -> node.getText()).collect(Collectors.toList()));
+
/*
- * The whole point of doing this to separate P.within from key-value search
- * For a list of values QB uses P.within
- * For just a single value QB uses key,value check
+ * The whole point of doing this to separate P.within from key-value
+ * search For a list of values QB uses P.within For just a single value
+ * QB uses key,value check
*/
if (nodes.size() > 2) {
String values = String.join(",", valuesArray);