You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by sa...@apache.org on 2018/07/05 16:35:32 UTC

atlas git commit: ATLAS-2777: Enhance advanced search (DSL) to support classification search on _CLASSIFIED or _NOT_CLASSIFIED keyword

Repository: atlas
Updated Branches:
  refs/heads/master a2c26bfc2 -> 9d4678e41


ATLAS-2777: Enhance advanced search (DSL) to support classification search on _CLASSIFIED or _NOT_CLASSIFIED keyword


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

Branch: refs/heads/master
Commit: 9d4678e41502c23abb3ad1d5e2cd0c9760679034
Parents: a2c26bf
Author: Sarath Subramanian <ss...@hortonworks.com>
Authored: Thu Jul 5 09:35:19 2018 -0700
Committer: Sarath Subramanian <ss...@hortonworks.com>
Committed: Thu Jul 5 09:35:19 2018 -0700

----------------------------------------------------------------------
 .../org/apache/atlas/query/GremlinClause.java   |  2 ++
 .../atlas/query/GremlinQueryComposer.java       | 24 ++++++++++++++++--
 .../apache/atlas/query/RegistryBasedLookup.java | 26 ++++++++++++++++++--
 3 files changed, 48 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/atlas/blob/9d4678e4/repository/src/main/java/org/apache/atlas/query/GremlinClause.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/query/GremlinClause.java b/repository/src/main/java/org/apache/atlas/query/GremlinClause.java
