Repository: atlas
Updated Branches:
  refs/heads/branch-1.0 3d69ad2f4 -> fb32d155a


ATLAS-2775: Enhance basic search to search on entities with any classifications 
or no classifications

(cherry picked from commit 15388229741b19c4567527da11bbb1daf2f9399f)


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

Branch: refs/heads/branch-1.0
Commit: fb32d155a2a6c196a0bb8ca65b20aa4754f70bfb
Parents: 3d69ad2
Author: Sarath Subramanian <ssubraman...@hortonworks.com>
Authored: Tue Jul 3 14:44:37 2018 -0700
Committer: Madhan Neethiraj <mad...@apache.org>
Committed: Tue Jul 3 15:03:08 2018 -0700

----------------------------------------------------------------------
 .../atlas/model/discovery/SearchParameters.java |  4 ++
 .../ClassificationSearchProcessor.java          | 39 ++++++++++++++------
 .../atlas/discovery/EntitySearchProcessor.java  | 32 +++++++++++-----
 .../discovery/FullTextSearchProcessor.java      |  8 +++-
 .../apache/atlas/discovery/SearchContext.java   | 16 ++++++--
 5 files changed, 73 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/atlas/blob/fb32d155/intg/src/main/java/org/apache/atlas/model/discovery/SearchParameters.java
