Commit 6ecad6e5 by Pinal Shah Committed by nixonrodrigues

ATLAS-3618 : Entities with no guid appears in search result

parent 765ea583
...@@ -70,6 +70,7 @@ public class ClassificationSearchProcessor extends SearchProcessor { ...@@ -70,6 +70,7 @@ public class ClassificationSearchProcessor extends SearchProcessor {
private final Map<String, Object> gremlinQueryBindings; private final Map<String, Object> gremlinQueryBindings;
private final String gremlinTagFilterQuery; private final String gremlinTagFilterQuery;
private final Predicate traitPredicate; private final Predicate traitPredicate;
private final Predicate isEntityPredicate;
// Some index engines may take space as a delimiter, when basic search is // Some index engines may take space as a delimiter, when basic search is
// executed, unsatisfying results may be returned. // executed, unsatisfying results may be returned.
...@@ -148,12 +149,14 @@ public class ClassificationSearchProcessor extends SearchProcessor { ...@@ -148,12 +149,14 @@ public class ClassificationSearchProcessor extends SearchProcessor {
LOG.debug("Using query string '{}'.", indexQuery); LOG.debug("Using query string '{}'.", indexQuery);
isEntityPredicate = SearchPredicateUtil.generateIsEntityVertexPredicate(context.getTypeRegistry());
traitPredicate = buildTraitPredict(classificationType); traitPredicate = buildTraitPredict(classificationType);
inMemoryPredicate = inMemoryPredicate == null ? traitPredicate : PredicateUtils.andPredicate(inMemoryPredicate, traitPredicate); inMemoryPredicate = inMemoryPredicate == null ? traitPredicate : PredicateUtils.andPredicate(inMemoryPredicate, traitPredicate);
} else { } else {
indexQuery = null; indexQuery = null;
traitPredicate = null; traitPredicate = null;
isEntityPredicate = null;
} }
// index query directly on classification // index query directly on classification
...@@ -282,6 +285,11 @@ public class ClassificationSearchProcessor extends SearchProcessor { ...@@ -282,6 +285,11 @@ public class ClassificationSearchProcessor extends SearchProcessor {
getVerticesFromIndexQueryResult(queryResult, entityVertices); getVerticesFromIndexQueryResult(queryResult, entityVertices);
isLastResultPage = entityVertices.size() < limit; isLastResultPage = entityVertices.size() < limit;
if (isEntityPredicate != null) {
// Do in-memory filtering
CollectionUtils.filter(entityVertices, isEntityPredicate);
}
} else { } else {
if (classificationIndexQuery != null) { if (classificationIndexQuery != null) {
Iterator<AtlasIndexQuery.Result> queryResult = classificationIndexQuery.vertices(qryOffset, limit); Iterator<AtlasIndexQuery.Result> queryResult = classificationIndexQuery.vertices(qryOffset, limit);
......
...@@ -97,7 +97,7 @@ public class EntitySearchProcessor extends SearchProcessor { ...@@ -97,7 +97,7 @@ public class EntitySearchProcessor extends SearchProcessor {
if (!isEntityRootType()) { if (!isEntityRootType()) {
typeNamePredicate = SearchPredicateUtil.getINPredicateGenerator().generatePredicate(TYPE_NAME_PROPERTY_KEY, typeAndSubTypes, String.class); typeNamePredicate = SearchPredicateUtil.getINPredicateGenerator().generatePredicate(TYPE_NAME_PROPERTY_KEY, typeAndSubTypes, String.class);
} else { } else {
typeNamePredicate = null; typeNamePredicate = SearchPredicateUtil.generateIsEntityVertexPredicate(context.getTypeRegistry());
} }
processSearchAttributes(entityType, filterCriteria, indexAttributes, graphAttributes, allAttributes); processSearchAttributes(entityType, filterCriteria, indexAttributes, graphAttributes, allAttributes);
...@@ -111,9 +111,8 @@ public class EntitySearchProcessor extends SearchProcessor { ...@@ -111,9 +111,8 @@ public class EntitySearchProcessor extends SearchProcessor {
graphIndexQueryBuilder.addTypeAndSubTypesQueryFilter(indexQuery, typeAndSubTypesQryStr); graphIndexQueryBuilder.addTypeAndSubTypesQueryFilter(indexQuery, typeAndSubTypesQryStr);
// TypeName check to be done in-memory as well to address ATLAS-2121 (case sensitivity) // TypeName check to be done in-memory as well to address ATLAS-2121 (case sensitivity)
if (typeNamePredicate != null) { inMemoryPredicate = typeNamePredicate;
inMemoryPredicate = typeNamePredicate;
}
} }
if (attrSearchByIndex) { if (attrSearchByIndex) {
...@@ -168,6 +167,10 @@ public class EntitySearchProcessor extends SearchProcessor { ...@@ -168,6 +167,10 @@ public class EntitySearchProcessor extends SearchProcessor {
query.or(orConditions); query.or(orConditions);
// Construct a parallel in-memory predicate // Construct a parallel in-memory predicate
if (isEntityRootType()) {
inMemoryPredicate = typeNamePredicate;
}
if (graphQueryPredicate != null) { if (graphQueryPredicate != null) {
graphQueryPredicate = PredicateUtils.andPredicate(graphQueryPredicate, traitPredicate); graphQueryPredicate = PredicateUtils.andPredicate(graphQueryPredicate, traitPredicate);
} else { } else {
...@@ -210,9 +213,8 @@ public class EntitySearchProcessor extends SearchProcessor { ...@@ -210,9 +213,8 @@ public class EntitySearchProcessor extends SearchProcessor {
} }
// Prepare the graph query and in-memory filter for the filtering phase // 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); Predicate attributesPredicate = constructInMemoryPredicate(entityType, filterCriteria, allAttributes);
...@@ -311,6 +313,11 @@ public class EntitySearchProcessor extends SearchProcessor { ...@@ -311,6 +313,11 @@ public class EntitySearchProcessor extends SearchProcessor {
isLastResultPage = entityVertices.size() < limit; isLastResultPage = entityVertices.size() < limit;
// Do in-memory filtering
if (inMemoryPredicate != null) {
CollectionUtils.filter(entityVertices, inMemoryPredicate);
}
//incase when operator is NEQ in pipeSeperatedSystemAttributes //incase when operator is NEQ in pipeSeperatedSystemAttributes
if (graphQueryPredicate != null) { if (graphQueryPredicate != null) {
CollectionUtils.filter(entityVertices, graphQueryPredicate); CollectionUtils.filter(entityVertices, graphQueryPredicate);
......
...@@ -19,6 +19,8 @@ package org.apache.atlas.util; ...@@ -19,6 +19,8 @@ package org.apache.atlas.util;
import org.apache.atlas.repository.graphdb.AtlasVertex; import org.apache.atlas.repository.graphdb.AtlasVertex;
import org.apache.atlas.repository.store.graph.v2.AtlasGraphUtilsV2; 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.CollectionUtils;
import org.apache.commons.collections.Predicate; import org.apache.commons.collections.Predicate;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
...@@ -1354,4 +1356,38 @@ public class SearchPredicateUtil { ...@@ -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;
}
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment