This is an automated email from the ASF dual-hosted git repository. sarath pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/atlas.git
commit 0dc87b8727f58b84c6f3dd2f147369a5395ed2c6 Author: Deep Singh <[email protected]> AuthorDate: Mon Jan 25 16:07:34 2021 -0600 ATLAS-4110: Inconsistency in the result of DSL query and basic query Signed-off-by: Sarath Subramanian <[email protected]> (cherry picked from commit c2ab99037637b7a918678c2fc46697fda95bfac2) --- .../java/org/apache/atlas/query/GremlinQueryComposer.java | 11 ++++++++--- .../main/java/org/apache/atlas/query/RegistryBasedLookup.java | 1 + .../query/executors/GremlinClauseToTraversalTranslator.java | 6 ++++++ repository/src/test/java/org/apache/atlas/BasicTestSetup.java | 2 +- .../src/test/java/org/apache/atlas/query/DSLQueriesTest.java | 5 ++++- 5 files changed, 20 insertions(+), 5 deletions(-) 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 c7d01cf..320acbe 100644 --- a/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java +++ b/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java @@ -181,6 +181,7 @@ public class GremlinQueryComposer { String currentType = context.getActiveTypeName(); IdentifierHelper.Info org = null; IdentifierHelper.Info lhsI = createInfo(lhs); + boolean rhsIsNotDateOrNumOrBool = false; if (!lhsI.isPrimitive()) { introduceType(lhsI); @@ -197,8 +198,12 @@ public class GremlinQueryComposer { if (lhsI.isDate()) { rhs = parseDate(rhs); - } else if (lhsI.isNumeric() && !StringUtils.equals(lhsI.getAttributeName(), Constants.IS_INCOMPLETE_PROPERTY_KEY)) { - rhs = parseNumber(rhs, this.context); + } else if (lhsI.isNumeric()) { + if(!StringUtils.equals(lhsI.getAttributeName(), Constants.IS_INCOMPLETE_PROPERTY_KEY)) { + rhs = parseNumber(rhs, this.context); + } + } else if (!IdentifierHelper.isTrueOrFalse(rhs)) { + rhsIsNotDateOrNumOrBool = true; } rhs = addQuotesIfNecessary(lhsI, rhs); @@ -219,7 +224,7 @@ public class GremlinQueryComposer { } } else if (op == SearchParameters.Operator.IN) { add(GremlinClause.HAS_OPERATOR, getPropertyForClause(lhsI), "within", rhs); - } else if (op == SearchParameters.Operator.NEQ) { + } else if (op == SearchParameters.Operator.NEQ && rhsIsNotDateOrNumOrBool) { String propertyName = getPropertyForClause(lhsI); add(GremlinClause.HAS_NOT_OPERATOR, propertyName, rhs, propertyName); 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 587a099..eb3c349 100644 --- a/repository/src/main/java/org/apache/atlas/query/RegistryBasedLookup.java +++ b/repository/src/main/java/org/apache/atlas/query/RegistryBasedLookup.java @@ -36,6 +36,7 @@ import static org.apache.atlas.model.discovery.SearchParameters.ALL_ENTITY_TYPES class RegistryBasedLookup implements Lookup { private static final Map<String, String> NUMERIC_ATTRIBUTES = new HashMap<String, String>() {{ + put(AtlasBaseTypeDef.ATLAS_TYPE_BYTE, ""); put(AtlasBaseTypeDef.ATLAS_TYPE_SHORT, ""); put(AtlasBaseTypeDef.ATLAS_TYPE_INT, ""); put(AtlasBaseTypeDef.ATLAS_TYPE_LONG, "L"); diff --git a/repository/src/main/java/org/apache/atlas/query/executors/GremlinClauseToTraversalTranslator.java b/repository/src/main/java/org/apache/atlas/query/executors/GremlinClauseToTraversalTranslator.java index be55c8e..a7b05fd 100644 --- a/repository/src/main/java/org/apache/atlas/query/executors/GremlinClauseToTraversalTranslator.java +++ b/repository/src/main/java/org/apache/atlas/query/executors/GremlinClauseToTraversalTranslator.java @@ -146,6 +146,12 @@ public class GremlinClauseToTraversalTranslator { traversal.has(values[0], predicate); break; + case HAS_NOT_OPERATOR: + traversal.or( + traversal.startAnonymousTraversal().has(values[0], P.neq(values[1])), + traversal.startAnonymousTraversal().hasNot(values[0])); + break; + case HAS_TYPE: traversal.has(Constants.TYPE_NAME_PROPERTY_KEY, values[0]); break; diff --git a/repository/src/test/java/org/apache/atlas/BasicTestSetup.java b/repository/src/test/java/org/apache/atlas/BasicTestSetup.java index 4be0940..99e075a 100644 --- a/repository/src/test/java/org/apache/atlas/BasicTestSetup.java +++ b/repository/src/test/java/org/apache/atlas/BasicTestSetup.java @@ -229,7 +229,7 @@ public abstract class BasicTestSetup extends AtlasTestBase { ImmutableList.of(salesFactDaily), "create table as select ", "plan", "id", "graph", ETL_CLASSIFICATION); entities.add(loadSalesDaily); - AtlasEntity logDB = database("Logging", "logging database", "Tim ETL", "hdfs://host:8000/apps/warehouse/logging"); + AtlasEntity logDB = database("Logging", null, "Tim ETL", "hdfs://host:8000/apps/warehouse/logging"); entities.add(logDB); sd = storageDescriptor("hdfs://host:8000/apps/warehouse/sales", "TextInputFormat", "TextOutputFormat", true, ImmutableList.of(column("time_id", "int", "time id"))); 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 3f4559a..359cb31 100644 --- a/repository/src/test/java/org/apache/atlas/query/DSLQueriesTest.java +++ b/repository/src/test/java/org/apache/atlas/query/DSLQueriesTest.java @@ -423,6 +423,9 @@ public class DSLQueriesTest extends BasicTestSetup { {"hive_db as d where owner = ['John ETL', 'Jane BI']", 2}, {"hive_db as d where owner = ['John ETL', 'Jane BI'] limit 10", 2}, {"hive_db as d where owner = ['John ETL', 'Jane BI'] limit 10 offset 1", 1}, + {"hive_db where description != 'Random'", 3}, + {"hive_db where (owner = \"John ETL\" and description != Random)", 1}, + {"hive_db where (owner = \"Tim ETL\" and description != Random)", 1}, {"hive_db where (name='Reporting' or ((name='Logging' and owner = 'Jane BI') and (name='Logging' and owner = 'John ETL')))", 1} }; } @@ -430,7 +433,7 @@ public class DSLQueriesTest extends BasicTestSetup { @Test(dataProvider = "syntaxProvider") public void syntax(String query, int expected) throws AtlasBaseException { queryAssert(query, expected, DEFAULT_LIMIT, 0); -// queryAssert(query.replace("where", " "), expected, DEFAULT_LIMIT, 0); + queryAssert(query.replace("where", " "), expected, DEFAULT_LIMIT, 0); } @DataProvider(name = "orderByProvider")
