in repository/src/main/java/org/apache/atlas/discovery/EntityDiscoveryService.java [924:1061]
private AtlasSearchResult searchWithSearchContext(SearchContext searchContext) throws AtlasBaseException {
SearchParameters searchParameters = searchContext.getSearchParameters();
AtlasSearchResult ret = new AtlasSearchResult(searchParameters);
final QueryParams params = QueryParams.getNormalizedParams(searchParameters.getLimit(), searchParameters.getOffset());
String searchID = searchTracker.add(searchContext); // For future cancellations
searchParameters.setLimit(params.limit());
searchParameters.setOffset(params.offset());
try {
List<AtlasVertex> resultList = searchContext.getSearchProcessor().execute();
ret.setApproximateCount(searchContext.getSearchProcessor().getResultCount());
String nextMarker = searchContext.getSearchProcessor().getNextMarker();
if (StringUtils.isNotEmpty(nextMarker)) {
ret.setNextMarker(nextMarker);
}
//If excludeHeaderAttributes is true, only primitive attributes requested in 'attributes' field will be sent in the response
Set<String> attributes = searchParameters.getAttributes();
if (searchContext.excludeHeaderAttributes()) {
Collection<List<Object>> values = new ArrayList<>();
AtlasSearchResult.AttributeSearchResult attributeSearchResult = new AtlasSearchResult.AttributeSearchResult();
attributeSearchResult.setName(new ArrayList<>(attributes));
for (AtlasVertex vertex : resultList) {
List<Object> row = new ArrayList<>();
for (String attrName : attributes) {
AtlasEntityType entityType = searchContext.getEntityTypes().iterator().next();
AtlasAttribute attribute = entityType.getAttribute(attrName);
Object value = vertex.getProperty(attribute.getVertexPropertyName(), Object.class);
row.add(value != null ? value : StringUtils.EMPTY);
}
values.add(row);
}
attributeSearchResult.setValues(new ArrayList<>(values));
ret.setAttributes(attributeSearchResult);
return ret;
}
// By default any attribute that shows up in the search parameter should be sent back in the response
// If additional values are requested then the entityAttributes will be a superset of the all search attributes
// and the explicitly requested attribute(s)
Set<String> resultAttributes = new HashSet<>();
Set<String> entityAttributes = new HashSet<>();
if (CollectionUtils.isNotEmpty(searchParameters.getAttributes())) {
resultAttributes.addAll(searchParameters.getAttributes());
}
if (CollectionUtils.isNotEmpty(searchContext.getEntityAttributes())) {
resultAttributes.addAll(searchContext.getEntityAttributes());
}
if (CollectionUtils.isNotEmpty(searchContext.getEntityTypes())) {
AtlasEntityType entityType = searchContext.getEntityTypes().iterator().next();
for (String resultAttribute : resultAttributes) {
AtlasAttribute attribute = entityType.getAttribute(resultAttribute);
if (attribute == null) {
attribute = entityType.getRelationshipAttribute(resultAttribute, null);
}
if (attribute != null) {
AtlasType attributeType = attribute.getAttributeType();
if (attributeType instanceof AtlasArrayType) {
attributeType = ((AtlasArrayType) attributeType).getElementType();
}
if (attributeType instanceof AtlasEntityType || attributeType instanceof AtlasObjectIdType) {
entityAttributes.add(resultAttribute);
}
}
}
}
for (AtlasVertex atlasVertex : resultList) {
AtlasEntityHeader entity = entityRetriever.toAtlasEntityHeader(atlasVertex, resultAttributes);
if (searchParameters.getIncludeClassificationAttributes()) {
entity.setClassifications(entityRetriever.getAllClassifications(atlasVertex));
}
ret.addEntity(entity);
// populate ret.referredEntities
for (String entityAttribute : entityAttributes) {
Object attrValue = entity.getAttribute(entityAttribute);
if (attrValue instanceof AtlasObjectId) {
AtlasObjectId objId = (AtlasObjectId) attrValue;
if (ret.getReferredEntities() == null) {
ret.setReferredEntities(new HashMap<>());
}
if (!ret.getReferredEntities().containsKey(objId.getGuid())) {
ret.getReferredEntities().put(objId.getGuid(), entityRetriever.toAtlasEntityHeader(objId.getGuid()));
}
} else if (attrValue instanceof Collection) {
Collection objIds = (Collection) attrValue;
for (Object obj : objIds) {
if (obj instanceof AtlasObjectId) {
AtlasObjectId objId = (AtlasObjectId) obj;
if (ret.getReferredEntities() == null) {
ret.setReferredEntities(new HashMap<>());
}
if (!ret.getReferredEntities().containsKey(objId.getGuid())) {
ret.getReferredEntities().put(objId.getGuid(), entityRetriever.toAtlasEntityHeader(objId.getGuid()));
}
}
}
}
}
}
} finally {
searchTracker.remove(searchID);
}
scrubSearchResults(ret);
return ret;
}