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"); } }