You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by ma...@apache.org on 2018/01/13 20:21:34 UTC
atlas git commit: ATLAS-2360: error handling improvements in DSL
[Forced Update!]
Repository: atlas
Updated Branches:
refs/heads/master 4c393d6c8 -> 4c9a3bf7f (forced update)
ATLAS-2360: error handling improvements in DSL
Project: http://git-wip-us.apache.org/repos/asf/atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/4c9a3bf7
Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/4c9a3bf7
Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/4c9a3bf7
Branch: refs/heads/master
Commit: 4c9a3bf7f885bba275d9bef6fc36999fa95705e6
Parents: 6b4c3aa
Author: Ashutosh Mestry <am...@hortonworks.com>
Authored: Thu Jan 11 22:30:37 2018 -0800
Committer: Madhan Neethiraj <ma...@apache.org>
Committed: Sat Jan 13 12:21:24 2018 -0800
----------------------------------------------------------------------
.../java/org/apache/atlas/AtlasErrorCode.java | 2 +-
.../java/org/apache/atlas/query/AtlasDSL.java | 47 +++++--
.../atlas/query/GremlinQueryComposer.java | 135 ++++++++++++-------
.../apache/atlas/query/IdentifierHelper.java | 111 +++++++++------
.../java/org/apache/atlas/query/Lookup.java | 7 +-
.../apache/atlas/query/RegistryBasedLookup.java | 79 ++++++-----
.../atlas/query/SelectClauseComposer.java | 20 ++-
.../org/apache/atlas/query/DSLQueriesTest.java | 41 ++++--
.../atlas/query/GremlinQueryComposerTest.java | 57 +++++---
9 files changed, 318 insertions(+), 181 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/atlas/blob/4c9a3bf7/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
index 0953725..f8829b5 100644
--- a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
+++ b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
@@ -103,7 +103,7 @@ public enum AtlasErrorCode {
SAVED_SEARCH_CHANGE_USER(400, "ATLAS-400-00-056", "saved-search {0} can not be moved from user {1} to {2}"),
INVALID_QUERY_PARAM_LENGTH(400, "ATLAS-400-00-057" , "Length of query param {0} exceeds the limit"),
INVALID_QUERY_LENGTH(400, "ATLAS-400-00-058" , "Invalid query length, update {0} to change the limit" ),
- INVALID_DSL_QUERY(400, "ATLAS-400-00-059" , "Invalid DSL query: {0} Reason: {1}. Please refer to Atlas DSL grammar for more information" ),
+ INVALID_DSL_QUERY(400, "ATLAS-400-00-059" , "Invalid DSL query: {0} | Reason: {1}. Please refer to Atlas DSL grammar for more information" ),
// All Not found enums go here
TYPE_NAME_NOT_FOUND(404, "ATLAS-404-00-001", "Given typename {0} was invalid"),
http://git-wip-us.apache.org/repos/asf/atlas/blob/4c9a3bf7/repository/src/main/java/org/apache/atlas/query/AtlasDSL.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/query/AtlasDSL.java b/repository/src/main/java/org/apache/atlas/query/AtlasDSL.java
index 7817f91..61a34b1 100644
--- a/repository/src/main/java/org/apache/atlas/query/AtlasDSL.java
+++ b/repository/src/main/java/org/apache/atlas/query/AtlasDSL.java
@@ -29,6 +29,8 @@ import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.query.antlr4.AtlasDSLLexer;
import org.apache.atlas.query.antlr4.AtlasDSLParser;
import org.apache.atlas.type.AtlasTypeRegistry;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -58,7 +60,6 @@ public class AtlasDSL {
static AtlasDSLParser.QueryContext parse(String queryStr) throws AtlasBaseException {
AtlasDSLParser.QueryContext ret;
try {
-
InputStream stream = new ByteArrayInputStream(queryStr.getBytes());
AtlasDSLLexer lexer = new AtlasDSLLexer(CharStreams.fromStream(stream));
Validator validator = new Validator();
@@ -81,7 +82,6 @@ public class AtlasDSL {
return ret;
}
-
}
static class Validator extends BaseErrorListener {
@@ -108,25 +108,50 @@ public class AtlasDSL {
private final AtlasTypeRegistry typeRegistry;
private final int offset;
private final int limit;
+ private final String query;
public Translator(String query, AtlasTypeRegistry typeRegistry, int offset, int limit) throws AtlasBaseException {
- this(Parser.parse(query), typeRegistry, offset, limit);
- }
-
- private Translator(final AtlasDSLParser.QueryContext queryContext, AtlasTypeRegistry typeRegistry, int offset, int limit) {
- this.queryContext = queryContext;
+ this.query = query;
+ this.queryContext = Parser.parse(query);
this.typeRegistry = typeRegistry;
this.offset = offset;
this.limit = limit;
}
- public GremlinQuery translate() {
- QueryMetadata queryMetadata = new QueryMetadata(queryContext);
+ public GremlinQuery translate() throws AtlasBaseException {
+ QueryMetadata queryMetadata = new QueryMetadata(queryContext);
GremlinQueryComposer gremlinQueryComposer = new GremlinQueryComposer(typeRegistry, queryMetadata, limit, offset);
DSLVisitor dslVisitor = new DSLVisitor(gremlinQueryComposer);
- queryContext.accept(dslVisitor);
- return new GremlinQuery(gremlinQueryComposer.get(), queryMetadata.hasSelect());
+ try {
+ queryContext.accept(dslVisitor);
+
+ processErrorList(gremlinQueryComposer, null);
+
+ return new GremlinQuery(gremlinQueryComposer.get(), queryMetadata.hasSelect());
+ } catch (Exception e) {
+ processErrorList(gremlinQueryComposer, e);
+ }
+
+ return null;
+ }
+
+ private void processErrorList(GremlinQueryComposer gremlinQueryComposer, Exception e) throws AtlasBaseException {
+ final String errorMessage;
+
+ if (CollectionUtils.isNotEmpty(gremlinQueryComposer.getErrorList())) {
+ errorMessage = StringUtils.join(gremlinQueryComposer.getErrorList(), ", ");
+ } else {
+ errorMessage = e != null ? (e.getMessage() != null ? e.getMessage() : e.toString()) : null;
+ }
+
+ if (errorMessage != null) {
+ if (e != null) {
+ throw new AtlasBaseException(AtlasErrorCode.INVALID_DSL_QUERY, e, this.query, errorMessage);
+ }
+
+ throw new AtlasBaseException(AtlasErrorCode.INVALID_DSL_QUERY, this.query, errorMessage);
+ }
}
}
http://git-wip-us.apache.org/repos/asf/atlas/blob/4c9a3bf7/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java b/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java
index fe2d6d7..95ba461 100644
--- a/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java
+++ b/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java
@@ -18,8 +18,11 @@
package org.apache.atlas.query;
import com.google.common.annotations.VisibleForTesting;
+import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.model.discovery.SearchParameters;
+import org.apache.atlas.model.typedef.AtlasStructDef;
import org.apache.atlas.type.AtlasEntityType;
+import org.apache.atlas.type.AtlasStructType;
import org.apache.atlas.type.AtlasType;
import org.apache.atlas.type.AtlasTypeRegistry;
import org.apache.commons.lang.StringUtils;
@@ -29,13 +32,7 @@ import org.slf4j.LoggerFactory;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.TimeZone;
+import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -47,7 +44,6 @@ public class GremlinQueryComposer {
private final int DEFAULT_QUERY_RESULT_LIMIT = 25;
private final int DEFAULT_QUERY_RESULT_OFFSET = 0;
- private final List<String> errorList = new ArrayList<>();
private final GremlinClauseList queryClauses = new GremlinClauseList();
private final Lookup lookup;
private final boolean isNestedQuery;
@@ -58,9 +54,7 @@ public class GremlinQueryComposer {
private static final ThreadLocal<DateFormat> DSL_DATE_FORMAT = ThreadLocal.withInitial(() -> {
DateFormat ret = new SimpleDateFormat(ISO8601_FORMAT);
-
ret.setTimeZone(TimeZone.getTimeZone("UTC"));
-
return ret;
});
@@ -73,7 +67,7 @@ public class GremlinQueryComposer {
}
public GremlinQueryComposer(AtlasTypeRegistry typeRegistry, final AtlasDSL.QueryMetadata qmd, int limit, int offset) {
this(new RegistryBasedLookup(typeRegistry), qmd, false);
- this.context = new Context(errorList, lookup);
+ this.context = new Context(lookup);
providedLimit = limit;
providedOffset = offset < 0 ? DEFAULT_QUERY_RESULT_OFFSET : offset;
@@ -152,24 +146,42 @@ public class GremlinQueryComposer {
lhsI = getAdvice(lhs);
}
- if (lhsI.isDate()) {
- rhs = parseDate(rhs);
- }
+ if (StringUtils.isEmpty(lhsI.getQualifiedName())) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("unknown identifier '" + lhsI.getRaw() + "'");
+ }
- rhs = addQuotesIfNecessary(rhs);
- if (op == SearchParameters.Operator.LIKE) {
- add(GremlinClause.TEXT_CONTAINS, lhsI.getQualifiedName(), getFixedRegEx(rhs));
- } else if (op == SearchParameters.Operator.IN) {
- add(GremlinClause.HAS_OPERATOR, lhsI.getQualifiedName(), "within", rhs);
+ context.getErrorList().add("unknown identifier '" + lhsI.getRaw() + "'");
} else {
- add(GremlinClause.HAS_OPERATOR, lhsI.getQualifiedName(), op.getSymbols()[1], rhs);
+ if (lhsI.isDate()) {
+ rhs = parseDate(rhs);
+ }
+
+ rhs = addQuotesIfNecessary(rhs);
+ if (op == SearchParameters.Operator.LIKE) {
+ add(GremlinClause.TEXT_CONTAINS, lhsI.getQualifiedName(), getFixedRegEx(rhs));
+ } else if (op == SearchParameters.Operator.IN) {
+ add(GremlinClause.HAS_OPERATOR, lhsI.getQualifiedName(), "within", rhs);
+ } else {
+ add(GremlinClause.HAS_OPERATOR, lhsI.getQualifiedName(), op.getSymbols()[1], rhs);
+ }
+
+ if (org != null && org.getIntroduceType()) {
+ add(GremlinClause.DEDUP);
+ add(GremlinClause.IN, org.getEdgeLabel());
+ context.registerActive(currentType);
+ }
}
+ }
- if (org != null && org.getIntroduceType()) {
- add(GremlinClause.DEDUP);
- add(GremlinClause.IN, org.getEdgeLabel());
- context.registerActive(currentType);
+ private String getQualifiedName(IdentifierHelper.Advice ia) {
+ String s = ia.getQualifiedName();
+ if(StringUtils.isEmpty(s)) {
+ s = ia.getRaw();
+ getErrorList().add(String.format("Error: %s is invalid", ia.getRaw()));
}
+
+ return s;
}
private String getFixedRegEx(String rhs) {
@@ -205,25 +217,35 @@ public class GremlinQueryComposer {
IdentifierHelper.Advice ia = getAdvice(scc.getItem(i));
if (!scc.getItem(i).equals(scc.getLabel(i))) {
- context.addAlias(scc.getLabel(i), ia.getQualifiedName());
+ context.addAlias(scc.getLabel(i), getQualifiedName(ia));
}
- // Update the qualifiedNames and the assignment expressions
- if (scc.updateAsApplicable(i, ia.getQualifiedName())) {
+ if (scc.updateAsApplicable(i, getQualifiedName(ia))) {
continue;
}
+ scc.isSelectNoop = hasNoopCondition(ia);
+ if(scc.isSelectNoop) {
+ return;
+ }
+
if (introduceType(ia)) {
scc.isSelectNoop = !ia.hasParts();
if(ia.hasParts()) {
- scc.assign(i, getAdvice(ia.get()).getQualifiedName(), GremlinClause.INLINE_GET_PROPERTY);
+ scc.assign(i, getQualifiedName(getAdvice(ia.get())), GremlinClause.INLINE_GET_PROPERTY);
}
} else {
- scc.assign(i, ia.getQualifiedName(), GremlinClause.INLINE_GET_PROPERTY);
+ scc.assign(i, getQualifiedName(ia), GremlinClause.INLINE_GET_PROPERTY);
}
}
}
+ private boolean hasNoopCondition(IdentifierHelper.Advice ia) {
+ return ia.isPrimitive() == false &&
+ ia.isAttribute() == false &&
+ context.hasAlias(ia.getRaw());
+ }
+
public GremlinQueryComposer createNestedProcessor() {
GremlinQueryComposer qp = new GremlinQueryComposer(lookup, queryMetadata, true);
qp.context = this.context;
@@ -288,12 +310,7 @@ public class GremlinQueryComposer {
}
public List<String> getErrorList() {
- combineErrorLists();
- return errorList;
- }
-
- private void combineErrorLists() {
- errorList.addAll(context.getErrorList());
+ return context.getErrorList();
}
private String getTransformedClauses(String[] items) {
@@ -327,12 +344,12 @@ public class GremlinQueryComposer {
IdentifierHelper.Advice ia = getAdvice(name);
if (queryMetadata.hasSelect() && queryMetadata.hasGroupBy()) {
- addSelectTransformation(this.context.selectClauseComposer, ia.getQualifiedName(), isDesc);
+ addSelectTransformation(this.context.selectClauseComposer, getQualifiedName(ia), isDesc);
} else if (queryMetadata.hasGroupBy()) {
- addOrderByClause(ia.getQualifiedName(), isDesc);
+ addOrderByClause(getQualifiedName(ia), isDesc);
moveToLast(GremlinClause.GROUP_BY);
} else {
- addOrderByClause(ia.getQualifiedName(), isDesc);
+ addOrderByClause(getQualifiedName(ia), isDesc);
}
}
@@ -393,7 +410,7 @@ public class GremlinQueryComposer {
try {
return DSL_DATE_FORMAT.get().parse(s).getTime();
} catch (ParseException ex) {
- errorList.add(ex.getMessage());
+ context.errorList.add(ex.getMessage());
}
return -1;
@@ -439,7 +456,7 @@ public class GremlinQueryComposer {
private boolean introduceType(IdentifierHelper.Advice ia) {
if (ia.getIntroduceType()) {
add(GremlinClause.OUT, ia.getEdgeLabel());
- context.registerActive(ia.getTypeName());
+ context.registerActive(ia);
}
return ia.getIntroduceType();
@@ -475,7 +492,7 @@ public class GremlinQueryComposer {
}
IdentifierHelper.Advice ia = getAdvice(name);
- add((!descr) ? GremlinClause.ORDER_BY : GremlinClause.ORDER_BY_DESC, ia.getQualifiedName());
+ add((!descr) ? GremlinClause.ORDER_BY : GremlinClause.ORDER_BY_DESC, getQualifiedName(ia));
}
private void addGroupByClause(String name) {
@@ -484,7 +501,7 @@ public class GremlinQueryComposer {
}
IdentifierHelper.Advice ia = getAdvice(name);
- add(GremlinClause.GROUP_BY, ia.getQualifiedName());
+ add(GremlinClause.GROUP_BY, getQualifiedName(ia));
}
public boolean hasFromClause() {
@@ -590,23 +607,38 @@ public class GremlinQueryComposer {
@VisibleForTesting
static class Context {
- private final List<String> errorList;
- Lookup lookup;
- Map<String, String> aliasMap = new HashMap<>();
- private AtlasType activeType;
- private SelectClauseComposer selectClauseComposer;
+ private static final AtlasStructType UNKNOWN_TYPE = new AtlasStructType(new AtlasStructDef());
- public Context(List<String> errorList, Lookup lookup) {
+ private final Lookup lookup;
+ private final List<String> errorList = new ArrayList<>();
+ private final Map<String, String> aliasMap = new HashMap<>();
+ private AtlasType activeType;
+ private SelectClauseComposer selectClauseComposer;
+
+ public Context(Lookup lookup) {
this.lookup = lookup;
- this.errorList = errorList;
}
public void registerActive(String typeName) {
if(shouldRegister(typeName)) {
- activeType = lookup.getType(typeName);
+ try {
+ activeType = lookup.getType(typeName);
+
+ aliasMap.put(typeName, typeName);
+ } catch (AtlasBaseException e) {
+ errorList.add(e.getMessage());
+ activeType = UNKNOWN_TYPE;
+ }
}
+ }
- aliasMap.put(typeName, typeName);
+ public void registerActive(IdentifierHelper.Advice advice) {
+ if (StringUtils.isNotEmpty(advice.getTypeName())) {
+ registerActive(advice.getTypeName());
+ } else {
+ errorList.add("unknown identifier '" + advice.getRaw() + "'");
+ activeType = UNKNOWN_TYPE;
+ }
}
public AtlasType getActiveType() {
@@ -659,7 +691,6 @@ public class GremlinQueryComposer {
}
public List<String> getErrorList() {
- errorList.addAll(lookup.getErrorList());
return errorList;
}
}
http://git-wip-us.apache.org/repos/asf/atlas/blob/4c9a3bf7/repository/src/main/java/org/apache/atlas/query/IdentifierHelper.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/query/IdentifierHelper.java b/repository/src/main/java/org/apache/atlas/query/IdentifierHelper.java
index d8221aa..ab91800 100644
--- a/repository/src/main/java/org/apache/atlas/query/IdentifierHelper.java
+++ b/repository/src/main/java/org/apache/atlas/query/IdentifierHelper.java
@@ -18,6 +18,7 @@
package org.apache.atlas.query;
+import org.apache.atlas.exception.AtlasBaseException;
import org.apache.commons.lang.StringUtils;
import java.util.regex.Matcher;
@@ -61,7 +62,13 @@ public class IdentifierHelper {
public static String getQualifiedName(org.apache.atlas.query.Lookup lookup,
GremlinQueryComposer.Context context,
String name) {
- return lookup.getQualifiedName(context, name);
+ try {
+ return lookup.getQualifiedName(context, name);
+ } catch (AtlasBaseException e) {
+ context.getErrorList().add(String.format("Error for %s.%s: %s", context.getActiveTypeName(), name, e.getMessage()));
+ }
+
+ return "";
}
public static boolean isQuoted(String val) {
@@ -101,7 +108,6 @@ public class IdentifierHelper {
private String attributeName;
private boolean isPrimitive;
private String edgeLabel;
- private String edgeDirection;
private boolean introduceType;
private boolean hasSubtypes;
private String subTypes;
@@ -117,18 +123,22 @@ public class IdentifierHelper {
}
private void update(org.apache.atlas.query.Lookup lookup, GremlinQueryComposer.Context context) {
- newContext = context.isEmpty();
- if(!newContext) {
- if(context.aliasMap.containsKey(this.raw)) {
- raw = context.aliasMap.get(this.raw);
- }
+ try {
+ newContext = context.isEmpty();
+ if (!newContext) {
+ if (context.hasAlias(this.raw)) {
+ raw = context.getTypeNameFromAlias(this.raw);
+ }
- updateParts();
- updateTypeInfo(lookup, context);
- isTrait = lookup.isTraitType(context);
- updateEdgeInfo(lookup, context);
- introduceType = !isPrimitive() && !context.hasAlias(parts[0]);
- updateSubTypes(lookup, context);
+ updateParts();
+ updateTypeInfo(lookup, context);
+ isTrait = lookup.isTraitType(context);
+ updateEdgeInfo(lookup, context);
+ introduceType = !isPrimitive() && !context.hasAlias(parts[0]);
+ updateSubTypes(lookup, context);
+ }
+ } catch (NullPointerException ex) {
+ context.getErrorList().add(ex.getMessage());
}
}
@@ -146,50 +156,65 @@ public class IdentifierHelper {
private void updateEdgeInfo(org.apache.atlas.query.Lookup lookup, GremlinQueryComposer.Context context) {
if(isPrimitive == false && isTrait == false) {
edgeLabel = lookup.getRelationshipEdgeLabel(context, attributeName);
- edgeDirection = "OUT";
typeName = lookup.getTypeFromEdge(context, attributeName);
}
}
private void updateTypeInfo(org.apache.atlas.query.Lookup lookup, GremlinQueryComposer.Context context) {
if(parts.length == 1) {
- typeName = context.getActiveTypeName();
+ typeName = context.hasAlias(parts[0]) ?
+ context.getTypeNameFromAlias(parts[0]) :
+ context.getActiveTypeName();
+ qualifiedName = getDefaultQualifiedNameForSinglePartName(context, parts[0]);
attributeName = parts[0];
- isAttribute = lookup.hasAttribute(context, typeName);
- qualifiedName = lookup.getQualifiedName(context, attributeName);
- isPrimitive = lookup.isPrimitive(context, attributeName);
-
- setIsDate(lookup, context);
}
if(parts.length == 2) {
- if(context.hasAlias(parts[0])) {
- typeName = context.getTypeNameFromAlias(parts[0]);
+ boolean isAttrOfActiveType = lookup.hasAttribute(context, parts[0]);
+ if(isAttrOfActiveType) {
+ attributeName = parts[0];
+ } else {
+ typeName = context.hasAlias(parts[0]) ?
+ context.getTypeNameFromAlias(parts[0]) :
+ parts[0];
+
attributeName = parts[1];
- isPrimitive = lookup.isPrimitive(context, attributeName);
- setIsDate(lookup, context);
- }
- else {
- isAttribute = lookup.hasAttribute(context, parts[0]);
- if(isAttribute) {
- attributeName = parts[0];
- isPrimitive = lookup.isPrimitive(context, attributeName);
- setIsDate(lookup, context);
- } else {
- typeName = parts[0];
- attributeName = parts[1];
- isPrimitive = lookup.isPrimitive(context, attributeName);
- setIsDate(lookup, context);
- }
}
+ }
+
+ isAttribute = lookup.hasAttribute(context, attributeName);
+ isPrimitive = lookup.isPrimitive(context, attributeName);
+ setQualifiedName(lookup, context, isAttribute, attributeName);
+ setIsDate(lookup, context, isPrimitive, attributeName);
+ }
+
+ private String getDefaultQualifiedNameForSinglePartName(GremlinQueryComposer.Context context, String s) {
+ String qn = context.getTypeNameFromAlias(s);
+ if(StringUtils.isEmpty(qn) && SelectClauseComposer.isKeyword(s)) {
+ return s;
+ }
- qualifiedName = lookup.getQualifiedName(context, attributeName);
+ return qn;
+ }
+
+ private void setQualifiedName(Lookup lookup, GremlinQueryComposer.Context context, boolean isAttribute, String attrName) {
+ if(isAttribute) {
+ qualifiedName = getQualifiedName(lookup, context, attrName);
}
}
- private void setIsDate(Lookup lookup, GremlinQueryComposer.Context context) {
+ private String getQualifiedName(Lookup lookup, GremlinQueryComposer.Context context, String name) {
+ try {
+ return lookup.getQualifiedName(context, name);
+ } catch (AtlasBaseException e) {
+ context.getErrorList().add(String.format("Error for %s.%s: %s", context.getActiveTypeName(), name, e.getMessage()));
+ return "";
+ }
+ }
+
+ private void setIsDate(Lookup lookup, GremlinQueryComposer.Context context, boolean isPrimitive, String attrName) {
if(isPrimitive) {
- isDate = lookup.isDate(context, attributeName);
+ isDate = lookup.isDate(context, attrName);
}
}
@@ -248,5 +273,9 @@ public class IdentifierHelper {
public boolean hasParts() {
return parts.length > 1;
}
- }
+
+ public String getRaw() {
+ return raw;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/atlas/blob/4c9a3bf7/repository/src/main/java/org/apache/atlas/query/Lookup.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/query/Lookup.java b/repository/src/main/java/org/apache/atlas/query/Lookup.java
index fa75cfb..9a7d474 100644
--- a/repository/src/main/java/org/apache/atlas/query/Lookup.java
+++ b/repository/src/main/java/org/apache/atlas/query/Lookup.java
@@ -18,15 +18,16 @@
package org.apache.atlas.query;
+import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.type.AtlasType;
import java.util.Collection;
import java.util.List;
public interface Lookup {
- AtlasType getType(String typeName);
+ AtlasType getType(String typeName) throws AtlasBaseException;
- String getQualifiedName(GremlinQueryComposer.Context context, String name);
+ String getQualifiedName(GremlinQueryComposer.Context context, String name) throws AtlasBaseException;
boolean isPrimitive(GremlinQueryComposer.Context context, String attributeName);
@@ -43,6 +44,4 @@ public interface Lookup {
String getTypeFromEdge(GremlinQueryComposer.Context context, String item);
boolean isDate(GremlinQueryComposer.Context context, String attributeName);
-
- List<String> getErrorList();
}
http://git-wip-us.apache.org/repos/asf/atlas/blob/4c9a3bf7/repository/src/main/java/org/apache/atlas/query/RegistryBasedLookup.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/query/RegistryBasedLookup.java b/repository/src/main/java/org/apache/atlas/query/RegistryBasedLookup.java
index b78bd2e..eef3463 100644
--- a/repository/src/main/java/org/apache/atlas/query/RegistryBasedLookup.java
+++ b/repository/src/main/java/org/apache/atlas/query/RegistryBasedLookup.java
@@ -20,6 +20,7 @@ package org.apache.atlas.query;
import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.model.TypeCategory;
+import org.apache.atlas.model.instance.AtlasObjectId;
import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
import org.apache.atlas.type.*;
import org.apache.commons.lang.StringUtils;
@@ -37,30 +38,18 @@ class RegistryBasedLookup implements Lookup {
}
@Override
- public AtlasType getType(String typeName) {
- try {
- return typeRegistry.getType(typeName);
- } catch (AtlasBaseException e) {
- addError(e.getMessage());
- }
-
- return null;
+ public AtlasType getType(String typeName) throws AtlasBaseException {
+ return typeRegistry.getType(typeName);
}
@Override
- public String getQualifiedName(GremlinQueryComposer.Context context, String name) {
- try {
- AtlasEntityType et = context.getActiveEntityType();
- if(et == null) {
- return "";
- }
-
- return et.getQualifiedAttributeName(name);
- } catch (AtlasBaseException e) {
- addError(e.getMessage());
+ public String getQualifiedName(GremlinQueryComposer.Context context, String name) throws AtlasBaseException {
+ AtlasEntityType et = context.getActiveEntityType();
+ if (et == null) {
+ return "";
}
- return "";
+ return et.getQualifiedAttributeName(name);
}
@Override
@@ -70,13 +59,29 @@ class RegistryBasedLookup implements Lookup {
return false;
}
- AtlasType attr = et.getAttributeType(attributeName);
- if(attr == null) {
+ AtlasType at = et.getAttributeType(attributeName);
+ if(at == null) {
return false;
}
- TypeCategory attrTypeCategory = attr.getTypeCategory();
- return (attrTypeCategory != null) && (attrTypeCategory == TypeCategory.PRIMITIVE || attrTypeCategory == TypeCategory.ENUM);
+ TypeCategory tc = at.getTypeCategory();
+ if (isPrimitiveUsingTypeCategory(tc)) return true;
+
+ if ((tc != null) && (tc == TypeCategory.ARRAY)) {
+ AtlasArrayType ct = ((AtlasArrayType)at);
+ return isPrimitiveUsingTypeCategory(ct.getElementType().getTypeCategory());
+ }
+
+ if ((tc != null) && (tc == TypeCategory.MAP)) {
+ AtlasMapType ct = ((AtlasMapType)at);
+ return isPrimitiveUsingTypeCategory(ct.getValueType().getTypeCategory());
+ }
+
+ return false;
+ }
+
+ private boolean isPrimitiveUsingTypeCategory(TypeCategory tc) {
+ return ((tc != null) && (tc == TypeCategory.PRIMITIVE || tc == TypeCategory.ENUM));
}
@Override
@@ -136,14 +141,27 @@ class RegistryBasedLookup implements Lookup {
}
AtlasType at = attr.getAttributeType();
- if(at.getTypeCategory() == TypeCategory.ARRAY) {
- AtlasArrayType arrType = ((AtlasArrayType)at);
- return ((AtlasBuiltInTypes.AtlasObjectIdType) arrType.getElementType()).getObjectType();
+ switch (at.getTypeCategory()) {
+ case ARRAY:
+ AtlasArrayType arrType = ((AtlasArrayType)at);
+ return getCollectionElementType(arrType.getElementType());
+
+ case MAP:
+ AtlasMapType mapType = ((AtlasMapType)at);
+ return getCollectionElementType(mapType.getValueType());
}
return context.getActiveEntityType().getAttribute(item).getTypeName();
}
+ private String getCollectionElementType(AtlasType elemType) {
+ if(elemType.getTypeCategory() == TypeCategory.OBJECT_ID_TYPE) {
+ return ((AtlasBuiltInTypes.AtlasObjectIdType)elemType).getObjectType();
+ } else {
+ return elemType.getTypeName();
+ }
+ }
+
@Override
public boolean isDate(GremlinQueryComposer.Context context, String attributeName) {
AtlasEntityType et = context.getActiveEntityType();
@@ -155,13 +173,4 @@ class RegistryBasedLookup implements Lookup {
return attr != null && attr.getTypeName().equals(AtlasBaseTypeDef.ATLAS_TYPE_DATE);
}
-
- protected void addError(String s) {
- errorList.add(s);
- }
-
- @Override
- public List<String> getErrorList() {
- return errorList;
- }
}
http://git-wip-us.apache.org/repos/asf/atlas/blob/4c9a3bf7/repository/src/main/java/org/apache/atlas/query/SelectClauseComposer.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/query/SelectClauseComposer.java b/repository/src/main/java/org/apache/atlas/query/SelectClauseComposer.java
index b93e223..b7f6d3a 100644
--- a/repository/src/main/java/org/apache/atlas/query/SelectClauseComposer.java
+++ b/repository/src/main/java/org/apache/atlas/query/SelectClauseComposer.java
@@ -24,6 +24,11 @@ import java.util.Map;
import java.util.StringJoiner;
class SelectClauseComposer {
+ private static final String COUNT_STR = "count";
+ private static final String MIN_STR = "min";
+ private static final String MAX_STR = "max";
+ private static final String SUM_STR = "sum";
+
public boolean isSelectNoop;
private String[] labels;
@@ -50,16 +55,16 @@ class SelectClauseComposer {
public boolean updateAsApplicable(int currentIndex, String qualifiedName) {
boolean ret = false;
if (currentIndex == getCountIdx()) {
- ret = assign(currentIndex, "count",
+ ret = assign(currentIndex, COUNT_STR,
GremlinClause.INLINE_COUNT.get(), GremlinClause.INLINE_ASSIGNMENT);
} else if (currentIndex == getMinIdx()) {
- ret = assign(currentIndex, "min", qualifiedName,
+ ret = assign(currentIndex, MIN_STR, qualifiedName,
GremlinClause.INLINE_ASSIGNMENT, GremlinClause.INLINE_MIN);
} else if (currentIndex == getMaxIdx()) {
- ret = assign(currentIndex, "max", qualifiedName,
+ ret = assign(currentIndex, MAX_STR, qualifiedName,
GremlinClause.INLINE_ASSIGNMENT, GremlinClause.INLINE_MAX);
} else if (currentIndex == getSumIdx()) {
- ret = assign(currentIndex, "sum", qualifiedName,
+ ret = assign(currentIndex, SUM_STR, qualifiedName,
GremlinClause.INLINE_ASSIGNMENT, GremlinClause.INLINE_SUM);
} else {
attributes[currentIndex] = qualifiedName;
@@ -68,6 +73,13 @@ class SelectClauseComposer {
return ret;
}
+ public static boolean isKeyword(String s) {
+ return COUNT_STR.equals(s) ||
+ MIN_STR.equals(s) ||
+ MAX_STR.equals(s) ||
+ SUM_STR.equals(s);
+ }
+
public String[] getAttributes() {
return attributes;
}
http://git-wip-us.apache.org/repos/asf/atlas/blob/4c9a3bf7/repository/src/test/java/org/apache/atlas/query/DSLQueriesTest.java
----------------------------------------------------------------------
diff --git a/repository/src/test/java/org/apache/atlas/query/DSLQueriesTest.java b/repository/src/test/java/org/apache/atlas/query/DSLQueriesTest.java
index 5db55dc..c44eea3 100644
--- a/repository/src/test/java/org/apache/atlas/query/DSLQueriesTest.java
+++ b/repository/src/test/java/org/apache/atlas/query/DSLQueriesTest.java
@@ -116,6 +116,7 @@ public class DSLQueriesTest extends BasicTestSetup {
return new Object[][]{
{"from hive_db", 3},
{"hive_db", 3},
+ {"hive_db as d select d", 3},
{"hive_db where hive_db.name=\"Reporting\"", 1},
{"hive_db where hive_db.name=\"Reporting\" select name, owner", 1},
{"hive_db has name", 3},
@@ -133,7 +134,7 @@ public class DSLQueriesTest extends BasicTestSetup {
{"hive_db where hive_db is JdbcAccess", 0},
{"hive_db where hive_db has name", 3},
{"hive_db as db1 hive_table where (db1.name = \"Reporting\")", 0},
- {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01\" ) select name as _col_0, createTime as _col_1", 1},
+ {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01T0:0:0.0Z\" ) select name as _col_0, createTime as _col_1", 1},
{"hive_table where (name = \"sales_fact\" and createTime >= \"2014-12-11T02:35:58.440Z\" ) select name as _col_0, createTime as _col_1", 1},
{"Dimension", 5},
{"JdbcAccess", 2},
@@ -141,8 +142,6 @@ public class DSLQueriesTest extends BasicTestSetup {
{"Metric", 5},
{"PII", 4},
{"`Log Data`", 3},
- {"`isa`", 0},
- {"hive_table as t, sd, hive_column as c where t.name=\"sales_fact\" select c.name as colName, c.dataType as colType", 0},
{"DataSet where name='sales_fact'", 1},
{"Asset where name='sales_fact'", 1}
};
@@ -151,7 +150,7 @@ public class DSLQueriesTest extends BasicTestSetup {
@Test(dataProvider = "basicProvider")
public void basic(String query, int expected) throws AtlasBaseException {
queryAssert(query, expected);
- //queryAssert(query.replace("where", " "), expected);
+ queryAssert(query.replace("where", " "), expected);
}
private void queryAssert(String query, int expected) throws AtlasBaseException {
@@ -249,10 +248,10 @@ public class DSLQueriesTest extends BasicTestSetup {
{"hive_db as db1 hive_table where (db1.name = \"Reporting\")", 0},
- {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01\" ) select name as _col_0, createTime as _col_1", 1},
- {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01\" ) select name as _col_0, createTime as _col_1 limit 10", 1},
- {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01\" ) select name as _col_0, createTime as _col_1 limit 10 offset 0", 1},
- {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01\" ) select name as _col_0, createTime as _col_1 limit 10 offset 5", 0},
+ {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01T0:0:0.0Z\" ) select name as _col_0, createTime as _col_1", 1},
+ {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01T0:0:0.0Z\" ) select name as _col_0, createTime as _col_1 limit 10", 1},
+ {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01T0:0:0.0Z\" ) select name as _col_0, createTime as _col_1 limit 10 offset 0", 1},
+ {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01T0:0:0.0Z\" ) select name as _col_0, createTime as _col_1 limit 10 offset 5", 0},
{"hive_table where (name = \"sales_fact\" and createTime >= \"2014-12-11T02:35:58.440Z\" ) select name as _col_0, createTime as _col_1", 1},
{"hive_table where (name = \"sales_fact\" and createTime >= \"2014-12-11T02:35:58.440Z\" ) select name as _col_0, createTime as _col_1 limit 10 offset 0", 1},
@@ -332,10 +331,10 @@ public class DSLQueriesTest extends BasicTestSetup {
{"hive_db where hive_db has name orderby hive_db.owner limit 2 offset 0", 2, "owner", true},
{"hive_db where hive_db has name orderby hive_db.owner limit 2 offset 1", 2, "owner", true},
- {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01\" ) select name as _col_0, createTime as _col_1 orderby createTime ", 1, "_col_1", true},
- {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01\" ) select name as _col_0, createTime as _col_1 orderby createTime limit 10 ", 1, "_col_1", true},
- {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01\" ) select name as _col_0, createTime as _col_1 orderby createTime limit 10 offset 0", 1, "_col_1", true},
- {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01\" ) select name as _col_0, createTime as _col_1 orderby createTime limit 10 offset 5", 0, "_col_1", true},
+ {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01T0:0:0.0Z\" ) select name as _col_0, createTime as _col_1 orderby createTime ", 1, "_col_1", true},
+ {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01T0:0:0.0Z\" ) select name as _col_0, createTime as _col_1 orderby createTime limit 10 ", 1, "_col_1", true},
+ {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01T0:0:0.0Z\" ) select name as _col_0, createTime as _col_1 orderby createTime limit 10 offset 0", 1, "_col_1", true},
+ {"hive_table where (name = \"sales_fact\" and createTime > \"2014-01-01T0:0:0.0Z\" ) select name as _col_0, createTime as _col_1 orderby createTime limit 10 offset 5", 0, "_col_1", true},
{"hive_table where (name = \"sales_fact\" and createTime >= \"2014-12-11T02:35:58.440Z\" ) select name as _col_0, createTime as _col_1 orderby name ", 1, "_col_0", true},
{"hive_table where (name = \"sales_fact\" and createTime >= \"2014-12-11T02:35:58.440Z\" ) select name as _col_0, createTime as _col_1 orderby name limit 10 offset 0", 1, "_col_0", true},
@@ -469,8 +468,6 @@ public class DSLQueriesTest extends BasicTestSetup {
new FieldValueValidator()
.withFieldNames("'count'", "'sum'")
.withExpectedValues(4, 86) },
- // tests to ensure that group by works with order by and limit
- // FIXME:
// { "from hive_db groupby (owner) select min(name) orderby name limit 2 ",
// new FieldValueValidator()
// .withFieldNames("min(name)")
@@ -490,6 +487,22 @@ public class DSLQueriesTest extends BasicTestSetup {
queryAssert(query.replace("where", " "), fv);
}
+ @DataProvider(name = "errorQueriesProvider")
+ private Object[][] errorQueries() {
+ return new Object[][]{
+ {"`isa`"},
+ {"PIII"},
+ {"DBBB as d select d"},
+ {"hive_table where (name = \"sales_fact\" and createTime >= \"2014-12-11\" ) select name as _col_0, createTime as _col_1 orderby name limit 0 offset 1"},
+ {"hive_table as t, sd, hive_column as c where t.name=\"sales_fact\" select c.name as colName, c.dataType as colType"}
+ };
+ }
+
+ @Test(dataProvider = "errorQueriesProvider", expectedExceptions = { AtlasBaseException.class })
+ public void errorQueries(String query) throws AtlasBaseException {
+ discoveryService.searchUsingDslQuery(query, 25, 0);
+ }
+
private void queryAssert(String query, FieldValueValidator fv) throws AtlasBaseException {
AtlasSearchResult searchResult = discoveryService.searchUsingDslQuery(query, 25, 0);
assertSearchResult(searchResult, fv);
http://git-wip-us.apache.org/repos/asf/atlas/blob/4c9a3bf7/repository/src/test/java/org/apache/atlas/query/GremlinQueryComposerTest.java
----------------------------------------------------------------------
diff --git a/repository/src/test/java/org/apache/atlas/query/GremlinQueryComposerTest.java b/repository/src/test/java/org/apache/atlas/query/GremlinQueryComposerTest.java
index 3fcd325..36f0bf7 100644
--- a/repository/src/test/java/org/apache/atlas/query/GremlinQueryComposerTest.java
+++ b/repository/src/test/java/org/apache/atlas/query/GremlinQueryComposerTest.java
@@ -76,6 +76,7 @@ public class GremlinQueryComposerTest {
"f(g.V().has('__typeName', 'DB').as('d')";
verify("DB as d select d.name, d.owner", expected + ".limit(25).toList())");
verify("DB as d select d.name, d.owner limit 10", expected + ".limit(10).toList())");
+ verify("DB as d select d","def f(r){ r }; f(g.V().has('__typeName', 'DB').as('d').limit(25).toList())");
}
@Test
@@ -178,8 +179,8 @@ public class GremlinQueryComposerTest {
@Test
public void whereClauseWithDateCompare() {
String exSel = "def f(r){ t=[['t.name','t.owner']]; r.each({t.add([it.value('Table.name'),it.value('Table.owner')])}); t.unique(); }";
- String exMain = "g.V().has('__typeName', 'Table').as('t').has('Table.createdTime', eq('1513046158440')).limit(25).toList()";
- verify("Table as t where t.createdTime = \"2017-12-12T02:35:58.440Z\" select t.name, t.owner)", getExpected(exSel, exMain));
+ String exMain = "g.V().has('__typeName', 'Table').as('t').has('Table.createTime', eq('1513046158440')).limit(25).toList()";
+ verify("Table as t where t.createTime = \"2017-12-12T02:35:58.440Z\" select t.name, t.owner)", getExpected(exSel, exMain));
}
@Test
@@ -277,8 +278,8 @@ public class GremlinQueryComposerTest {
"__.has('Table.owner', eq(\"Joe BI\"))" +
"))" +
".limit(25).toList()"},
- {"Table where owner=\"hdfs\" or ((name=\"testtable_1\" or name=\"testtable_2\") and createdTime < \"2017-12-12T02:35:58.440Z\")",
- "g.V().has('__typeName', 'Table').or(__.has('Table.owner', eq(\"hdfs\")),__.and(__.or(__.has('Table.name', eq(\"testtable_1\")),__.has('Table.name', eq(\"testtable_2\"))),__.has('Table.createdTime', lt('1513046158440')))).limit(25).toList()"},
+ {"Table where owner=\"hdfs\" or ((name=\"testtable_1\" or name=\"testtable_2\") and createTime < \"2017-12-12T02:35:58.440Z\")",
+ "g.V().has('__typeName', 'Table').or(__.has('Table.owner', eq(\"hdfs\")),__.and(__.or(__.has('Table.name', eq(\"testtable_1\")),__.has('Table.name', eq(\"testtable_2\"))),__.has('Table.createTime', lt('1513046158440')))).limit(25).toList()"},
{"hive_db where hive_db.name='Reporting' and hive_db.createTime < '2017-12-12T02:35:58.440Z'",
"g.V().has('__typeName', 'hive_db').and(__.has('hive_db.name', eq('Reporting')),__.has('hive_db.createTime', lt('1513046158440'))).limit(25).toList()"},
{"Table where db.name='Sales' and db.clusterName='cl1'",
@@ -293,9 +294,10 @@ public class GremlinQueryComposerTest {
}
@Test
- public void hasInWhereClause() {
+ public void keywordsInWhereClause() {
verify("Table as t where t has name and t isa Dimension",
"g.V().has('__typeName', 'Table').as('t').and(__.has('Table.name'),__.has('__traitNames', within('Dimension'))).limit(25).toList()");
+
verify("Table as t where t has name and t.name = 'sales_fact'",
"g.V().has('__typeName', 'Table').as('t').and(__.has('Table.name'),__.has('Table.name', eq('sales_fact'))).limit(25).toList()");
verify("Table as t where t is Dimension and t.name = 'sales_fact'",
@@ -306,6 +308,7 @@ public class GremlinQueryComposerTest {
@Test
public void invalidQueries() {
verify("hdfs_path like h1", "");
+// verify("hdfs_path select xxx", "");
}
private void verify(String dsl, String expectedGremlin) {
@@ -332,7 +335,7 @@ public class GremlinQueryComposerTest {
private String getGremlinQuery(AtlasDSLParser.QueryContext queryContext) {
AtlasTypeRegistry registry = mock(AtlasTypeRegistry.class);
org.apache.atlas.query.Lookup lookup = new TestLookup(errorList, registry);
- GremlinQueryComposer.Context context = new GremlinQueryComposer.Context(errorList, lookup);
+ GremlinQueryComposer.Context context = new GremlinQueryComposer.Context(lookup);
AtlasDSL.QueryMetadata queryMetadata = new AtlasDSL.QueryMetadata(queryContext);
GremlinQueryComposer gremlinQueryComposer = new GremlinQueryComposer(lookup, context, queryMetadata);
@@ -340,6 +343,7 @@ public class GremlinQueryComposerTest {
qv.visit(queryContext);
String s = gremlinQueryComposer.get();
+ assertEquals(gremlinQueryComposer.getErrorList().size(), 0);
return s;
}
@@ -367,18 +371,24 @@ public class GremlinQueryComposerTest {
}
@Override
- public String getQualifiedName(GremlinQueryComposer.Context context, String name) {
+ public String getQualifiedName(GremlinQueryComposer.Context context, String name) throws AtlasBaseException {
+ if(!hasAttribute(context, name)) {
+ throw new AtlasBaseException("Invalid attribute");
+ }
+
if(name.contains("."))
return name;
- return String.format("%s.%s", context.getActiveTypeName(), name);
+ if(!context.getActiveTypeName().equals(name))
+ return String.format("%s.%s", context.getActiveTypeName(), name);
+ else
+ return name;
}
@Override
public boolean isPrimitive(GremlinQueryComposer.Context context, String attributeName) {
return attributeName.equals("name") ||
attributeName.equals("owner") ||
- attributeName.equals("createdTime") ||
attributeName.equals("createTime") ||
attributeName.equals("clusterName");
}
@@ -394,9 +404,22 @@ public class GremlinQueryComposerTest {
}
@Override
- public boolean hasAttribute(GremlinQueryComposer.Context context, String typeName) {
- return (context.getActiveTypeName().equals("Table") && typeName.equals("db")) ||
- (context.getActiveTypeName().equals("Table") && typeName.equals("columns"));
+ public boolean hasAttribute(GremlinQueryComposer.Context context, String attributeName) {
+ return (context.getActiveTypeName().equals("Table") && attributeName.equals("db")) ||
+ (context.getActiveTypeName().equals("Table") && attributeName.equals("columns")) ||
+ (context.getActiveTypeName().equals("Table") && attributeName.equals("createTime")) ||
+ (context.getActiveTypeName().equals("Table") && attributeName.equals("name")) ||
+ (context.getActiveTypeName().equals("Table") && attributeName.equals("owner")) ||
+ (context.getActiveTypeName().equals("Table") && attributeName.equals("clusterName")) ||
+ (context.getActiveTypeName().equals("Table") && attributeName.equals("isFile")) ||
+ (context.getActiveTypeName().equals("hive_db") && attributeName.equals("name")) ||
+ (context.getActiveTypeName().equals("hive_db") && attributeName.equals("owner")) ||
+ (context.getActiveTypeName().equals("hive_db") && attributeName.equals("createTime")) ||
+ (context.getActiveTypeName().equals("DB") && attributeName.equals("name")) ||
+ (context.getActiveTypeName().equals("DB") && attributeName.equals("owner")) ||
+ (context.getActiveTypeName().equals("DB") && attributeName.equals("clusterName")) ||
+ (context.getActiveTypeName().equals("Asset") && attributeName.equals("name")) ||
+ (context.getActiveTypeName().equals("Asset") && attributeName.equals("owner"));
}
@Override
@@ -425,19 +448,15 @@ public class GremlinQueryComposerTest {
return "DB";
} else if(context.getActiveTypeName().equals("Table") && item.equals("columns")) {
return "Column";
+ } else if(context.getActiveTypeName().equals(item)) {
+ return null;
}
return context.getActiveTypeName();
}
@Override
public boolean isDate(GremlinQueryComposer.Context context, String attributeName) {
- return attributeName.equals("createdTime") ||
- attributeName.equals("createTime");
- }
-
- @Override
- public List<String> getErrorList() {
- return errorList;
+ return attributeName.equals("createTime");
}
}
}