ATLAS-1961: Basic search improvement in use of Solr index for attribute 
filtering


Project: http://git-wip-us.apache.org/repos/asf/atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/377fe19f
Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/377fe19f
Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/377fe19f

Branch: refs/heads/feature-odf
Commit: 377fe19f023a4036f9fa1503dec6ea698fdb214b
Parents: 71f9c06
Author: Madhan Neethiraj <mad...@apache.org>
Authored: Tue Jul 18 00:25:36 2017 -0700
Committer: Madhan Neethiraj <mad...@apache.org>
Committed: Tue Jul 18 08:05:53 2017 -0700

----------------------------------------------------------------------
 .../atlas/discovery/EntitySearchProcessor.java  | 73 ++++++++++----------
 .../apache/atlas/discovery/SearchContext.java   |  2 +-
 .../apache/atlas/discovery/SearchProcessor.java | 14 +++-
 3 files changed, 50 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/atlas/blob/377fe19f/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 605cb15..3204ecf 100644
--- 
a/repository/src/main/java/org/apache/atlas/discovery/EntitySearchProcessor.java
+++ 
b/repository/src/main/java/org/apache/atlas/discovery/EntitySearchProcessor.java
@@ -20,7 +20,6 @@ package org.apache.atlas.discovery;
 import org.apache.atlas.model.discovery.SearchParameters.FilterCriteria;
 import org.apache.atlas.repository.Constants;
 import org.apache.atlas.repository.graphdb.*;
-import org.apache.atlas.type.AtlasClassificationType;
 import org.apache.atlas.type.AtlasEntityType;
 import org.apache.atlas.utils.AtlasPerfTracer;
 import org.apache.commons.collections.CollectionUtils;
