Repository: atlas Updated Branches: refs/heads/branch-0.8 1a3a2a532 -> c61d489cc
ATLAS-2184: IS_NULL, NOT_NULL operator support (#2) (cherry picked from commit 3af5436) Project: http://git-wip-us.apache.org/repos/asf/atlas/repo Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/c61d489c Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/c61d489c Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/c61d489c Branch: refs/heads/branch-0.8 Commit: c61d489cc99d46f4521a5ef3c431090cc0a0af25 Parents: 1a3a2a5 Author: apoorvnaik <[email protected]> Authored: Thu Sep 28 12:56:24 2017 -0700 Committer: apoorvnaik <[email protected]> Committed: Fri Sep 29 18:41:19 2017 -0700 ---------------------------------------------------------------------- .../apache/atlas/discovery/SearchProcessor.java | 29 ++++++++++++++------ .../atlas/util/AtlasGremlin2QueryProvider.java | 4 +++ .../atlas/util/AtlasGremlinQueryProvider.java | 9 +++--- 3 files changed, 29 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/atlas/blob/c61d489c/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java b/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java index a20a6c1..ba0cd8a 100644 --- a/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java +++ b/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java @@ -459,6 +459,7 @@ public abstract class SearchProcessor { final Class attrClass; final Object attrValue; + // Some operators support null comparison, thus the parsing has to be conditional switch (attrType.getTypeName()) { case AtlasBaseTypeDef.ATLAS_TYPE_STRING: attrClass = String.class; @@ -466,40 +467,40 @@ public abstract class SearchProcessor { break; case AtlasBaseTypeDef.ATLAS_TYPE_SHORT: attrClass = Short.class; - attrValue = Short.parseShort(attrVal); + attrValue = attrVal == null ? null : Short.parseShort(attrVal); break; case AtlasBaseTypeDef.ATLAS_TYPE_INT: attrClass = Integer.class; - attrValue = Integer.parseInt(attrVal); + attrValue = attrVal == null ? null : Integer.parseInt(attrVal); break; case AtlasBaseTypeDef.ATLAS_TYPE_BIGINTEGER: attrClass = BigInteger.class; - attrValue = new BigInteger(attrVal); + attrValue = attrVal == null ? null : new BigInteger(attrVal); break; case AtlasBaseTypeDef.ATLAS_TYPE_BOOLEAN: attrClass = Boolean.class; - attrValue = Boolean.parseBoolean(attrVal); + attrValue = attrVal == null ? null : Boolean.parseBoolean(attrVal); break; case AtlasBaseTypeDef.ATLAS_TYPE_BYTE: attrClass = Byte.class; - attrValue = Byte.parseByte(attrVal); + attrValue = attrVal == null ? null : Byte.parseByte(attrVal); break; case AtlasBaseTypeDef.ATLAS_TYPE_LONG: case AtlasBaseTypeDef.ATLAS_TYPE_DATE: attrClass = Long.class; - attrValue = Long.parseLong(attrVal); + attrValue = attrVal == null ? null : Long.parseLong(attrVal); break; case AtlasBaseTypeDef.ATLAS_TYPE_FLOAT: attrClass = Float.class; - attrValue = Float.parseFloat(attrVal); + attrValue = attrVal == null ? null : Float.parseFloat(attrVal); break; case AtlasBaseTypeDef.ATLAS_TYPE_DOUBLE: attrClass = Double.class; - attrValue = Double.parseDouble(attrVal); + attrValue = attrVal == null ? null : Double.parseDouble(attrVal); break; case AtlasBaseTypeDef.ATLAS_TYPE_BIGDECIMAL: attrClass = BigDecimal.class; - attrValue = new BigDecimal(attrVal); + attrValue = attrVal == null ? null : new BigDecimal(attrVal); break; default: if (attrType instanceof AtlasEnumType) { @@ -637,6 +638,12 @@ public abstract class SearchProcessor { case CONTAINS: queryTemplate = queryProvider.getQuery(AtlasGremlinQueryProvider.AtlasGremlinQuery.COMPARE_CONTAINS); break; + case IS_NULL: + queryTemplate = queryProvider.getQuery(AtlasGremlinQueryProvider.AtlasGremlinQuery.COMPARE_IS_NULL); + break; + case NOT_NULL: + queryTemplate = queryProvider.getQuery(AtlasGremlinQueryProvider.AtlasGremlinQuery.COMPARE_NOT_NULL); + break; } if (org.apache.commons.lang3.StringUtils.isNotEmpty(queryTemplate)) { @@ -695,6 +702,10 @@ public abstract class SearchProcessor { } private static boolean hasIndexQuerySpecialChar(String attributeValue) { + if (attributeValue == null) { + return false; + } + for (int i = 0; i < attributeValue.length(); i++) { if (isIndexQuerySpecialChar(attributeValue.charAt(i))) { return true; http://git-wip-us.apache.org/repos/asf/atlas/blob/c61d489c/repository/src/main/java/org/apache/atlas/util/AtlasGremlin2QueryProvider.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/util/AtlasGremlin2QueryProvider.java b/repository/src/main/java/org/apache/atlas/util/AtlasGremlin2QueryProvider.java index ea4676a..9cffdb9 100644 --- a/repository/src/main/java/org/apache/atlas/util/AtlasGremlin2QueryProvider.java +++ b/repository/src/main/java/org/apache/atlas/util/AtlasGremlin2QueryProvider.java @@ -101,6 +101,10 @@ public class AtlasGremlin2QueryProvider extends AtlasGremlinQueryProvider { return ".filter({it.getProperty('%s').endsWith(%s)})"; case COMPARE_CONTAINS: return ".filter({it.getProperty('%s').contains(%s)})"; + case COMPARE_IS_NULL: + return ".hasNot('%s')"; + case COMPARE_NOT_NULL: + return ".has('%s')"; } // Should never reach this point return null; http://git-wip-us.apache.org/repos/asf/atlas/blob/c61d489c/repository/src/main/java/org/apache/atlas/util/AtlasGremlinQueryProvider.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/util/AtlasGremlinQueryProvider.java b/repository/src/main/java/org/apache/atlas/util/AtlasGremlinQueryProvider.java index df433a9..e4898bd 100644 --- a/repository/src/main/java/org/apache/atlas/util/AtlasGremlinQueryProvider.java +++ b/repository/src/main/java/org/apache/atlas/util/AtlasGremlinQueryProvider.java @@ -61,6 +61,9 @@ public abstract class AtlasGremlinQueryProvider { BASIC_SEARCH_STATE_FILTER, TO_RANGE_LIST, GUID_PREFIX_FILTER, + RELATIONSHIP_SEARCH, + RELATIONSHIP_SEARCH_ASCENDING_SORT, + RELATIONSHIP_SEARCH_DESCENDING_SORT, // Comparison clauses COMPARE_LT, @@ -73,9 +76,7 @@ public abstract class AtlasGremlinQueryProvider { COMPARE_STARTS_WITH, COMPARE_ENDS_WITH, COMPARE_CONTAINS, - - RELATIONSHIP_SEARCH, - RELATIONSHIP_SEARCH_ASCENDING_SORT, - RELATIONSHIP_SEARCH_DESCENDING_SORT, + COMPARE_IS_NULL, + COMPARE_NOT_NULL } }
