ATLAS-2229: Added thread-safety for SimpleDateFormat. ATLAS-2229: Modified approach for detecting keywords. Removed unused keywords.
Signed-off-by: apoorvnaik <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/atlas/repo Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/c6cc3314 Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/c6cc3314 Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/c6cc3314 Branch: refs/heads/master Commit: c6cc3314f234c87f856f928f2bdf1e2a935df5a2 Parents: 5c92592 Author: Ashutosh Mestry <[email protected]> Authored: Wed Jan 10 08:18:40 2018 -0800 Committer: apoorvnaik <[email protected]> Committed: Wed Jan 10 14:21:38 2018 -0800 ---------------------------------------------------------------------- .../atlas/discovery/EntityDiscoveryService.java | 12 ++++-------- .../apache/atlas/query/GremlinQueryComposer.java | 18 +++++++++++++----- .../apache/atlas/query/antlr4/AtlasDSLLexer.g4 | 6 ------ 3 files changed, 17 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/atlas/blob/c6cc3314/repository/src/main/java/org/apache/atlas/discovery/EntityDiscoveryService.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/discovery/EntityDiscoveryService.java b/repository/src/main/java/org/apache/atlas/discovery/EntityDiscoveryService.java index ab69fe7..ba00782 100644 --- a/repository/src/main/java/org/apache/atlas/discovery/EntityDiscoveryService.java +++ b/repository/src/main/java/org/apache/atlas/discovery/EntityDiscoveryService.java @@ -68,6 +68,7 @@ import javax.script.Bindings; import javax.script.ScriptEngine; import javax.script.ScriptException; import java.util.*; +import java.util.stream.Stream; import static org.apache.atlas.AtlasErrorCode.CLASSIFICATION_NOT_FOUND; import static org.apache.atlas.AtlasErrorCode.DISCOVERY_QUERY_FAILED; @@ -897,9 +898,7 @@ public class EntityDiscoveryService implements AtlasDiscoveryService { @Override public String getDslQueryUsingTypeNameClassification(String query, String typeName, String classification) { final String whereDSLKeyword = "where"; - final String isaDSLKeyword = "isa"; - final String isDSLKeyword = "is"; - final String limitDSLKeyword = "limit"; + final String[] keywords = new String[]{whereDSLKeyword, "isa", "is", "limit", "orderby", "has"}; final String whereFormat = whereDSLKeyword + " %s"; String queryStr = query == null ? "" : query; @@ -907,10 +906,7 @@ public class EntityDiscoveryService implements AtlasDiscoveryService { if (StringUtils.isNotEmpty(typeName)) { if(StringUtils.isNotEmpty(query)) { String s = query.toLowerCase(); - if(!s.startsWith(whereDSLKeyword) && - !s.startsWith(limitDSLKeyword) && - !s.startsWith(isaDSLKeyword) && - !s.startsWith(isDSLKeyword)) { + if(!Stream.of(keywords).anyMatch(x -> s.startsWith(x))) { queryStr = String.format(whereFormat, query); } } @@ -921,7 +917,7 @@ public class EntityDiscoveryService implements AtlasDiscoveryService { if (StringUtils.isNotEmpty(classification)) { // isa works with a type name only - like hive_column isa PII; it doesn't work with more complex query if (StringUtils.isEmpty(query)) { - queryStr += String.format("%s %s %s", queryStr, isaDSLKeyword, classification); + queryStr += String.format("%s %s %s", queryStr, "isa", classification); } } return queryStr; http://git-wip-us.apache.org/repos/asf/atlas/blob/c6cc3314/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 34a0842..6ccd44c 100644 --- a/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java +++ b/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java @@ -38,7 +38,7 @@ import java.util.stream.Stream; public class GremlinQueryComposer { private static final Logger LOG = LoggerFactory.getLogger(GremlinQueryComposer.class); - private final String DATE_FORMAT_ISO8601_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; + private static final String ISO8601_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; private final int DEFAULT_QUERY_RESULT_LIMIT = 25; private final int DEFAULT_QUERY_RESULT_OFFSET = 0; @@ -50,13 +50,22 @@ public class GremlinQueryComposer { private int providedLimit = DEFAULT_QUERY_RESULT_LIMIT; private int providedOffset = DEFAULT_QUERY_RESULT_OFFSET; private Context context; - private final DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_ISO8601_FORMAT); + + private static final ThreadLocal<DateFormat> DSL_DATE_FORMAT = new ThreadLocal<DateFormat>() { + @Override + public DateFormat initialValue() { + DateFormat ret = new SimpleDateFormat(ISO8601_FORMAT); + + ret.setTimeZone(TimeZone.getTimeZone("UTC")); + + return ret; + } + }; public GremlinQueryComposer(Lookup registryLookup, final AtlasDSL.QueryMetadata qmd, boolean isNestedQuery) { this.isNestedQuery = isNestedQuery; this.lookup = registryLookup; this.queryMetadata = qmd; - dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); init(); } @@ -74,7 +83,6 @@ public class GremlinQueryComposer { this.lookup = lookup; this.context = context; this.queryMetadata = qmd; - dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); init(); } @@ -351,7 +359,7 @@ public class GremlinQueryComposer { public long getDateFormat(String s) { try { - return dateFormat.parse(s).getTime(); + return DSL_DATE_FORMAT.get().parse(s).getTime(); } catch (ParseException ex) { errorList.add(ex.getMessage()); } http://git-wip-us.apache.org/repos/asf/atlas/blob/c6cc3314/repository/src/main/java/org/apache/atlas/query/antlr4/AtlasDSLLexer.g4 ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/query/antlr4/AtlasDSLLexer.g4 b/repository/src/main/java/org/apache/atlas/query/antlr4/AtlasDSLLexer.g4 index 376dcea..15d1bb4 100644 --- a/repository/src/main/java/org/apache/atlas/query/antlr4/AtlasDSLLexer.g4 +++ b/repository/src/main/java/org/apache/atlas/query/antlr4/AtlasDSLLexer.g4 @@ -121,8 +121,6 @@ K_SUM: S U M ; K_COUNT: C O U N T ; -K_LOOP: L O O P ; - K_OFFSET: O F F S E T ; K_AS: A S ; @@ -137,8 +135,6 @@ K_ASC: A S C ; K_DESC: D E S C ; -K_WITHPATH: W I T H P A T H ; - K_TRUE: T R U E ; K_FALSE: F A L S E ; @@ -158,12 +154,10 @@ KEYWORD: K_LIKE | K_OR | K_GROUPBY | K_ORDERBY - | K_WITHPATH | K_SUM | K_MIN | K_MAX | K_OFFSET - | K_LOOP | K_FROM | K_DESC | K_ASC
