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
     }
 }

Reply via email to