Repository: atlas
Updated Branches:
  refs/heads/master db77c65be -> 14df38de4


ATLAS-2320: basic-search with wildcard classification fails when full-text 
query is specified


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

Branch: refs/heads/master
Commit: 14df38de4a53baa063cdcaf0e299d5fb46dfb7f5
Parents: db77c65
Author: Madhan Neethiraj <mad...@apache.org>
Authored: Thu Dec 21 10:39:16 2017 -0800
Committer: Madhan Neethiraj <mad...@apache.org>
Committed: Thu Dec 21 10:39:16 2017 -0800

----------------------------------------------------------------------
 .../ClassificationSearchProcessor.java          |  2 +-
 .../atlas/discovery/EntitySearchProcessor.java  |  2 +-
 .../discovery/FullTextSearchProcessor.java      |  2 +-
 .../apache/atlas/util/SearchPredicateUtil.java  | 45 ++++++++++++++++++++
 4 files changed, 48 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/atlas/blob/14df38de/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 7b75321..4265e09 100644
--- 
a/repository/src/main/java/org/apache/atlas/discovery/ClassificationSearchProcessor.java
+++ 
b/repository/src/main/java/org/apache/atlas/discovery/ClassificationSearchProcessor.java
@@ -155,7 +155,7 @@ public class ClassificationSearchProcessor extends 
SearchProcessor {
                 entityPredicateTraitNames  = 
SearchPredicateUtil.getContainsAnyPredicateGenerator().generatePredicate(Constants.TRAIT_NAMES_PROPERTY_KEY,
 classificationType.getTypeAndAllSubTypes(), List.class);
             } else {
                 entityGraphQueryTraitNames = 
graph.query().has(Constants.TRAIT_NAMES_PROPERTY_KEY, NOT_EQUAL, null);
-                entityPredicateTraitNames = 
SearchPredicateUtil.getNotNullPredicateGenerator().generatePredicate(Constants.TRAIT_NAMES_PROPERTY_KEY,
 null, List.class);
+                entityPredicateTraitNames = 
SearchPredicateUtil.getNotEmptyPredicateGenerator().generatePredicate(Constants.TRAIT_NAMES_PROPERTY_KEY,
 null, List.class);
             }
 
             if (context.getSearchParameters().getExcludeDeletedEntities()) {

http://git-wip-us.apache.org/repos/asf/atlas/blob/14df38de/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 0a811f4..016ad1b 100644
--- 
a/repository/src/main/java/org/apache/atlas/discovery/EntitySearchProcessor.java
+++ 
b/repository/src/main/java/org/apache/atlas/discovery/EntitySearchProcessor.java
@@ -93,7 +93,7 @@ public class EntitySearchProcessor extends SearchProcessor {
         final Predicate traitPredicate;
 
         if (classificationType == SearchContext.MATCH_ALL_CLASSIFICATION) {
-            traitPredicate = 
SearchPredicateUtil.getNotNullPredicateGenerator().generatePredicate(Constants.TRAIT_NAMES_PROPERTY_KEY,
 null, List.class);
+            traitPredicate = 
SearchPredicateUtil.getNotEmptyPredicateGenerator().generatePredicate(Constants.TRAIT_NAMES_PROPERTY_KEY,
 null, List.class);
         } else {
             traitPredicate = 
SearchPredicateUtil.getContainsAnyPredicateGenerator().generatePredicate(Constants.TRAIT_NAMES_PROPERTY_KEY,
 classificationTypeAndSubTypes, List.class);
         }

http://git-wip-us.apache.org/repos/asf/atlas/blob/14df38de/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 95372d3..5ffd88b 100644
--- 
a/repository/src/main/java/org/apache/atlas/discovery/FullTextSearchProcessor.java
+++ 
b/repository/src/main/java/org/apache/atlas/discovery/FullTextSearchProcessor.java
@@ -61,7 +61,7 @@ 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) {
+        if (context.getClassificationType() != null && 
context.getClassificationType() != SearchContext.MATCH_ALL_CLASSIFICATION) {
             String typeAndSubTypeNamesStr = 
context.getClassificationType().getTypeAndAllSubTypesQryStr();
 
             if (typeAndSubTypeNamesStr.length() <= MAX_QUERY_STR_LENGTH_TAGS) {

http://git-wip-us.apache.org/repos/asf/atlas/blob/14df38de/repository/src/main/java/org/apache/atlas/util/SearchPredicateUtil.java
----------------------------------------------------------------------
diff --git 
a/repository/src/main/java/org/apache/atlas/util/SearchPredicateUtil.java 
b/repository/src/main/java/org/apache/atlas/util/SearchPredicateUtil.java
index 540cdba..6f55485 100644
--- a/repository/src/main/java/org/apache/atlas/util/SearchPredicateUtil.java
+++ b/repository/src/main/java/org/apache/atlas/util/SearchPredicateUtil.java
@@ -21,6 +21,7 @@ import org.apache.atlas.repository.graphdb.AtlasVertex;
 import org.apache.atlas.repository.store.graph.v1.AtlasGraphUtilsV1;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.Predicate;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -605,6 +606,50 @@ public class SearchPredicateUtil {
         return ret;
     }
 
+    public static VertexAttributePredicateGenerator 
getNotEmptyPredicateGenerator() {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> getNotEmptyPredicateGenerator");
+        }
+
+        VertexAttributePredicateGenerator ret = new 
VertexAttributePredicateGenerator() {
+            @Override
+            public Predicate generatePredicate(final String attrName, final 
Object attrVal, final Class attrClass) {
+                final Predicate ret;
+
+                if (attrName == null || attrClass == null) {
+                    ret = ALWAYS_FALSE;
+                } else {
+                    ret = new VertexAttributePredicate(attrName, attrClass, 
true) {
+                        @Override
+                        protected boolean compareValue(final Object 
vertexAttrVal) {
+                            boolean ret = false;
+
+                            if (vertexAttrVal != null) {
+                                if (vertexAttrVal instanceof Collection) {
+                                    ret = 
CollectionUtils.isNotEmpty((Collection) vertexAttrVal);
+                                } else if (vertexAttrVal instanceof String) {
+                                    ret = StringUtils.isNotEmpty((String) 
vertexAttrVal);
+                                } else {
+                                    ret = true; // for other datatypes, a 
non-null is treated as non-empty
+                                }
+                            }
+
+                            return ret;
+                        }
+                    };
+                }
+
+                return ret;
+            }
+        };
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== getNotEmptyPredicateGenerator");
+        }
+
+        return ret;
+    }
+
     public interface VertexAttributePredicateGenerator {
         Predicate generatePredicate(String attrName, Object attrVal, Class 
attrClass);
     }

Reply via email to