----------------------------------------------------------------------
diff --git 
a/intg/src/main/java/org/apache/atlas/model/discovery/SearchParameters.java 
b/intg/src/main/java/org/apache/atlas/model/discovery/SearchParameters.java
index 39ebf23..aac6b5a 100644
--- a/intg/src/main/java/org/apache/atlas/model/discovery/SearchParameters.java
+++ b/intg/src/main/java/org/apache/atlas/model/discovery/SearchParameters.java
@@ -55,6 +55,10 @@ public class SearchParameters implements Serializable {
     private FilterCriteria tagFilters;
     private Set<String>    attributes;
 
+    public static final String WILDCARD_CLASSIFICATIONS = "*";
+    public static final String ALL_CLASSIFICATIONS      = "_CLASSIFIED";
+    public static final String NO_CLASSIFICATIONS       = "_NOT_CLASSIFIED";
+
     /**
      * @return The type of query
      */

http://git-wip-us.apache.org/repos/asf/atlas/blob/fb32d155/repository/src/main/java/org/apache/atlas/discovery/ClassificationSearchProcessor.java
----------------------------------------------------------------------
diff --git 
a/repository/src/main/java/org/apache/atlas/discovery/ClassificationSearchProcessor.java
 
b/repository/src/main/java/org/apache/atlas/discovery/ClassificationSearchProcessor.java
index 588ad3e..c00bfb6 100644
--- 
a/repository/src/main/java/org/apache/atlas/discovery/ClassificationSearchProcessor.java
+++ 
b/repository/src/main/java/org/apache/atlas/discovery/ClassificationSearchProcessor.java
@@ -50,6 +50,12 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+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.discovery.SearchContext.MATCH_ALL_WILDCARD_CLASSIFICATION;
+import static 
org.apache.atlas.repository.Constants.PROPAGATED_TRAIT_NAMES_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.TRAIT_NAMES_PROPERTY_KEY;
+import static 
org.apache.atlas.repository.graphdb.AtlasGraphQuery.ComparisionOperator.EQUAL;
 import static 
org.apache.atlas.repository.graphdb.AtlasGraphQuery.ComparisionOperator.NOT_EQUAL;
 
 
@@ -88,7 +94,9 @@ public class ClassificationSearchProcessor extends 
SearchProcessor {
         processSearchAttributes(classificationType, filterCriteria, 
indexAttributes, graphAttributes, allAttributes);
 
         // for classification search, if any attribute can't be handled by 
index query - switch to all filter by Graph query
-        boolean useIndexSearch = classificationType != 
SearchContext.MATCH_ALL_CLASSIFICATION &&
+        boolean useIndexSearch = classificationType != 
MATCH_ALL_WILDCARD_CLASSIFICATION &&
+                                 classificationType != MATCH_ALL_CLASSIFIED &&
+                                 classificationType != 
MATCH_ALL_NOT_CLASSIFIED &&
                                  typeAndSubTypesQryStr.length() <= 
MAX_QUERY_STR_LENGTH_TAGS &&
                                  CollectionUtils.isEmpty(graphAttributes) &&
                                  canApplyIndexFilter(classificationType, 
filterCriteria, false);
@@ -149,25 +157,32 @@ public class ClassificationSearchProcessor extends 
SearchProcessor {
                 LOG.debug("gremlinTagFilterQuery={}", gremlinTagFilterQuery);
             }
         } else {
-            tagGraphQueryWithAttributes = null;
-            List<AtlasGraphQuery> orConditions = new LinkedList<>();
+            tagGraphQueryWithAttributes         = null;
+            List<AtlasGraphQuery> orConditions  = new LinkedList<>();
 
-            if (classificationType != SearchContext.MATCH_ALL_CLASSIFICATION) {
-                
orConditions.add(graph.query().createChildQuery().in(Constants.TRAIT_NAMES_PROPERTY_KEY,
 typeAndSubTypes));
-                
orConditions.add(graph.query().createChildQuery().in(Constants.PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 typeAndSubTypes));
+            if (classificationType == MATCH_ALL_WILDCARD_CLASSIFICATION || 
classificationType == MATCH_ALL_CLASSIFIED) {
+                
orConditions.add(graph.query().createChildQuery().has(TRAIT_NAMES_PROPERTY_KEY, 
NOT_EQUAL, null));
+                
orConditions.add(graph.query().createChildQuery().has(PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 NOT_EQUAL, null));
 
                 entityGraphQueryTraitNames = graph.query().or(orConditions);
                 entityPredicateTraitNames  = PredicateUtils.orPredicate(
-                        
SearchPredicateUtil.getContainsAnyPredicateGenerator().generatePredicate(Constants.TRAIT_NAMES_PROPERTY_KEY,
 classificationType.getTypeAndAllSubTypes(), List.class),
-                        
SearchPredicateUtil.getContainsAnyPredicateGenerator().generatePredicate(Constants.PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 classificationType.getTypeAndAllSubTypes(), List.class));
+                        
SearchPredicateUtil.getNotEmptyPredicateGenerator().generatePredicate(TRAIT_NAMES_PROPERTY_KEY,
 null, List.class),
+                        
SearchPredicateUtil.getNotEmptyPredicateGenerator().generatePredicate(PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 null, List.class));
+            } else if (classificationType == MATCH_ALL_NOT_CLASSIFIED) {
+                
orConditions.add(graph.query().createChildQuery().has(TRAIT_NAMES_PROPERTY_KEY, 
EQUAL, null).has(PROPAGATED_TRAIT_NAMES_PROPERTY_KEY, EQUAL, null));
+
+                entityGraphQueryTraitNames = graph.query().or(orConditions);
+                entityPredicateTraitNames  = PredicateUtils.andPredicate(
+                        
SearchPredicateUtil.getIsNullPredicateGenerator().generatePredicate(TRAIT_NAMES_PROPERTY_KEY,
 null, List.class),
+                        
SearchPredicateUtil.getIsNullPredicateGenerator().generatePredicate(PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 null, List.class));
             } else {
-                
orConditions.add(graph.query().createChildQuery().has(Constants.TRAIT_NAMES_PROPERTY_KEY,
 NOT_EQUAL, null));
-                
orConditions.add(graph.query().createChildQuery().has(Constants.PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 NOT_EQUAL, null));
+                
orConditions.add(graph.query().createChildQuery().in(TRAIT_NAMES_PROPERTY_KEY, 
typeAndSubTypes));
+                
orConditions.add(graph.query().createChildQuery().in(PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 typeAndSubTypes));
 
                 entityGraphQueryTraitNames = graph.query().or(orConditions);
                 entityPredicateTraitNames  = PredicateUtils.orPredicate(
-                        
SearchPredicateUtil.getNotEmptyPredicateGenerator().generatePredicate(Constants.TRAIT_NAMES_PROPERTY_KEY,
 null, List.class),
-                        
SearchPredicateUtil.getNotEmptyPredicateGenerator().generatePredicate(Constants.PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 null, List.class));
+                        
SearchPredicateUtil.getContainsAnyPredicateGenerator().generatePredicate(TRAIT_NAMES_PROPERTY_KEY,
 classificationType.getTypeAndAllSubTypes(), List.class),
+                        
SearchPredicateUtil.getContainsAnyPredicateGenerator().generatePredicate(PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 classificationType.getTypeAndAllSubTypes(), List.class));
             }
 
             if (context.getSearchParameters().getExcludeDeletedEntities()) {

http://git-wip-us.apache.org/repos/asf/atlas/blob/fb32d155/repository/src/main/java/org/apache/atlas/discovery/EntitySearchProcessor.java
----------------------------------------------------------------------
diff --git 
a/repository/src/main/java/org/apache/atlas/discovery/EntitySearchProcessor.java
 
b/repository/src/main/java/org/apache/atlas/discovery/EntitySearchProcessor.java
index abe859f..c4b5ffb 100644
--- 
a/repository/src/main/java/org/apache/atlas/discovery/EntitySearchProcessor.java
+++ 
b/repository/src/main/java/org/apache/atlas/discovery/EntitySearchProcessor.java
@@ -40,6 +40,12 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 
+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.discovery.SearchContext.MATCH_ALL_WILDCARD_CLASSIFICATION;
+import static 
org.apache.atlas.repository.Constants.PROPAGATED_TRAIT_NAMES_PROPERTY_KEY;
+import static org.apache.atlas.repository.Constants.TRAIT_NAMES_PROPERTY_KEY;
+import static 
org.apache.atlas.repository.graphdb.AtlasGraphQuery.ComparisionOperator.EQUAL;
 import static 
org.apache.atlas.repository.graphdb.AtlasGraphQuery.ComparisionOperator.NOT_EQUAL;
 
 public class EntitySearchProcessor extends SearchProcessor {
@@ -93,12 +99,15 @@ public class EntitySearchProcessor extends SearchProcessor {
                                                                
.generatePredicate(Constants.STATE_PROPERTY_KEY, "ACTIVE", String.class);
         final Predicate traitPredicate;
 
-        if (classificationType == SearchContext.MATCH_ALL_CLASSIFICATION) {
-            traitPredicate = 
PredicateUtils.orPredicate(SearchPredicateUtil.getNotEmptyPredicateGenerator().generatePredicate(Constants.TRAIT_NAMES_PROPERTY_KEY,
 null, List.class),
-                                                        
SearchPredicateUtil.getNotEmptyPredicateGenerator().generatePredicate(Constants.PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 null, List.class));
+        if (classificationType == MATCH_ALL_WILDCARD_CLASSIFICATION || 
classificationType == MATCH_ALL_CLASSIFIED) {
+            traitPredicate = 
PredicateUtils.orPredicate(SearchPredicateUtil.getNotEmptyPredicateGenerator().generatePredicate(TRAIT_NAMES_PROPERTY_KEY,
 null, List.class),
+                                                        
SearchPredicateUtil.getNotEmptyPredicateGenerator().generatePredicate(PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 null, List.class));
+        } else if (classificationType == MATCH_ALL_NOT_CLASSIFIED) {
+            traitPredicate = 
PredicateUtils.andPredicate(SearchPredicateUtil.getIsNullPredicateGenerator().generatePredicate(TRAIT_NAMES_PROPERTY_KEY,
 null, List.class),
+                                                         
SearchPredicateUtil.getIsNullPredicateGenerator().generatePredicate(PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 null, List.class));
         } else {
-            traitPredicate = 
PredicateUtils.orPredicate(SearchPredicateUtil.getContainsAnyPredicateGenerator().generatePredicate(Constants.TRAIT_NAMES_PROPERTY_KEY,
 classificationTypeAndSubTypes, List.class),
-                                                        
SearchPredicateUtil.getContainsAnyPredicateGenerator().generatePredicate(Constants.PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 classificationTypeAndSubTypes, List.class));
+            traitPredicate = 
PredicateUtils.orPredicate(SearchPredicateUtil.getContainsAnyPredicateGenerator().generatePredicate(TRAIT_NAMES_PROPERTY_KEY,
 classificationTypeAndSubTypes, List.class),
+                                                        
SearchPredicateUtil.getContainsAnyPredicateGenerator().generatePredicate(PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 classificationTypeAndSubTypes, List.class));
         }
 
         processSearchAttributes(entityType, filterCriteria, indexAttributes, 
graphAttributes, allAttributes);
@@ -154,12 +163,15 @@ public class EntitySearchProcessor extends 
SearchProcessor {
             if (filterClassification) {
                 List<AtlasGraphQuery> orConditions = new LinkedList<>();
 
-                if (classificationType == 
SearchContext.MATCH_ALL_CLASSIFICATION) {
-                    
orConditions.add(query.createChildQuery().has(Constants.TRAIT_NAMES_PROPERTY_KEY,
 NOT_EQUAL, null));
-                    
orConditions.add(query.createChildQuery().has(Constants.PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 NOT_EQUAL, null));
+                if (classificationType == MATCH_ALL_WILDCARD_CLASSIFICATION || 
classificationType == MATCH_ALL_CLASSIFIED) {
+                    
orConditions.add(query.createChildQuery().has(TRAIT_NAMES_PROPERTY_KEY, 
NOT_EQUAL, null));
+                    
orConditions.add(query.createChildQuery().has(PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 NOT_EQUAL, null));
+                } else if (classificationType == MATCH_ALL_NOT_CLASSIFIED) {
+                    
orConditions.add(query.createChildQuery().has(TRAIT_NAMES_PROPERTY_KEY, EQUAL, 
null)
+                                                             
.has(PROPAGATED_TRAIT_NAMES_PROPERTY_KEY, EQUAL, null));
                 } else {
-                    
orConditions.add(query.createChildQuery().in(Constants.TRAIT_NAMES_PROPERTY_KEY,
 classificationTypeAndSubTypes));
-                    
orConditions.add(query.createChildQuery().in(Constants.PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 classificationTypeAndSubTypes));
+                    
orConditions.add(query.createChildQuery().in(TRAIT_NAMES_PROPERTY_KEY, 
classificationTypeAndSubTypes));
+                    
orConditions.add(query.createChildQuery().in(PROPAGATED_TRAIT_NAMES_PROPERTY_KEY,
 classificationTypeAndSubTypes));
                 }
 
                 query.or(orConditions);

http://git-wip-us.apache.org/repos/asf/atlas/blob/fb32d155/repository/src/main/java/org/apache/atlas/discovery/FullTextSearchProcessor.java
----------------------------------------------------------------------
diff --git 
a/repository/src/main/java/org/apache/atlas/discovery/FullTextSearchProcessor.java
 
b/repository/src/main/java/org/apache/atlas/discovery/FullTextSearchProcessor.java
index 2c84369..0ffd61c 100644
--- 
a/repository/src/main/java/org/apache/atlas/discovery/FullTextSearchProcessor.java
+++ 
b/repository/src/main/java/org/apache/atlas/discovery/FullTextSearchProcessor.java
@@ -31,6 +31,10 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+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.discovery.SearchContext.MATCH_ALL_WILDCARD_CLASSIFICATION;
+
 
 public class FullTextSearchProcessor extends SearchProcessor {
     private static final Logger LOG      = 
LoggerFactory.getLogger(FullTextSearchProcessor.class);
@@ -61,7 +65,9 @@ public class FullTextSearchProcessor extends SearchProcessor {
 
         // if search includes classification criteria, adding a filter here 
can help avoid unnecessary
         // processing (and rejection) by subsequent 
ClassificationSearchProcessor or EntitySearchProcessor
-        if (context.getClassificationType() != null && 
context.getClassificationType() != SearchContext.MATCH_ALL_CLASSIFICATION) {
+        if (context.getClassificationType() != null && 
context.getClassificationType() != MATCH_ALL_WILDCARD_CLASSIFICATION &&
+                                                       
context.getClassificationType() != MATCH_ALL_CLASSIFIED &&
+                                                       
context.getClassificationType() != MATCH_ALL_NOT_CLASSIFIED) {
             String typeAndSubTypeNamesStr = 
context.getClassificationType().getTypeAndAllSubTypesQryStr();
 
             if (typeAndSubTypeNamesStr.length() <= MAX_QUERY_STR_LENGTH_TAGS) {

http://git-wip-us.apache.org/repos/asf/atlas/blob/fb32d155/repository/src/main/java/org/apache/atlas/discovery/SearchContext.java
----------------------------------------------------------------------
diff --git 
a/repository/src/main/java/org/apache/atlas/discovery/SearchContext.java 
b/repository/src/main/java/org/apache/atlas/discovery/SearchContext.java
index 1f40076..b4542b7 100644
--- a/repository/src/main/java/org/apache/atlas/discovery/SearchContext.java
+++ b/repository/src/main/java/org/apache/atlas/discovery/SearchContext.java
@@ -45,6 +45,10 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
+import static 
org.apache.atlas.model.discovery.SearchParameters.ALL_CLASSIFICATIONS;
+import static 
org.apache.atlas.model.discovery.SearchParameters.NO_CLASSIFICATIONS;
+import static 
org.apache.atlas.model.discovery.SearchParameters.WILDCARD_CLASSIFICATIONS;
+
 /*
  * Search context captures elements required for performing a basic search
  * For every search request the search context will determine the execution 
sequence of the search processor(s) and the
@@ -61,7 +65,9 @@ public class SearchContext {
     private       SearchProcessor         searchProcessor;
     private       boolean                 terminateSearch = false;
 
-    public final static AtlasClassificationType MATCH_ALL_CLASSIFICATION = new 
AtlasClassificationType(new AtlasClassificationDef("*"));
+    public final static AtlasClassificationType 
MATCH_ALL_WILDCARD_CLASSIFICATION = new AtlasClassificationType(new 
AtlasClassificationDef(WILDCARD_CLASSIFICATIONS));
+    public final static AtlasClassificationType MATCH_ALL_CLASSIFIED           
   = new AtlasClassificationType(new 
AtlasClassificationDef(ALL_CLASSIFICATIONS));
+    public final static AtlasClassificationType MATCH_ALL_NOT_CLASSIFIED       
   = new AtlasClassificationType(new 
AtlasClassificationDef(NO_CLASSIFICATIONS));
 
     public SearchContext(SearchParameters searchParameters, AtlasTypeRegistry 
typeRegistry, AtlasGraph graph, Set<String> indexedKeys) throws 
AtlasBaseException {
         String classificationName = searchParameters.getClassification();
@@ -199,8 +205,12 @@ public class SearchContext {
     private AtlasClassificationType getClassificationType(String 
classificationName) {
         AtlasClassificationType ret;
 
-        if (StringUtils.equals(classificationName, 
MATCH_ALL_CLASSIFICATION.getTypeName())) {
-            ret = MATCH_ALL_CLASSIFICATION;
+        if (StringUtils.equals(classificationName, 
MATCH_ALL_WILDCARD_CLASSIFICATION.getTypeName())) {
+            ret = MATCH_ALL_WILDCARD_CLASSIFICATION;
+        } else if (StringUtils.equals(classificationName, 
MATCH_ALL_CLASSIFIED.getTypeName())) {
+            ret = MATCH_ALL_CLASSIFIED;
+        } else if (StringUtils.equals(classificationName, 
MATCH_ALL_NOT_CLASSIFIED.getTypeName())) {
+            ret = MATCH_ALL_NOT_CLASSIFIED;
         } else {
             ret = typeRegistry.getClassificationTypeByName(classificationName);
         }

Reply via email to