Repository: atlas
Updated Branches:
  refs/heads/master bc57e15e5 -> 8d1e72234


ATLAS-2532: Advanced Search: Literals with MAX_VALUEs in Queries


Project: http://git-wip-us.apache.org/repos/asf/atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/8d1e7223
Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/8d1e7223
Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/8d1e7223

Branch: refs/heads/master
Commit: 8d1e72234bdf24ba5fef9921dd827823b59884ad
Parents: bc57e15
Author: Ashutosh Mestry <ames...@hortonworks.com>
Authored: Mon Apr 9 14:47:01 2018 -0700
Committer: Ashutosh Mestry <ames...@hortonworks.com>
Committed: Mon Apr 9 14:57:17 2018 -0700

----------------------------------------------------------------------
 .../atlas/query/GremlinQueryComposer.java       | 23 +++++++++++-----
 .../apache/atlas/query/RegistryBasedLookup.java | 28 +++++++++++---------
 .../org/apache/atlas/query/DSLQueriesTest.java  |  4 +--
 .../atlas/query/GremlinQueryComposerTest.java   |  5 ++--
 4 files changed, 37 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/atlas/blob/8d1e7223/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 a0fb772..9ad9a6e 100644
--- a/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java
+++ b/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java
@@ -168,7 +168,7 @@ public class GremlinQueryComposer {
         if (lhsI.isDate()) {
             rhs = parseDate(rhs);
         } else if (lhsI.isNumeric()) {
-            rhs = parseNumber(rhs);
+            rhs = parseNumber(rhs, this.context);
         }
 
         rhs = addQuotesIfNecessary(lhsI, rhs);
@@ -190,8 +190,8 @@ public class GremlinQueryComposer {
         }
     }
 
