You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by ni...@apache.org on 2020/03/11 06:59:25 UTC
[atlas] 01/02: ATLAS-3618 : Entities with no guid appears in search
result
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 <pi...@freestoneinfotech.com>
AuthorDate: Fri Mar 6 11:04:11 2020 +0530
ATLAS-3618 : Entities with no guid appears in search result
Signed-off-by: nixonrodrigues <ni...@apache.org>
---
.../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;
+ }
+
+ }
+
}