index 454b343..ca8419a 100644
--- a/repository/src/main/java/org/apache/atlas/query/GremlinClause.java
+++ b/repository/src/main/java/org/apache/atlas/query/GremlinClause.java
@@ -47,6 +47,8 @@ enum GremlinClause {
     TEXT_PREFIX("has('%s', org.janusgraph.core.attribute.Text.textPrefix(%s))"),
     TEXT_SUFFIX("has('%s', org.janusgraph.core.attribute.Text.textRegex(\".*\" + %s))"),
     TRAIT("outE('classifiedAs').has('__name', within('%s')).outV()"),
+    ANY_TRAIT("or(has('__traitNames'), has('__propagatedTraitNames'))"),
+    NO_TRAIT("and(hasNot('__traitNames'), hasNot('__propagatedTraitNames'))"),
     SELECT_NOOP_FN("def f(r){ r }; "),
     SELECT_FN("def f(r){ t=[[%s]]; %s r.each({t.add([%s])}); t.unique(); }; "),
     SELECT_ONLY_AGG_FN("def f(r){ t=[[%s]]; %s t.add([%s]); t;}; "),

http://git-wip-us.apache.org/repos/asf/atlas/blob/9d4678e4/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 9ad9a6e..17c837b 100644
--- a/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java
+++ b/repository/src/main/java/org/apache/atlas/query/GremlinQueryComposer.java
@@ -46,6 +46,9 @@ import java.util.TimeZone;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import static org.apache.atlas.model.discovery.SearchParameters.ALL_CLASSIFICATIONS;
+import static org.apache.atlas.model.discovery.SearchParameters.NO_CLASSIFICATIONS;
+
 public class GremlinQueryComposer {
     private static final Logger LOG                 = LoggerFactory.getLogger(GremlinQueryComposer.class);
     private static final String ISO8601_FORMAT      = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
@@ -112,7 +115,15 @@ public class GremlinQueryComposer {
             IdentifierHelper.Info ia = createInfo(typeInfo.get());
 
             if (ia.isTrait()) {
-                addTrait(GremlinClause.TRAIT, ia);
+                String traitName = ia.get();
+
+                if (traitName.equalsIgnoreCase(ALL_CLASSIFICATIONS)) {
+                    addTrait(GremlinClause.ANY_TRAIT, ia);
+                } else if (traitName.equalsIgnoreCase(NO_CLASSIFICATIONS)) {
+                    addTrait(GremlinClause.NO_TRAIT, ia);
+                } else {
+                    addTrait(GremlinClause.TRAIT, ia);
+                }
             } else {
                 if (ia.hasSubtypes()) {
                     add(GremlinClause.HAS_TYPE_WITHIN, ia.getSubTypes());
@@ -144,7 +155,14 @@ public class GremlinQueryComposer {
         }
 
         IdentifierHelper.Info traitInfo = createInfo(traitName);
-        addTrait(GremlinClause.TRAIT, traitInfo);
+
+        if (StringUtils.equals(traitName, ALL_CLASSIFICATIONS)) {
+            addTrait(GremlinClause.ANY_TRAIT, traitInfo);
+        } else if (StringUtils.equals(traitName, NO_CLASSIFICATIONS)) {
+            addTrait(GremlinClause.NO_TRAIT, traitInfo);
+        } else {
+            addTrait(GremlinClause.TRAIT, traitInfo);
+        }
     }
 
     public void addWhere(String lhs, String operator, String rhs) {
@@ -739,6 +757,8 @@ public class GremlinQueryComposer {
         public boolean isValid(Context ctx, GremlinClause clause, IdentifierHelper.Info ia) {
             switch (clause) {
                 case TRAIT:
+                case ANY_TRAIT:
+                case NO_TRAIT:
                     return check(ia.isTrait(), AtlasErrorCode.INVALID_DSL_UNKNOWN_CLASSIFICATION, ia.getRaw());
 
                 case HAS_TYPE:

http://git-wip-us.apache.org/repos/asf/atlas/blob/9d4678e4/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 808eab8..e0fb4d8 100644
--- a/repository/src/main/java/org/apache/atlas/query/RegistryBasedLookup.java
+++ b/repository/src/main/java/org/apache/atlas/query/RegistryBasedLookup.java
@@ -27,6 +27,11 @@ import org.apache.commons.lang.StringUtils;
 
 import java.util.*;
 
+import static org.apache.atlas.discovery.SearchContext.MATCH_ALL_CLASSIFIED;
+import static org.apache.atlas.discovery.SearchContext.MATCH_ALL_NOT_CLASSIFIED;
+import static org.apache.atlas.model.discovery.SearchParameters.ALL_CLASSIFICATIONS;
+import static org.apache.atlas.model.discovery.SearchParameters.NO_CLASSIFICATIONS;
+
 class RegistryBasedLookup implements Lookup {
     private static final Set<String> SYSTEM_ATTRIBUTES = new HashSet<>(
             Arrays.asList(Constants.GUID_PROPERTY_KEY,
@@ -56,7 +61,17 @@ class RegistryBasedLookup implements Lookup {
 
     @Override
     public AtlasType getType(String typeName) throws AtlasBaseException {
-        return typeRegistry.getType(typeName);
+        AtlasType ret;
+
+        if (typeName.equalsIgnoreCase(ALL_CLASSIFICATIONS)) {
+            ret = MATCH_ALL_CLASSIFIED;
+        } else if (typeName.equalsIgnoreCase(NO_CLASSIFICATIONS)) {
+            ret = MATCH_ALL_NOT_CLASSIFIED;
+        } else {
+            ret = typeRegistry.getType(typeName);
+        }
+
+        return ret;
     }
 
     @Override
@@ -156,7 +171,14 @@ class RegistryBasedLookup implements Lookup {
     public boolean isTraitType(String typeName) {
         AtlasType t = null;
         try {
-            t = typeRegistry.getType(typeName);
+            if (typeName.equalsIgnoreCase(ALL_CLASSIFICATIONS)) {
+                t = MATCH_ALL_CLASSIFIED;
+            } else if (typeName.equalsIgnoreCase(NO_CLASSIFICATIONS)) {
+                t = MATCH_ALL_NOT_CLASSIFIED;
+            } else {
+                t = typeRegistry.getType(typeName);
+            }
+
         } catch (AtlasBaseException e) {
             return false;
         }