-    private String parseNumber(String rhs) {
-        return rhs.replace("'", "").replace("\"", "");
+    private String parseNumber(String rhs, Context context) {
+        return rhs.replace("'", "").replace("\"", "") + 
context.getNumericTypeFormatter();
     }
 
     public void addAndClauses(List<String> clauses) {
@@ -622,10 +622,11 @@ public class GremlinQueryComposer {
         private static final AtlasStructType UNKNOWN_TYPE = new 
AtlasStructType(new AtlasStructDef());
 
         private final Lookup lookup;
-        private final Map<String, String> aliasMap = new HashMap<>();
-        private AtlasType            activeType;
-        private SelectClauseComposer selectClauseComposer;
-        private ClauseValidator      validator;
+        private final Map<String, String>   aliasMap = new HashMap<>();
+        private AtlasType                   activeType;
+        private SelectClauseComposer        selectClauseComposer;
+        private ClauseValidator             validator;
+        private String                      numericTypeFormatter = "";
 
         public Context(Lookup lookup) {
             this.lookup = lookup;
@@ -717,6 +718,14 @@ public class GremlinQueryComposer {
         public boolean check(boolean condition, AtlasErrorCode vm, String... 
args) {
             return validator.check(condition, vm, args);
         }
+
+        public void setNumericTypeFormatter(String formatter) {
+            this.numericTypeFormatter = formatter;
+        }
+
+        public String getNumericTypeFormatter() {
+            return this.numericTypeFormatter;
+        }
     }
 
     private static class ClauseValidator {

http://git-wip-us.apache.org/repos/asf/atlas/blob/8d1e7223/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 96e7e9c..78ab206 100644
--- a/repository/src/main/java/org/apache/atlas/query/RegistryBasedLookup.java
+++ b/repository/src/main/java/org/apache/atlas/query/RegistryBasedLookup.java
@@ -25,9 +25,7 @@ import org.apache.atlas.repository.Constants;
 import org.apache.atlas.type.*;
 import org.apache.commons.lang.StringUtils;
 
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.*;
 
 class RegistryBasedLookup implements Lookup {
     private static final Set<String> SYSTEM_ATTRIBUTES = new HashSet<>(
@@ -38,14 +36,15 @@ class RegistryBasedLookup implements Lookup {
                     Constants.TIMESTAMP_PROPERTY_KEY,
                     Constants.MODIFICATION_TIMESTAMP_PROPERTY_KEY));
 
-    private static final Set<String> NUMERIC_ATTRIBUTES = new HashSet<>(
-            Arrays.asList(AtlasBaseTypeDef.ATLAS_TYPE_SHORT,
-                    AtlasBaseTypeDef.ATLAS_TYPE_INT,
-                    AtlasBaseTypeDef.ATLAS_TYPE_LONG,
-                    AtlasBaseTypeDef.ATLAS_TYPE_FLOAT,
-                    AtlasBaseTypeDef.ATLAS_TYPE_DOUBLE,
-                    AtlasBaseTypeDef.ATLAS_TYPE_BIGINTEGER,
-                    AtlasBaseTypeDef.ATLAS_TYPE_BIGDECIMAL));
+    private static final Map<String, String> NUMERIC_ATTRIBUTES = new 
HashMap<String, String>() {{
+            put(AtlasBaseTypeDef.ATLAS_TYPE_SHORT, "");
+            put(AtlasBaseTypeDef.ATLAS_TYPE_INT, "");
+            put(AtlasBaseTypeDef.ATLAS_TYPE_LONG, "L");
+            put(AtlasBaseTypeDef.ATLAS_TYPE_FLOAT, "f");
+            put(AtlasBaseTypeDef.ATLAS_TYPE_DOUBLE, "d");
+            put(AtlasBaseTypeDef.ATLAS_TYPE_BIGINTEGER, "");
+            put(AtlasBaseTypeDef.ATLAS_TYPE_BIGDECIMAL, "");
+        }};
 
     private final AtlasTypeRegistry typeRegistry;
 
@@ -220,6 +219,11 @@ class RegistryBasedLookup implements Lookup {
         }
 
         AtlasType attr = et.getAttributeType(attrName);
-        return attr != null && NUMERIC_ATTRIBUTES.contains(attr.getTypeName());
+        boolean ret = attr != null && 
NUMERIC_ATTRIBUTES.containsKey(attr.getTypeName());
+        if(ret) {
+            
context.setNumericTypeFormatter(NUMERIC_ATTRIBUTES.get(attr.getTypeName()));
+        }
+
+        return ret;
     }
 }

http://git-wip-us.apache.org/repos/asf/atlas/blob/8d1e7223/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 5df0308..36ec3d2 100644
--- a/repository/src/test/java/org/apache/atlas/query/DSLQueriesTest.java
+++ b/repository/src/test/java/org/apache/atlas/query/DSLQueriesTest.java
@@ -178,6 +178,7 @@ public class DSLQueriesTest extends BasicTestSetup {
                 {"Person where (age <= 35)", 2},
                 {"Person where (age =  35)", 0},
                 {"Person where (age != 35)", 4},
+                {String.format("Person where (age <= %f)", Float.MAX_VALUE), 
4},
                 {"Person where (approximationOfPi > -3.4028235e+38)", 4},
         };
     }
@@ -607,8 +608,7 @@ public class DSLQueriesTest extends BasicTestSetup {
                 {"hive_table select db.name, columns"}, // Can't select more 
than one referred attribute
                 {"hive_table select owner, columns"}, // Can't select a mix of 
immediate attribute and referred entity
                 {"hive_table select owner, db.name"}, // Same as above
-                {"hive_order"}, // From src should be an Entity or 
Classification
-                {"Person where (age > -3.4028235e+38)"} // comparing float 
with BigDecimal
+                {"hive_order"} // From src should be an Entity or 
Classification
         };
     }
 

http://git-wip-us.apache.org/repos/asf/atlas/blob/8d1e7223/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 fa2332e..9e3ad27 100644
--- 
a/repository/src/test/java/org/apache/atlas/query/GremlinQueryComposerTest.java
+++ 
b/repository/src/test/java/org/apache/atlas/query/GremlinQueryComposerTest.java
@@ -309,8 +309,8 @@ public class GremlinQueryComposerTest {
 
     @Test
     public void numericAttributes() {
-        verify("Table where partitionSize = 2048", "g.V().has('__typeName', 
'Table').has('Table.partitionSize', eq(2048)).dedup().limit(25).toList()");
-        verify("Table where partitionSize = 2048 or partitionSize = 10", 
"g.V().has('__typeName', 'Table').or(__.has('Table.partitionSize', 
eq(2048)),__.has('Table.partitionSize', eq(10))).dedup().limit(25).toList()");
+        verify("Table where partitionSize = 2048", "g.V().has('__typeName', 
'Table').has('Table.partitionSize', eq(2048f)).dedup().limit(25).toList()");
+        verify("Table where partitionSize = 2048 or partitionSize = 10", 
"g.V().has('__typeName', 'Table').or(__.has('Table.partitionSize', 
eq(2048f)),__.has('Table.partitionSize', eq(10f))).dedup().limit(25).toList()");
     }
 
     @Test
@@ -527,6 +527,7 @@ public class GremlinQueryComposerTest {
 
         @Override
         public boolean isNumeric(GremlinQueryComposer.Context context, String 
attrName) {
+            context.setNumericTypeFormatter("f");
             return attrName.equals("partitionSize");
         }
     }

Reply via email to