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