Commit 1b5ca4c5 by Sarath Subramanian

ATLAS-3517: Enhance suggestions REST API to have optional 'fieldName' parameter…

ATLAS-3517: Enhance suggestions REST API to have optional 'fieldName' parameter to get suggestions from
parent 24fb2b06
...@@ -18,12 +18,9 @@ ...@@ -18,12 +18,9 @@
package org.apache.atlas.repository.graphdb; package org.apache.atlas.repository.graphdb;
import org.apache.atlas.model.discovery.AtlasAggregationEntry; import org.apache.atlas.model.discovery.AtlasAggregationEntry;
import org.apache.atlas.model.discovery.SearchParameters;
import org.apache.atlas.type.AtlasEntityType;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
* Represents a graph client work with indices used by Jansgraph. * Represents a graph client work with indices used by Jansgraph.
...@@ -39,9 +36,10 @@ public interface AtlasGraphIndexClient { ...@@ -39,9 +36,10 @@ public interface AtlasGraphIndexClient {
/** /**
* Returns top 5 suggestions for the given prefix string. * Returns top 5 suggestions for the given prefix string.
* @param prefixString the prefix string whose value needs to be retrieved. * @param prefixString the prefix string whose value needs to be retrieved.
* @param indexFieldName the indexed field name from which to retrieve suggestions
* @return top 5 suggestion strings with prefix String * @return top 5 suggestion strings with prefix String
*/ */
List<String> getSuggestions(String prefixString); List<String> getSuggestions(String prefixString, String indexFieldName);
/** /**
* The implementers should apply the search weights for the passed in properties. * The implementers should apply the search weights for the passed in properties.
......
...@@ -28,6 +28,7 @@ import org.apache.atlas.type.AtlasStructType.AtlasAttribute; ...@@ -28,6 +28,7 @@ import org.apache.atlas.type.AtlasStructType.AtlasAttribute;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils; import org.apache.commons.collections.MapUtils;
import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.Configuration;
import org.apache.commons.lang.StringUtils;
import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrRequest; import org.apache.solr.client.solrj.SolrRequest;
...@@ -55,6 +56,8 @@ public class AtlasJanusGraphIndexClient implements AtlasGraphIndexClient { ...@@ -55,6 +56,8 @@ public class AtlasJanusGraphIndexClient implements AtlasGraphIndexClient {
private static final FreqComparator FREQ_COMPARATOR = new FreqComparator(); private static final FreqComparator FREQ_COMPARATOR = new FreqComparator();
private static final int DEFAULT_SUGGESTION_COUNT = 5; private static final int DEFAULT_SUGGESTION_COUNT = 5;
private static final int MIN_FACET_COUNT_REQUIRED = 1; private static final int MIN_FACET_COUNT_REQUIRED = 1;
private static final String TERMS_PREFIX = "terms.prefix";
private static final String TERMS_FIELD = "terms.fl";
private final Configuration configuration; private final Configuration configuration;
...@@ -269,7 +272,7 @@ public class AtlasJanusGraphIndexClient implements AtlasGraphIndexClient { ...@@ -269,7 +272,7 @@ public class AtlasJanusGraphIndexClient implements AtlasGraphIndexClient {
} }
@Override @Override
public List<String> getSuggestions(String prefixString) { public List<String> getSuggestions(String prefixString, String indexFieldName) {
SolrClient solrClient = null; SolrClient solrClient = null;
try { try {
...@@ -284,9 +287,13 @@ public class AtlasJanusGraphIndexClient implements AtlasGraphIndexClient { ...@@ -284,9 +287,13 @@ public class AtlasJanusGraphIndexClient implements AtlasGraphIndexClient {
SolrQuery solrQuery = new SolrQuery(); SolrQuery solrQuery = new SolrQuery();
solrQuery.setRequestHandler(Constants.TERMS_REQUEST_HANDLER) solrQuery.setRequestHandler(Constants.TERMS_REQUEST_HANDLER)
.setParam("terms.prefix", prefixString) .setParam(TERMS_PREFIX, prefixString)
.setParam(CommonParams.OMIT_HEADER, true); .setParam(CommonParams.OMIT_HEADER, true);
if (StringUtils.isNotEmpty(indexFieldName)) {
solrQuery.setParam(TERMS_FIELD, indexFieldName);
}
QueryResponse queryResponse = solrClient.query(VERTEX_INDEX, solrQuery); QueryResponse queryResponse = solrClient.query(VERTEX_INDEX, solrQuery);
TermsResponse termsResponse = queryResponse == null? null: queryResponse.getTermsResponse(); TermsResponse termsResponse = queryResponse == null? null: queryResponse.getTermsResponse();
......
...@@ -33,9 +33,11 @@ import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_ ...@@ -33,9 +33,11 @@ import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_
public class AtlasSuggestionsResult { public class AtlasSuggestionsResult {
private List<String> suggestions; private List<String> suggestions;
private String prefixString; private String prefixString;
private String fieldName;
public AtlasSuggestionsResult(String prefixString) { public AtlasSuggestionsResult(String prefixString, String fieldName) {
this.prefixString = prefixString; this.prefixString = prefixString;
this.fieldName = fieldName;
} }
public List<String> getSuggestions() { public List<String> getSuggestions() {
...@@ -53,4 +55,12 @@ public class AtlasSuggestionsResult { ...@@ -53,4 +55,12 @@ public class AtlasSuggestionsResult {
public void setPrefixString(String prefixString) { public void setPrefixString(String prefixString) {
this.prefixString = prefixString; this.prefixString = prefixString;
} }
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
} }
...@@ -151,7 +151,8 @@ public interface AtlasDiscoveryService { ...@@ -151,7 +151,8 @@ public interface AtlasDiscoveryService {
/** /**
* Should return top 5 suggestion strings for the given prefix. * Should return top 5 suggestion strings for the given prefix.
* @param prefixString the prefix string * @param prefixString the prefix string
* @param fieldName field from which to retrieve suggestions
* @return top 5 suggestion strings for the given prefix. * @return top 5 suggestion strings for the given prefix.
*/ */
AtlasSuggestionsResult getSuggestions(String prefixString); AtlasSuggestionsResult getSuggestions(String prefixString, String fieldName);
} }
...@@ -109,7 +109,7 @@ public class EntityDiscoveryService implements AtlasDiscoveryService { ...@@ -109,7 +109,7 @@ public class EntityDiscoveryService implements AtlasDiscoveryService {
this.maxTagsLengthInIdxQuery = ApplicationProperties.get().getInt(Constants.INDEX_SEARCH_TAGS_MAX_QUERY_STR_LENGTH, 512); this.maxTagsLengthInIdxQuery = ApplicationProperties.get().getInt(Constants.INDEX_SEARCH_TAGS_MAX_QUERY_STR_LENGTH, 512);
this.indexSearchPrefix = AtlasGraphUtilsV2.getIndexSearchPrefix(); this.indexSearchPrefix = AtlasGraphUtilsV2.getIndexSearchPrefix();
this.userProfileService = userProfileService; this.userProfileService = userProfileService;
this.suggestionsProvider = new SuggestionsProviderImpl(graph); this.suggestionsProvider = new SuggestionsProviderImpl(graph, typeRegistry);
} }
@Override @Override
...@@ -448,8 +448,8 @@ public class EntityDiscoveryService implements AtlasDiscoveryService { ...@@ -448,8 +448,8 @@ public class EntityDiscoveryService implements AtlasDiscoveryService {
@Override @Override
@GraphTransaction @GraphTransaction
public AtlasSuggestionsResult getSuggestions(String prefixString) { public AtlasSuggestionsResult getSuggestions(String prefixString, String fieldName) {
return suggestionsProvider.getSuggestions(prefixString); return suggestionsProvider.getSuggestions(prefixString, fieldName);
} }
@Override @Override
......
...@@ -20,5 +20,5 @@ package org.apache.atlas.discovery; ...@@ -20,5 +20,5 @@ package org.apache.atlas.discovery;
import org.apache.atlas.model.discovery.AtlasSuggestionsResult; import org.apache.atlas.model.discovery.AtlasSuggestionsResult;
public interface SuggestionsProvider { public interface SuggestionsProvider {
AtlasSuggestionsResult getSuggestions(String prefixString); AtlasSuggestionsResult getSuggestions(String prefixString, String indexFieldName);
} }
...@@ -21,6 +21,7 @@ import org.apache.atlas.AtlasException; ...@@ -21,6 +21,7 @@ import org.apache.atlas.AtlasException;
import org.apache.atlas.model.discovery.AtlasSuggestionsResult; import org.apache.atlas.model.discovery.AtlasSuggestionsResult;
import org.apache.atlas.repository.graphdb.AtlasGraph; import org.apache.atlas.repository.graphdb.AtlasGraph;
import org.apache.atlas.repository.graphdb.AtlasGraphIndexClient; import org.apache.atlas.repository.graphdb.AtlasGraphIndexClient;
import org.apache.atlas.type.AtlasTypeRegistry;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -31,19 +32,22 @@ public class SuggestionsProviderImpl implements SuggestionsProvider { ...@@ -31,19 +32,22 @@ public class SuggestionsProviderImpl implements SuggestionsProvider {
private static final Logger LOG = LoggerFactory.getLogger(SuggestionsProviderImpl.class); private static final Logger LOG = LoggerFactory.getLogger(SuggestionsProviderImpl.class);
private final AtlasGraph graph; private final AtlasGraph graph;
private final AtlasTypeRegistry typeRegistry;
public SuggestionsProviderImpl(AtlasGraph graph) { public SuggestionsProviderImpl(AtlasGraph graph, AtlasTypeRegistry typeRegistry) {
this.graph = graph; this.graph = graph;
this.typeRegistry = typeRegistry;
} }
@Override @Override
public AtlasSuggestionsResult getSuggestions(String prefixString) { public AtlasSuggestionsResult getSuggestions(String prefixString, String fieldName) {
AtlasSuggestionsResult result = new AtlasSuggestionsResult(prefixString); AtlasSuggestionsResult result = new AtlasSuggestionsResult(prefixString, fieldName);
try { try {
AtlasGraphIndexClient graphIndexClient = graph.getGraphIndexClient(); AtlasGraphIndexClient graphIndexClient = graph.getGraphIndexClient();
String indexFieldName = (fieldName == null) ? null : typeRegistry.getIndexFieldName(fieldName);
result.setSuggestions(graphIndexClient.getSuggestions(prefixString)); result.setSuggestions(graphIndexClient.getSuggestions(prefixString, indexFieldName));
} catch (AtlasException e) { } catch (AtlasException e) {
LOG.error("Error encountered in performing quick suggestions. Will return no suggestions.", e); LOG.error("Error encountered in performing quick suggestions. Will return no suggestions.", e);
......
...@@ -650,15 +650,15 @@ public class DiscoveryREST { ...@@ -650,15 +650,15 @@ public class DiscoveryREST {
@Path("suggestions") @Path("suggestions")
@GET @GET
public AtlasSuggestionsResult getSuggestions(@QueryParam("prefixString") String prefixString) throws AtlasBaseException { public AtlasSuggestionsResult getSuggestions(@QueryParam("prefixString") String prefixString, @QueryParam("fieldName") String fieldName) {
AtlasPerfTracer perf = null; AtlasPerfTracer perf = null;
try { try {
if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) { if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "DiscoveryREST.getSuggestions(" + prefixString + ")"); perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "DiscoveryREST.getSuggestions(" + prefixString + "," + fieldName + ")");
} }
return discoveryService.getSuggestions(prefixString); return discoveryService.getSuggestions(prefixString, fieldName);
} finally { } finally {
AtlasPerfTracer.log(perf); AtlasPerfTracer.log(perf);
} }
......
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