This is an automated email from the ASF dual-hosted git repository. nixon pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/atlas.git
commit 6ecad6e57be5f880c98fc7fa7179fe3e61226382 Author: Pinal Shah <[email protected]> AuthorDate: Fri Mar 6 11:04:11 2020 +0530 ATLAS-3618 : Entities with no guid appears in search result Signed-off-by: nixonrodrigues <[email protected]> --- .../discovery/ClassificationSearchProcessor.java | 8 +++++ .../atlas/discovery/EntitySearchProcessor.java | 21 ++++++++----- .../org/apache/atlas/util/SearchPredicateUtil.java | 36 ++++++++++++++++++++++ 3 files changed, 58 insertions(+), 7 deletions(-) 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 6ab0afb..1343c9b 100644 --- a/repository/src/main/java/org/apache/atlas/discovery/ClassificationSearchProcessor.java +++ b/repository/src/main/java/org/apache/atlas/discovery/ClassificationSearchProcessor.java @@ -70,6 +70,7 @@ public class ClassificationSearchProcessor extends SearchProcessor { private final Map<String, Object> gremlinQueryBindings; private final String gremlinTagFilterQuery; private final Predicate traitPredicate; + private final Predicate isEntityPredicate; // Some index engines may take space as a delimiter, when basic search is // executed, unsatisfying results may be returned. @@ -148,12 +149,14 @@ public class ClassificationSearchProcessor extends SearchProcessor { LOG.debug("Using query string '{}'.", indexQuery); + isEntityPredicate = SearchPredicateUtil.generateIsEntityVertexPredicate(context.getTypeRegistry()); traitPredicate = buildTraitPredict(classificationType); inMemoryPredicate = inMemoryPredicate == null ? traitPredicate : PredicateUtils.andPredicate(inMemoryPredicate, traitPredicate); } else { indexQuery = null; traitPredicate = null; + isEntityPredicate = null; } // index query directly on classification @@ -282,6 +285,11 @@ public class ClassificationSearchProcessor extends SearchProcessor { getVerticesFromIndexQueryResult(queryResult, entityVertices); isLastResultPage = entityVertices.size() < limit; + + if (isEntityPredicate != null) { + // Do in-memory filtering + CollectionUtils.filter(entityVertices, isEntityPredicate); + } } else { if (classificationIndexQuery != null) { Iterator<AtlasIndexQuery.Result> queryResult = classificationIndexQuery.vertices(qryOffset, limit); 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 ebd5992..c9f3166 100644 --- a/repository/src/main/java/org/apache/atlas/discovery/EntitySearchProcessor.java +++ b/repository/src/main/java/org/apache/atlas/discovery/EntitySearchProcessor.java @@ -97,7 +97,7 @@ public class EntitySearchProcessor extends SearchProcessor { if (!isEntityRootType()) { typeNamePredicate = SearchPredicateUtil.getINPredicateGenerator().generatePredicate(TYPE_NAME_PROPERTY_KEY, typeAndSubTypes, String.class); } else { - typeNamePredicate = null; + typeNamePredicate = SearchPredicateUtil.generateIsEntityVertexPredicate(context.getTypeRegistry()); } processSearchAttributes(entityType, filterCriteria, indexAttributes, graphAttributes, allAttributes); @@ -111,9 +111,8 @@ public class EntitySearchProcessor extends SearchProcessor { graphIndexQueryBuilder.addTypeAndSubTypesQueryFilter(indexQuery, typeAndSubTypesQryStr); // TypeName check to be done in-memory as well to address ATLAS-2121 (case sensitivity) - if (typeNamePredicate != null) { - inMemoryPredicate = typeNamePredicate; - } + inMemoryPredicate = typeNamePredicate; + } if (attrSearchByIndex) { @@ -168,6 +167,10 @@ public class EntitySearchProcessor extends SearchProcessor { query.or(orConditions); // Construct a parallel in-memory predicate + if (isEntityRootType()) { + inMemoryPredicate = typeNamePredicate; + } + if (graphQueryPredicate != null) { graphQueryPredicate = PredicateUtils.andPredicate(graphQueryPredicate, traitPredicate); } else { @@ -210,9 +213,8 @@ public class EntitySearchProcessor extends SearchProcessor { } // Prepare the graph query and in-memory filter for the filtering phase - if (typeNamePredicate != null) { - filterGraphQueryPredicate = typeNamePredicate; - } + filterGraphQueryPredicate = typeNamePredicate; + Predicate attributesPredicate = constructInMemoryPredicate(entityType, filterCriteria, allAttributes); @@ -311,6 +313,11 @@ public class EntitySearchProcessor extends SearchProcessor { isLastResultPage = entityVertices.size() < limit; + // Do in-memory filtering + if (inMemoryPredicate != null) { + CollectionUtils.filter(entityVertices, inMemoryPredicate); + } + //incase when operator is NEQ in pipeSeperatedSystemAttributes if (graphQueryPredicate != null) { CollectionUtils.filter(entityVertices, graphQueryPredicate); 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 b5ede0b..69770c3 100644 --- a/repository/src/main/java/org/apache/atlas/util/SearchPredicateUtil.java +++ b/repository/src/main/java/org/apache/atlas/util/SearchPredicateUtil.java @@ -19,6 +19,8 @@ package org.apache.atlas.util; import org.apache.atlas.repository.graphdb.AtlasVertex; import org.apache.atlas.repository.store.graph.v2.AtlasGraphUtilsV2; +import org.apache.atlas.type.AtlasEntityType; +import org.apache.atlas.type.AtlasTypeRegistry; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.Predicate; import org.apache.commons.lang.StringUtils; @@ -1354,4 +1356,38 @@ public class SearchPredicateUtil { }; } } + + public static Predicate generateIsEntityVertexPredicate(AtlasTypeRegistry typeRegistry) { + return new IsEntityVertexPredicate(typeRegistry); + } + + + static class IsEntityVertexPredicate implements Predicate { + final AtlasTypeRegistry typeRegistry; + + + public IsEntityVertexPredicate(AtlasTypeRegistry typeRegistry) { + this.typeRegistry = typeRegistry; + } + + @Override + public boolean evaluate(final Object object) { + final boolean ret; + + AtlasVertex vertex = (object instanceof AtlasVertex) ? (AtlasVertex) object : null; + + if (vertex != null) { + String typeName = AtlasGraphUtilsV2.getTypeName(vertex); + AtlasEntityType entityType = typeRegistry.getEntityTypeByName(typeName); + + ret = entityType != null && !entityType.isInternalType(); + } else { + ret = false; + } + + return ret; + } + + } + }
