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 07:01:53 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 branch-2.0
in repository https://gitbox.apache.org/repos/asf/atlas.git

commit d58c0572f5079b837f37e7ebe630e33363f25bb2
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>
    (cherry picked from commit 2608d061bb6762ba60c9360f0f527790ef6344a7)
---
 .../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;
+        }
+
+    }
+
 }