@@ -34,60 +33,70 @@ public class EntitySearchProcessor extends SearchProcessor {
     private static final Logger PERF_LOG = 
AtlasPerfTracer.getPerfLogger("EntitySearchProcessor");
 
     private final AtlasIndexQuery indexQuery;
-    private final AtlasGraphQuery partialGraphQuery;
-    private final AtlasGraphQuery allGraphQuery;
+    private final AtlasGraphQuery graphQuery;
+    private final AtlasGraphQuery filterGraphQuery;
 
     public EntitySearchProcessor(SearchContext context) {
         super(context);
 
-        AtlasEntityType         entityType         = context.getEntityType();
-        AtlasClassificationType classificationType = 
context.getClassificationType();
-        FilterCriteria          filterCriteria     = 
context.getSearchParameters().getEntityFilters();
-        Set<String>             typeAndSubTypes    = 
entityType.getTypeAndAllSubTypes();
-        Set<String>             solrAttributes     = new HashSet<>();
-        Set<String>             gremlinAttributes  = new HashSet<>();
-        Set<String>             allAttributes      = new HashSet<>();
+        final AtlasEntityType entityType         = context.getEntityType();
+        final FilterCriteria  filterCriteria     = 
context.getSearchParameters().getEntityFilters();
+        final Set<String>     typeAndSubTypes    = 
entityType.getTypeAndAllSubTypes();
+        final Set<String>     solrAttributes     = new HashSet<>();
+        final Set<String>     gremlinAttributes  = new HashSet<>();
+        final Set<String>     allAttributes      = new HashSet<>();
 
 
         processSearchAttributes(entityType, filterCriteria, solrAttributes, 
gremlinAttributes, allAttributes);
 
-        boolean useSolrSearch = typeAndSubTypes.size() <= 
MAX_ENTITY_TYPES_IN_INDEX_QUERY && canApplySolrFilter(entityType, 
filterCriteria, false);
+        final boolean typeSearchBySolr = typeAndSubTypes.size() <= 
MAX_ENTITY_TYPES_IN_INDEX_QUERY;
+        final boolean attrSearchBySolr = canApplySolrFilter(entityType, 
filterCriteria, false);
 
-        if (useSolrSearch) {
-            StringBuilder solrQuery = new StringBuilder();
+        StringBuilder solrQuery = new StringBuilder();
 
+        if (typeSearchBySolr) {
             constructTypeTestQuery(solrQuery, typeAndSubTypes);
+        }
+
+        if (attrSearchBySolr) {
             constructFilterQuery(solrQuery, entityType, filterCriteria, 
solrAttributes);
+        } else {
+            gremlinAttributes.addAll(solrAttributes);
+        }
 
+        if (solrQuery.length() > 0) {
             String solrQueryString = 
STRAY_AND_PATTERN.matcher(solrQuery).replaceAll(")");
 
             solrQueryString = 
STRAY_OR_PATTERN.matcher(solrQueryString).replaceAll(")");
             solrQueryString = 
STRAY_ELIPSIS_PATTERN.matcher(solrQueryString).replaceAll("");
 
             indexQuery = context.getGraph().indexQuery(Constants.VERTEX_INDEX, 
solrQueryString);
+        } else {
+            indexQuery = null;
+        }
 
-            if (CollectionUtils.isNotEmpty(gremlinAttributes) || 
classificationType != null) {
-                AtlasGraphQuery query = context.getGraph().query();
+        if (CollectionUtils.isNotEmpty(gremlinAttributes) || 
!typeSearchBySolr) {
+            AtlasGraphQuery query = context.getGraph().query();
 
-                addClassificationNameConditionIfNecessary(query);
+            if (!typeSearchBySolr) {
+                query.in(Constants.TYPE_NAME_PROPERTY_KEY, typeAndSubTypes);
+            }
+
+            graphQuery = toGremlinFilterQuery(entityType, filterCriteria, 
gremlinAttributes, query);
 
-                partialGraphQuery = toGremlinFilterQuery(entityType, 
filterCriteria, gremlinAttributes, query);
-            } else {
-                partialGraphQuery = null;
+            if (context.getSearchParameters().getExcludeDeletedEntities() && 
indexQuery == null) {
+                graphQuery.has(Constants.STATE_PROPERTY_KEY, "ACTIVE");
             }
         } else {
-            indexQuery      = null;
-            partialGraphQuery = null;
+            graphQuery = null;
         }
 
         AtlasGraphQuery query = 
context.getGraph().query().in(Constants.TYPE_NAME_PROPERTY_KEY, 
typeAndSubTypes);
 
-        addClassificationNameConditionIfNecessary(query);
-
-        allGraphQuery = toGremlinFilterQuery(entityType, filterCriteria, 
allAttributes, query);
+        filterGraphQuery = toGremlinFilterQuery(entityType, filterCriteria, 
allAttributes, query);
 
         if (context.getSearchParameters().getExcludeDeletedEntities()) {
-            allGraphQuery.has(Constants.STATE_PROPERTY_KEY, "ACTIVE");
+            filterGraphQuery.has(Constants.STATE_PROPERTY_KEY, "ACTIVE");
         }
     }
 
@@ -128,15 +137,15 @@ public class EntitySearchProcessor extends 
SearchProcessor {
 
                     vertices = getVerticesFromIndexQueryResult(queryResult);
 
-                    if (partialGraphQuery != null) {
+                    if (graphQuery != null) {
                         AtlasGraphQuery guidQuery = 
context.getGraph().query().in(Constants.GUID_PROPERTY_KEY, getGuids(vertices));
 
-                        guidQuery.addConditionsFrom(partialGraphQuery);
+                        guidQuery.addConditionsFrom(graphQuery);
 
                         vertices = 
getVertices(guidQuery.vertices().iterator());
                     }
                 } else {
-                    Iterator<AtlasVertex> queryResult = 
allGraphQuery.vertices(qryOffset, limit).iterator();
+                    Iterator<AtlasVertex> queryResult = 
graphQuery.vertices(qryOffset, limit).iterator();
 
                     if (!queryResult.hasNext()) { // no more results from 
query - end of search
                         break;
@@ -182,7 +191,7 @@ public class EntitySearchProcessor extends SearchProcessor {
 
         AtlasGraphQuery query = 
context.getGraph().query().in(Constants.GUID_PROPERTY_KEY, 
getGuids(entityVertices));
 
-        query.addConditionsFrom(allGraphQuery);
+        query.addConditionsFrom(filterGraphQuery);
 
         List<AtlasVertex> ret = getVertices(query.vertices().iterator());
 
@@ -194,10 +203,4 @@ public class EntitySearchProcessor extends SearchProcessor 
{
 
         return ret;
     }
-
-    private void addClassificationNameConditionIfNecessary(AtlasGraphQuery 
query) {
-        if (context.getClassificationType() != null && 
!context.needClassificationProcessor()) {
-            query.in(Constants.TRAIT_NAMES_PROPERTY_KEY, 
context.getClassificationType().getTypeAndAllSubTypes());
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/atlas/blob/377fe19f/repository/src/main/java/org/apache/atlas/discovery/SearchContext.java
----------------------------------------------------------------------
diff --git 
a/repository/src/main/java/org/apache/atlas/discovery/SearchContext.java 
b/repository/src/main/java/org/apache/atlas/discovery/SearchContext.java
index 55a07f3..8dd7667 100644
--- a/repository/src/main/java/org/apache/atlas/discovery/SearchContext.java
+++ b/repository/src/main/java/org/apache/atlas/discovery/SearchContext.java
@@ -109,7 +109,7 @@ public class SearchContext {
     }
 
     public boolean needClassificationProcessor() {
-        return classificationType != null && 
(hasAttributeFilter(searchParameters.getTagFilters()) || entityType == null);
+        return classificationType != null;
     }
 
     public boolean needEntityProcessor() {

http://git-wip-us.apache.org/repos/asf/atlas/blob/377fe19f/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java
----------------------------------------------------------------------
diff --git 
a/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java 
b/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java
index 1481809..ff0bd2e 100644
--- a/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java
+++ b/repository/src/main/java/org/apache/atlas/discovery/SearchProcessor.java
@@ -88,7 +88,7 @@ public abstract class SearchProcessor {
     public abstract List<AtlasVertex> execute();
 
     public List<AtlasVertex> filter(List<AtlasVertex> entityVertices) {
-        return nextProcessor == null ? entityVertices : 
nextProcessor.filter(entityVertices);
+        return nextProcessor == null || 
CollectionUtils.isEmpty(entityVertices) ? entityVertices : 
nextProcessor.filter(entityVertices);
     }
 
 
@@ -193,12 +193,20 @@ public abstract class SearchProcessor {
             String filterQuery = toSolrQuery(type, filterCriteria, 
solrAttributes, 0);
 
             if (StringUtils.isNotEmpty(filterQuery)) {
-                solrQuery.append(AND_STR).append(filterQuery);
+                if (solrQuery.length() > 0) {
+                    solrQuery.append(AND_STR);
+                }
+
+                solrQuery.append(filterQuery);
             }
         }
 
         if (type instanceof AtlasEntityType && 
context.getSearchParameters().getExcludeDeletedEntities()) {
-            
solrQuery.append(AND_STR).append("v.\"__state\":").append("ACTIVE");
+            if (solrQuery.length() > 0) {
+                solrQuery.append(AND_STR);
+            }
+
+            solrQuery.append("v.\"__state\":").append("ACTIVE");
         }
     }
 

Reply via email to