Repository: atlas Updated Branches: refs/heads/branch-0.8 0e80d9b37 -> 74f5ebe15
ATLAS-2274: search for classification '*' with a typeName filter results in error ATLAS-2277: search for classification '*' doesn't honor excludeDeletedEntities=true (cherry picked from commit a7e89196fe7f084cdc5a6e57916bb64ef1d6b466) Project: http://git-wip-us.apache.org/repos/asf/atlas/repo Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/74f5ebe1 Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/74f5ebe1 Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/74f5ebe1 Branch: refs/heads/branch-0.8 Commit: 74f5ebe1504471376df7795efd8c839fe2a6d785 Parents: 0e80d9b Author: Madhan Neethiraj <[email protected]> Authored: Sat Nov 25 22:03:48 2017 -0800 Committer: Madhan Neethiraj <[email protected]> Committed: Mon Nov 27 11:39:58 2017 -0800 ---------------------------------------------------------------------- .../discovery/ClassificationSearchProcessor.java | 13 ++++++++++--- .../atlas/discovery/EntitySearchProcessor.java | 17 ++++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/atlas/blob/74f5ebe1/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 0a9e846..1565977 100644 --- a/repository/src/main/java/org/apache/atlas/discovery/ClassificationSearchProcessor.java +++ b/repository/src/main/java/org/apache/atlas/discovery/ClassificationSearchProcessor.java @@ -58,7 +58,7 @@ public class ClassificationSearchProcessor extends SearchProcessor { private final AtlasIndexQuery indexQuery; private final AtlasGraphQuery tagGraphQueryWithAttributes; private final AtlasGraphQuery entityGraphQueryTraitNames; - private final Predicate entityPredicateTraitNames; + private Predicate entityPredicateTraitNames; private final String gremlinTagFilterQuery; private final Map<String, Object> gremlinQueryBindings; @@ -144,12 +144,19 @@ public class ClassificationSearchProcessor extends SearchProcessor { if (classificationType != SearchContext.MATCH_ALL_CLASSIFICATION) { entityGraphQueryTraitNames = graph.query().in(Constants.TRAIT_NAMES_PROPERTY_KEY, typeAndSubTypes); + 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.getContainsAnyPredicateGenerator() - .generatePredicate(Constants.TRAIT_NAMES_PROPERTY_KEY, classificationType.getTypeAndAllSubTypes(), List.class); + if (context.getSearchParameters().getExcludeDeletedEntities()) { + entityGraphQueryTraitNames.has(Constants.STATE_PROPERTY_KEY, "ACTIVE"); + + final Predicate activePredicate = SearchPredicateUtil.getEQPredicateGenerator().generatePredicate(Constants.STATE_PROPERTY_KEY, "ACTIVE", String.class); + + entityPredicateTraitNames = PredicateUtils.andPredicate(entityPredicateTraitNames, activePredicate); + } gremlinTagFilterQuery = null; gremlinQueryBindings = null; http://git-wip-us.apache.org/repos/asf/atlas/blob/74f5ebe1/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 87efed7..1119463 100644 --- a/repository/src/main/java/org/apache/atlas/discovery/EntitySearchProcessor.java +++ b/repository/src/main/java/org/apache/atlas/discovery/EntitySearchProcessor.java @@ -39,6 +39,8 @@ import java.util.Iterator; import java.util.List; import java.util.Set; +import static org.apache.atlas.repository.graphdb.AtlasGraphQuery.ComparisionOperator.NOT_EQUAL; + public class EntitySearchProcessor extends SearchProcessor { private static final Logger LOG = LoggerFactory.getLogger(EntitySearchProcessor.class); private static final Logger PERF_LOG = AtlasPerfTracer.getPerfLogger("EntitySearchProcessor"); @@ -66,10 +68,15 @@ public class EntitySearchProcessor extends SearchProcessor { final Predicate typeNamePredicate = SearchPredicateUtil.getINPredicateGenerator() .generatePredicate(Constants.TYPE_NAME_PROPERTY_KEY, typeAndSubTypes, String.class); - final Predicate traitPredicate = SearchPredicateUtil.getContainsAnyPredicateGenerator() - .generatePredicate(Constants.TRAIT_NAMES_PROPERTY_KEY, classificationTypeAndSubTypes, List.class); final Predicate activePredicate = SearchPredicateUtil.getEQPredicateGenerator() .generatePredicate(Constants.STATE_PROPERTY_KEY, "ACTIVE", String.class); + final Predicate traitPredicate; + + if (classificationType == SearchContext.MATCH_ALL_CLASSIFICATION) { + traitPredicate = SearchPredicateUtil.getNotNullPredicateGenerator().generatePredicate(Constants.TRAIT_NAMES_PROPERTY_KEY, null, List.class); + } else { + traitPredicate = SearchPredicateUtil.getContainsAnyPredicateGenerator().generatePredicate(Constants.TRAIT_NAMES_PROPERTY_KEY, classificationTypeAndSubTypes, List.class); + } processSearchAttributes(entityType, filterCriteria, indexAttributes, graphAttributes, allAttributes); @@ -122,7 +129,11 @@ public class EntitySearchProcessor extends SearchProcessor { // If we need to filter on the trait names then we need to build the query and equivalent in-memory predicate if (filterClassification) { - query.in(Constants.TRAIT_NAMES_PROPERTY_KEY, classificationTypeAndSubTypes); + if (classificationType == SearchContext.MATCH_ALL_CLASSIFICATION) { + query.has(Constants.TRAIT_NAMES_PROPERTY_KEY, NOT_EQUAL, null); + } else { + query.in(Constants.TRAIT_NAMES_PROPERTY_KEY, classificationTypeAndSubTypes); + } // Construct a parallel in-memory predicate if (graphQueryPredicate != null) {
