Commit fbb244c2 by Abhishek Kadam Committed by apoorvnaik

ATLAS-2815: UI Slow loading enhancements

1. Updated REST APIs that read entities with an option to include only minimum attributes for referred entities 2. UI changes for minExtInfo Change-Id: I633b46cc79de8ec807236719d8b5828aef537208 Signed-off-by: 's avatarapoorvnaik <apoorvnaik@apache.org>
parent 651ecd9e
...@@ -43,7 +43,17 @@ define(['require', ...@@ -43,7 +43,17 @@ define(['require',
*************************/ *************************/
getEntity: function(token, options) { getEntity: function(token, options) {
var url = UrlLinks.entitiesApiUrl(token); var url = UrlLinks.entitiesApiUrl({ guid: token });
options = _.extend({
contentType: 'application/json',
dataType: 'json'
}, options);
return this.constructor.nonCrudOperation.call(this, url, 'GET', options);
},
getEntityHeader: function(token, options) {
var url = UrlLinks.entityHeaderApiUrl(token);
options = _.extend({ options = _.extend({
contentType: 'application/json', contentType: 'application/json',
......
...@@ -41,7 +41,7 @@ define(['require', ...@@ -41,7 +41,7 @@ define(['require',
* Non - CRUD operations * Non - CRUD operations
*************************/ *************************/
getEntity: function(id, options) { getEntity: function(id, options) {
var url = UrlLinks.entitiesApiUrl(id); var url = UrlLinks.entitiesApiUrl({guid: id});
options = _.extend({ options = _.extend({
contentType: 'application/json', contentType: 'application/json',
......
...@@ -41,7 +41,7 @@ define(['require', ...@@ -41,7 +41,7 @@ define(['require',
* Non - CRUD operations * Non - CRUD operations
*************************/ *************************/
deleteAssociation: function(guid, name, options) { deleteAssociation: function(guid, name, options) {
var url = UrlLinks.entitiesApiUrl(guid, name); var url = UrlLinks.entitiesApiUrl({ guid: guid, name: name });
options = _.extend({ options = _.extend({
contentType: 'application/json', contentType: 'application/json',
dataType: 'json' dataType: 'json'
......
...@@ -125,7 +125,7 @@ define([ ...@@ -125,7 +125,7 @@ define([
'id': id, 'id': id,
'value': paramObj 'value': paramObj
}, that.preFetchedCollectionLists, that.sharedObj))); }, that.preFetchedCollectionLists, that.sharedObj)));
this.entityCollection.url = UrlLinks.entitiesApiUrl(id); this.entityCollection.url = UrlLinks.entitiesApiUrl({ guid: id, minExtInfo: true });
this.entityCollection.fetch({ reset: true }); this.entityCollection.fetch({ reset: true });
}); });
} }
......
...@@ -81,11 +81,11 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum ...@@ -81,11 +81,11 @@ define(['require', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enum
var table = "", var table = "",
fetchInputOutputValue = function(id) { fetchInputOutputValue = function(id) {
var that = this; var that = this;
scope.entityModel.getEntity(id, { scope.entityModel.getEntityHeader(id, {
success: function(serverData) { success: function(serverData) {
var value = "", var value = "",
deleteButton = "", deleteButton = "",
data = serverData.entity; data = serverData;
value = Utils.getName(data); value = Utils.getName(data);
var id = ""; var id = "";
if (data.guid) { if (data.guid) {
......
...@@ -48,16 +48,28 @@ define(['require', 'utils/Enums', 'utils/Utils', 'underscore'], function(require ...@@ -48,16 +48,28 @@ define(['require', 'utils/Enums', 'utils/Utils', 'underscore'], function(require
return defApiUrl.defs + '?excludeInternalTypesAndReferences=true&type=' + type; return defApiUrl.defs + '?excludeInternalTypesAndReferences=true&type=' + type;
} }
}, },
entitiesApiUrl: function(guid, name) { entitiesApiUrl: function(options) {
var entitiesUrl = this.baseUrlV2 + '/entity'; var entitiesUrl = this.baseUrlV2 + '/entity';
if (options) {
var guid = options.guid,
name = options.name,
minExtInfo = options.minExtInfo;
if (guid && name) { if (guid && name) {
return entitiesUrl + '/guid/' + guid + '/classification/' + name; entitiesUrl += '/guid/' + guid + '/classification/' + name;
} else if (guid && !name) { } else if (guid && !name) {
return entitiesUrl + '/guid/' + guid; entitiesUrl += '/guid/' + guid;
} else { }
}
if (!minExtInfo) {
return entitiesUrl; return entitiesUrl;
} else {
return entitiesUrl += '?minExtInfo=' + (minExtInfo);
} }
}, },
entityHeaderApiUrl: function(guid) {
return this.entitiesApiUrl({ guid: guid }) + "/header"
},
entitiesTraitsApiUrl: function(token) { entitiesTraitsApiUrl: function(token) {
if (token) { if (token) {
return this.baseUrlV2 + '/entity/guid/' + token + '/classifications'; return this.baseUrlV2 + '/entity/guid/' + token + '/classifications';
...@@ -69,6 +81,9 @@ define(['require', 'utils/Enums', 'utils/Utils', 'underscore'], function(require ...@@ -69,6 +81,9 @@ define(['require', 'utils/Enums', 'utils/Utils', 'underscore'], function(require
entityCollectionaudit: function(guid) { entityCollectionaudit: function(guid) {
return this.baseUrlV2 + '/entity/' + guid + '/audit'; return this.baseUrlV2 + '/entity/' + guid + '/audit';
}, },
replicationCollectionaudit: function(name) {
return this.baseUrl + '/admin/cluster/audit/' + name;
},
classicationApiUrl: function(name, guid) { classicationApiUrl: function(name, guid) {
var typeUrl = this.typedefsUrl(); var typeUrl = this.typedefsUrl();
if (name) { if (name) {
......
...@@ -184,7 +184,7 @@ define(['require', ...@@ -184,7 +184,7 @@ define(['require',
}, },
fetchCollections: function() { fetchCollections: function() {
if (this.guid) { if (this.guid) {
this.collection.url = UrlLinks.entitiesApiUrl(this.guid); this.collection.url = UrlLinks.entitiesApiUrl({ guid: this.guid });
this.collection.fetch({ reset: true }); this.collection.fetch({ reset: true });
} else { } else {
this.entityCollectionList(); this.entityCollectionList();
...@@ -212,7 +212,7 @@ define(['require', ...@@ -212,7 +212,7 @@ define(['require',
_.each(attrObj, function(obj) { _.each(attrObj, function(obj) {
if (obj.guid && !referredEntities[obj.guid]) { if (obj.guid && !referredEntities[obj.guid]) {
++that.asyncReferEntityCounter; ++that.asyncReferEntityCounter;
that.collection.url = UrlLinks.entitiesApiUrl(obj.guid); that.collection.url = UrlLinks.entitiesApiUrl({ guid: obj.guid });
that.collection.fetch({ that.collection.fetch({
success: function(data, response) { success: function(data, response) {
referredEntities[obj.guid] = response.entity; referredEntities[obj.guid] = response.entity;
......
...@@ -6,9 +6,9 @@ ...@@ -6,9 +6,9 @@
* to you under the Apache License, Version 2.0 (the * to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance * "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at * with the License. You may obtain a copy of the License at
* * <p>
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* * <p>
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
...@@ -47,6 +47,14 @@ import java.util.Set; ...@@ -47,6 +47,14 @@ import java.util.Set;
public class AtlasEntityType extends AtlasStructType { public class AtlasEntityType extends AtlasStructType {
private static final Logger LOG = LoggerFactory.getLogger(AtlasEntityType.class); private static final Logger LOG = LoggerFactory.getLogger(AtlasEntityType.class);
private static final String NAME = "name";
private static final String DESCRIPTION = "description";
private static final String OWNER = "owner";
private static final String CREATE_TIME = "createTime";
private static final String[] ENTITY_HEADER_ATTRIBUTES = new String[]{NAME, DESCRIPTION, OWNER, CREATE_TIME};
private static final String OPTION_SCHEMA_ATTRIBUTES = "schemaAttributes";
private final AtlasEntityDef entityDef; private final AtlasEntityDef entityDef;
private final String typeQryStr; private final String typeQryStr;
...@@ -62,6 +70,8 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -62,6 +70,8 @@ public class AtlasEntityType extends AtlasStructType {
private Map<String, List<AtlasRelationshipType>> relationshipAttributesType = Collections.emptyMap(); private Map<String, List<AtlasRelationshipType>> relationshipAttributesType = Collections.emptyMap();
private String typeAndAllSubTypesQryStr = ""; private String typeAndAllSubTypesQryStr = "";
private boolean isInternalType = false; private boolean isInternalType = false;
private Map<String, AtlasAttribute> headerAttributes = Collections.emptyMap();
private Map<String, AtlasAttribute> minInfoAttributes = Collections.emptyMap();
public AtlasEntityType(AtlasEntityDef entityDef) { public AtlasEntityType(AtlasEntityDef entityDef) {
...@@ -80,7 +90,9 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -80,7 +90,9 @@ public class AtlasEntityType extends AtlasStructType {
resolveReferences(typeRegistry); resolveReferences(typeRegistry);
} }
public AtlasEntityDef getEntityDef() { return entityDef; } public AtlasEntityDef getEntityDef() {
return entityDef;
}
@Override @Override
void resolveReferences(AtlasTypeRegistry typeRegistry) throws AtlasBaseException { void resolveReferences(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
...@@ -96,7 +108,7 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -96,7 +108,7 @@ public class AtlasEntityType extends AtlasStructType {
AtlasType superType = typeRegistry.getType(superTypeName); AtlasType superType = typeRegistry.getType(superTypeName);
if (superType instanceof AtlasEntityType) { if (superType instanceof AtlasEntityType) {
s.add((AtlasEntityType)superType); s.add((AtlasEntityType) superType);
} else { } else {
throw new AtlasBaseException(AtlasErrorCode.INCOMPATIBLE_SUPERTYPE, superTypeName, entityDef.getName()); throw new AtlasBaseException(AtlasErrorCode.INCOMPATIBLE_SUPERTYPE, superTypeName, entityDef.getName());
} }
...@@ -117,6 +129,34 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -117,6 +129,34 @@ public class AtlasEntityType extends AtlasStructType {
this.typeAndAllSuperTypes = new HashSet<>(this.allSuperTypes); this.typeAndAllSuperTypes = new HashSet<>(this.allSuperTypes);
this.typeAndAllSuperTypes.add(this.getTypeName()); this.typeAndAllSuperTypes.add(this.getTypeName());
this.typeAndAllSuperTypes = Collections.unmodifiableSet(this.typeAndAllSuperTypes); this.typeAndAllSuperTypes = Collections.unmodifiableSet(this.typeAndAllSuperTypes);
// headerAttributes includes uniqAttributes & ENTITY_HEADER_ATTRIBUTES
this.headerAttributes = new HashMap<>(this.uniqAttributes);
for (String headerAttributeName : ENTITY_HEADER_ATTRIBUTES) {
AtlasAttribute headerAttribute = getAttribute(headerAttributeName);
if (headerAttribute != null) {
this.headerAttributes.put(headerAttributeName, headerAttribute);
}
}
// minInfoAttributes includes all headerAttributes & schema-attributes
this.minInfoAttributes = new HashMap<>(this.headerAttributes);
Map<String, String> typeDefOptions = entityDef.getOptions();
String jsonList = typeDefOptions != null ? typeDefOptions.get(OPTION_SCHEMA_ATTRIBUTES) : null;
List<String> schemaAttributeNames = StringUtils.isNotEmpty(jsonList) ? AtlasType.fromJson(jsonList, List.class) : null;
if (CollectionUtils.isNotEmpty(schemaAttributeNames)) {
for (String schemaAttributeName : schemaAttributeNames) {
AtlasAttribute schemaAttribute = getAttribute(schemaAttributeName);
if (schemaAttribute != null) {
this.minInfoAttributes.put(schemaAttributeName, schemaAttribute);
}
}
}
} }
@Override @Override
...@@ -185,13 +225,25 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -185,13 +225,25 @@ public class AtlasEntityType extends AtlasStructType {
return allSuperTypes; return allSuperTypes;
} }
public Set<String> getSubTypes() { return subTypes; } public Set<String> getSubTypes() {
return subTypes;
}
public Set<String> getAllSubTypes() {
return allSubTypes;
}
public Set<String> getTypeAndAllSubTypes() {
return typeAndAllSubTypes;
}
public Set<String> getAllSubTypes() { return allSubTypes; } public Set<String> getTypeAndAllSuperTypes() {
return typeAndAllSuperTypes;
}
public Set<String> getTypeAndAllSubTypes() { return typeAndAllSubTypes; } public Map<String, AtlasAttribute> getHeaderAttributes() { return headerAttributes; }
public Set<String> getTypeAndAllSuperTypes() { return typeAndAllSuperTypes; } public Map<String, AtlasAttribute> getMinInfoAttributes() { return minInfoAttributes; }
public boolean isSuperTypeOf(AtlasEntityType entityType) { public boolean isSuperTypeOf(AtlasEntityType entityType) {
return entityType != null && allSubTypes.contains(entityType.getTypeName()); return entityType != null && allSubTypes.contains(entityType.getTypeName());
...@@ -217,9 +269,13 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -217,9 +269,13 @@ public class AtlasEntityType extends AtlasStructType {
return isInternalType; return isInternalType;
} }
public Map<String, AtlasAttribute> getRelationshipAttributes() { return relationshipAttributes; } public Map<String, AtlasAttribute> getRelationshipAttributes() {
return relationshipAttributes;
}
public AtlasAttribute getRelationshipAttribute(String attributeName) { return relationshipAttributes.get(attributeName); } public AtlasAttribute getRelationshipAttribute(String attributeName) {
return relationshipAttributes.get(attributeName);
}
// this method should be called from AtlasRelationshipType.resolveReferencesPhase2() // this method should be called from AtlasRelationshipType.resolveReferencesPhase2()
void addRelationshipAttribute(String attributeName, AtlasAttribute attribute) { void addRelationshipAttribute(String attributeName, AtlasAttribute attribute) {
...@@ -254,7 +310,9 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -254,7 +310,9 @@ public class AtlasEntityType extends AtlasStructType {
return typeAndAllSubTypesQryStr; return typeAndAllSubTypesQryStr;
} }
public String getTypeQryStr() { return typeQryStr; } public String getTypeQryStr() {
return typeQryStr;
}
public boolean hasRelationshipAttribute(String attributeName) { public boolean hasRelationshipAttribute(String attributeName) {
return relationshipAttributes.containsKey(attributeName); return relationshipAttributes.containsKey(attributeName);
...@@ -280,7 +338,7 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -280,7 +338,7 @@ public class AtlasEntityType extends AtlasStructType {
} }
@Override @Override
public AtlasEntity createDefaultValue(Object defaultValue){ public AtlasEntity createDefaultValue(Object defaultValue) {
AtlasEntity ret = new AtlasEntity(entityDef.getName()); AtlasEntity ret = new AtlasEntity(entityDef.getName());
populateDefaultValues(ret); populateDefaultValues(ret);
...@@ -528,6 +586,7 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -528,6 +586,7 @@ public class AtlasEntityType extends AtlasStructType {
} }
} }
} }
boolean isAssignableFrom(AtlasObjectId objId) { boolean isAssignableFrom(AtlasObjectId objId) {
boolean ret = AtlasTypeUtil.isValid(objId) && (StringUtils.equals(objId.getTypeName(), getTypeName()) || isSuperTypeOf(objId.getTypeName())); boolean ret = AtlasTypeUtil.isValid(objId) && (StringUtils.equals(objId.getTypeName(), getTypeName()) || isSuperTypeOf(objId.getTypeName()));
...@@ -605,6 +664,7 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -605,6 +664,7 @@ public class AtlasEntityType extends AtlasStructType {
return ret; return ret;
} }
private boolean isValidRelationshipType(AtlasType attributeType) { private boolean isValidRelationshipType(AtlasType attributeType) {
boolean ret = false; boolean ret = false;
...@@ -700,7 +760,7 @@ public class AtlasEntityType extends AtlasStructType { ...@@ -700,7 +760,7 @@ public class AtlasEntityType extends AtlasStructType {
} }
} else if (obj instanceof Map) { } else if (obj instanceof Map) {
Map attributes = AtlasTypeUtil.toStructAttributes((Map)obj); Map attributes = AtlasTypeUtil.toStructAttributes((Map) obj);
for (AtlasAttribute attribute : relationshipAttributes.values()) { for (AtlasAttribute attribute : relationshipAttributes.values()) {
......
...@@ -21,6 +21,7 @@ import org.apache.atlas.exception.AtlasBaseException; ...@@ -21,6 +21,7 @@ import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.model.instance.AtlasClassification; import org.apache.atlas.model.instance.AtlasClassification;
import org.apache.atlas.model.instance.AtlasEntity.AtlasEntitiesWithExtInfo; import org.apache.atlas.model.instance.AtlasEntity.AtlasEntitiesWithExtInfo;
import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityWithExtInfo; import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityWithExtInfo;
import org.apache.atlas.model.instance.AtlasEntityHeader;
import org.apache.atlas.model.instance.AtlasObjectId; import org.apache.atlas.model.instance.AtlasObjectId;
import org.apache.atlas.model.instance.EntityMutationResponse; import org.apache.atlas.model.instance.EntityMutationResponse;
import org.apache.atlas.repository.store.graph.v2.EntityStream; import org.apache.atlas.repository.store.graph.v2.EntityStream;
...@@ -51,6 +52,23 @@ public interface AtlasEntityStore { ...@@ -51,6 +52,23 @@ public interface AtlasEntityStore {
AtlasEntityWithExtInfo getById(String guid) throws AtlasBaseException; AtlasEntityWithExtInfo getById(String guid) throws AtlasBaseException;
/** /**
*
* Get entity definition by its guid
* @param guid
* @param isMinExtInfo
* @return AtlasEntity
*/
AtlasEntityWithExtInfo getById(String guid, boolean isMinExtInfo) throws AtlasBaseException;
/**
* Get entity header for the given GUID
* @param guid
* @return
* @throws AtlasBaseException
*/
AtlasEntityHeader getHeaderById(String guid) throws AtlasBaseException;
/**
* Batch GET to retrieve entities by their ID * Batch GET to retrieve entities by their ID
* @param guid * @param guid
* @return * @return
...@@ -59,6 +77,15 @@ public interface AtlasEntityStore { ...@@ -59,6 +77,15 @@ public interface AtlasEntityStore {
AtlasEntitiesWithExtInfo getByIds(List<String> guid) throws AtlasBaseException; AtlasEntitiesWithExtInfo getByIds(List<String> guid) throws AtlasBaseException;
/** /**
* Batch GET to retrieve entities by their ID
* @param guid
* @param isMinExtInfo
* @return
* @throws AtlasBaseException
*/
AtlasEntitiesWithExtInfo getByIds(List<String> guid, boolean isMinExtInfo) throws AtlasBaseException;
/**
* *
* Get an eneity by its unique attribute * Get an eneity by its unique attribute
* @param entityType type of the entity * @param entityType type of the entity
...@@ -69,6 +96,17 @@ public interface AtlasEntityStore { ...@@ -69,6 +96,17 @@ public interface AtlasEntityStore {
throws AtlasBaseException; throws AtlasBaseException;
/** /**
*
* Get an eneity by its unique attribute
* @param entityType type of the entity
* @param uniqAttributes Attributes that uniquely identify the entity
* @param isMinExtInfo
* @return EntityMutationResponse details of the updates performed by this call
*/
AtlasEntityWithExtInfo getByUniqueAttributes(AtlasEntityType entityType, Map<String, Object> uniqAttributes, boolean isMinExtInfo)
throws AtlasBaseException;
/**
* Create or update entities in the stream * Create or update entities in the stream
* @param entityStream AtlasEntityStream * @param entityStream AtlasEntityStream
* @return EntityMutationResponse Entity mutations operations with the corresponding set of entities on which these operations were performed * @return EntityMutationResponse Entity mutations operations with the corresponding set of entities on which these operations were performed
......
...@@ -101,57 +101,98 @@ public class AtlasEntityStoreV2 implements AtlasEntityStore { ...@@ -101,57 +101,98 @@ public class AtlasEntityStoreV2 implements AtlasEntityStore {
@Override @Override
@GraphTransaction @GraphTransaction
public AtlasEntityWithExtInfo getById(String guid) throws AtlasBaseException { public AtlasEntityWithExtInfo getById(String guid) throws AtlasBaseException {
return getById(guid, false);
}
@Override
public AtlasEntityWithExtInfo getById(final String guid, final boolean isMinExtInfo) throws AtlasBaseException {
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
LOG.debug("==> getById({})", guid); LOG.debug("==> getById({}, {})", guid, isMinExtInfo);
} }
AtlasEntityWithExtInfo ret = entityRetriever.toAtlasEntityWithExtInfo(guid); EntityGraphRetriever entityRetriever = new EntityGraphRetriever(typeRegistry);
AtlasAuthorizationUtils.verifyAccess(new AtlasEntityAccessRequest(typeRegistry, AtlasPrivilege.ENTITY_READ, new AtlasEntityHeader(ret.getEntity())), "read entity: guid=", guid); AtlasEntityWithExtInfo ret = entityRetriever.toAtlasEntityWithExtInfo(guid, isMinExtInfo);
if (ret == null) {
throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, guid);
}
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
LOG.debug("<== getById({}): {}", guid, ret); LOG.debug("<== getById({}, {}): {}", guid, isMinExtInfo, ret);
} }
return ret; return ret;
} }
@Override @Override
@GraphTransaction public AtlasEntityHeader getHeaderById(final String guid) throws AtlasBaseException {
public AtlasEntitiesWithExtInfo getByIds(List<String> guids) throws AtlasBaseException {
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
LOG.debug("==> getByIds({})", guids); LOG.debug("==> getHeaderById({})", guid);
} }
AtlasEntitiesWithExtInfo ret = entityRetriever.toAtlasEntitiesWithExtInfo(guids); EntityGraphRetriever entityRetriever = new EntityGraphRetriever(typeRegistry);
// verify authorization to read the entities AtlasEntityHeader ret = entityRetriever.toAtlasEntityHeader(guid);
if(ret != null){
for(String guid : guids){ if (ret == null) {
AtlasEntity entity = ret.getEntity(guid); throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, guid);
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== getHeaderById({}): {}", guid, ret);
}
return ret;
}
AtlasAuthorizationUtils.verifyAccess(new AtlasEntityAccessRequest(typeRegistry, AtlasPrivilege.ENTITY_READ, new AtlasEntityHeader(entity)), "read entity: guid=", guid); @Override
public AtlasEntitiesWithExtInfo getByIds(List<String> guids) throws AtlasBaseException {
return getByIds(guids, false);
} }
@Override
@GraphTransaction
public AtlasEntitiesWithExtInfo getByIds(List<String> guids, boolean isMinExtInfo) throws AtlasBaseException {
if (LOG.isDebugEnabled()) {
LOG.debug("==> getByIds({}, {})", guids, isMinExtInfo);
} }
EntityGraphRetriever entityRetriever = new EntityGraphRetriever(typeRegistry);
AtlasEntitiesWithExtInfo ret = entityRetriever.toAtlasEntitiesWithExtInfo(guids, isMinExtInfo);
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
LOG.debug("<== getByIds({}): {}", guids, ret); LOG.debug("<== getByIds({}, {}): {}", guids, isMinExtInfo, ret);
} }
return ret; return ret;
} }
@Override @Override
public AtlasEntityWithExtInfo getByUniqueAttributes(AtlasEntityType entityType, Map<String, Object> uniqAttributes)
throws AtlasBaseException {
return getByUniqueAttributes(entityType, uniqAttributes, false);
}
@Override
@GraphTransaction @GraphTransaction
public AtlasEntityWithExtInfo getByUniqueAttributes(AtlasEntityType entityType, Map<String, Object> uniqAttributes) throws AtlasBaseException { public AtlasEntityWithExtInfo getByUniqueAttributes(AtlasEntityType entityType, Map<String, Object> uniqAttributes, boolean isMinExtInfo)
throws AtlasBaseException {
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
LOG.debug("==> getByUniqueAttribute({}, {})", entityType.getTypeName(), uniqAttributes); LOG.debug("==> getByUniqueAttribute({}, {})", entityType.getTypeName(), uniqAttributes);
} }
AtlasVertex entityVertex = AtlasGraphUtilsV2.getVertexByUniqueAttributes(entityType, uniqAttributes); AtlasVertex entityVertex = AtlasGraphUtilsV2.getVertexByUniqueAttributes(entityType, uniqAttributes);
AtlasEntityWithExtInfo ret = entityRetriever.toAtlasEntityWithExtInfo(entityVertex);
AtlasAuthorizationUtils.verifyAccess(new AtlasEntityAccessRequest(typeRegistry, AtlasPrivilege.ENTITY_READ, new AtlasEntityHeader(ret.getEntity())), "read entity: typeName=", entityType.getTypeName(), ", uniqueAttributes=", uniqAttributes); EntityGraphRetriever entityRetriever = new EntityGraphRetriever(typeRegistry);
AtlasEntityWithExtInfo ret = entityRetriever.toAtlasEntityWithExtInfo(entityVertex, isMinExtInfo);
if (ret == null) {
throw new AtlasBaseException(AtlasErrorCode.INSTANCE_BY_UNIQUE_ATTRIBUTE_NOT_FOUND, entityType.getTypeName(),
uniqAttributes.toString());
}
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
LOG.debug("<== getByUniqueAttribute({}, {}): {}", entityType.getTypeName(), uniqAttributes, ret); LOG.debug("<== getByUniqueAttribute({}, {}): {}", entityType.getTypeName(), uniqAttributes, ret);
......
...@@ -18,18 +18,15 @@ ...@@ -18,18 +18,15 @@
package org.apache.atlas.web.rest; package org.apache.atlas.web.rest;
import org.apache.atlas.AtlasErrorCode; import org.apache.atlas.AtlasErrorCode;
import org.apache.atlas.EntityAuditEvent;
import org.apache.atlas.model.audit.EntityAuditEventV2;
import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.model.TypeCategory; import org.apache.atlas.model.TypeCategory;
import org.apache.atlas.model.instance.AtlasClassification; import org.apache.atlas.model.instance.AtlasClassification;
import org.apache.atlas.model.instance.AtlasEntity.AtlasEntitiesWithExtInfo; import org.apache.atlas.model.instance.AtlasEntity.AtlasEntitiesWithExtInfo;
import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityWithExtInfo; import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityWithExtInfo;
import org.apache.atlas.model.instance.AtlasEntityHeader;
import org.apache.atlas.model.instance.ClassificationAssociateRequest; import org.apache.atlas.model.instance.ClassificationAssociateRequest;
import org.apache.atlas.model.instance.EntityMutationResponse; import org.apache.atlas.model.instance.EntityMutationResponse;
import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef; import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
import org.apache.atlas.repository.audit.EntityAuditRepository;
import org.apache.atlas.repository.converters.AtlasInstanceConverter;
import org.apache.atlas.repository.store.graph.AtlasEntityStore; import org.apache.atlas.repository.store.graph.AtlasEntityStore;
import org.apache.atlas.repository.store.graph.v2.AtlasEntityStream; import org.apache.atlas.repository.store.graph.v2.AtlasEntityStream;
import org.apache.atlas.repository.store.graph.v2.EntityStream; import org.apache.atlas.repository.store.graph.v2.EntityStream;
...@@ -42,22 +39,12 @@ import org.apache.commons.collections.CollectionUtils; ...@@ -42,22 +39,12 @@ import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils; import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes; import javax.ws.rs.*;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context; import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -74,24 +61,17 @@ import java.util.Map; ...@@ -74,24 +61,17 @@ import java.util.Map;
@Singleton @Singleton
@Service @Service
public class EntityREST { public class EntityREST {
private static final Logger LOG = LoggerFactory.getLogger(EntityREST.class);
private static final Logger PERF_LOG = AtlasPerfTracer.getPerfLogger("rest.EntityREST"); private static final Logger PERF_LOG = AtlasPerfTracer.getPerfLogger("rest.EntityREST");
public static final String PREFIX_ATTR = "attr:"; public static final String PREFIX_ATTR = "attr:";
private final AtlasTypeRegistry typeRegistry; private final AtlasTypeRegistry typeRegistry;
private final AtlasEntityStore entitiesStore; private final AtlasEntityStore entitiesStore;
private final EntityAuditRepository auditRepository;
private final AtlasInstanceConverter instanceConverter;
@Inject @Inject
public EntityREST(AtlasTypeRegistry typeRegistry, AtlasEntityStore entitiesStore, public EntityREST(AtlasTypeRegistry typeRegistry, AtlasEntityStore entitiesStore) {
EntityAuditRepository auditRepository, AtlasInstanceConverter instanceConverter) {
this.typeRegistry = typeRegistry; this.typeRegistry = typeRegistry;
this.entitiesStore = entitiesStore; this.entitiesStore = entitiesStore;
this.auditRepository = auditRepository;
this.instanceConverter = instanceConverter;
} }
/** /**
...@@ -104,17 +84,43 @@ public class EntityREST { ...@@ -104,17 +84,43 @@ public class EntityREST {
@Path("/guid/{guid}") @Path("/guid/{guid}")
@Consumes(Servlets.JSON_MEDIA_TYPE) @Consumes(Servlets.JSON_MEDIA_TYPE)
@Produces(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE)
public AtlasEntityWithExtInfo getById(@PathParam("guid") String guid) throws AtlasBaseException { public AtlasEntityWithExtInfo getById(@PathParam("guid") String guid, @QueryParam("minExtInfo") @DefaultValue("false") boolean minExtInfo) throws AtlasBaseException {
Servlets.validateQueryParamLength("guid", guid); Servlets.validateQueryParamLength("guid", guid);
AtlasPerfTracer perf = null; AtlasPerfTracer perf = null;
try { try {
if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) { if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "EntityREST.getById(" + guid + ")"); perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "EntityREST.getById(" + guid + ", " + minExtInfo + " )");
} }
return entitiesStore.getById(guid); return entitiesStore.getById(guid, minExtInfo);
} finally {
AtlasPerfTracer.log(perf);
}
}
/**
* Get entity header given its GUID.
* @param guid GUID for the entity
* @return AtlasEntity
* @throws AtlasBaseException
*/
@GET
@Path("/guid/{guid}/header")
@Consumes(Servlets.JSON_MEDIA_TYPE)
@Produces(Servlets.JSON_MEDIA_TYPE)
public AtlasEntityHeader getHeaderById(@PathParam("guid") String guid) throws AtlasBaseException {
Servlets.validateQueryParamLength("guid", guid);
AtlasPerfTracer perf = null;
try {
if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "EntityREST.getHeaderById(" + guid + ")");
}
return entitiesStore.getHeaderById(guid);
} finally { } finally {
AtlasPerfTracer.log(perf); AtlasPerfTracer.log(perf);
} }
...@@ -141,7 +147,7 @@ public class EntityREST { ...@@ -141,7 +147,7 @@ public class EntityREST {
@Path("/uniqueAttribute/type/{typeName}") @Path("/uniqueAttribute/type/{typeName}")
@Consumes(Servlets.JSON_MEDIA_TYPE) @Consumes(Servlets.JSON_MEDIA_TYPE)
@Produces(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE)
public AtlasEntityWithExtInfo getByUniqueAttributes(@PathParam("typeName") String typeName, public AtlasEntityWithExtInfo getByUniqueAttributes(@PathParam("typeName") String typeName, @QueryParam("minExtInfo") @DefaultValue("false") boolean minExtInfo,
@Context HttpServletRequest servletRequest) throws AtlasBaseException { @Context HttpServletRequest servletRequest) throws AtlasBaseException {
Servlets.validateQueryParamLength("typeName", typeName); Servlets.validateQueryParamLength("typeName", typeName);
...@@ -158,7 +164,7 @@ public class EntityREST { ...@@ -158,7 +164,7 @@ public class EntityREST {
validateUniqueAttribute(entityType, attributes); validateUniqueAttribute(entityType, attributes);
return entitiesStore.getByUniqueAttributes(entityType, attributes); return entitiesStore.getByUniqueAttributes(entityType, attributes, minExtInfo);
} finally { } finally {
AtlasPerfTracer.log(perf); AtlasPerfTracer.log(perf);
} }
...@@ -585,7 +591,7 @@ public class EntityREST { ...@@ -585,7 +591,7 @@ public class EntityREST {
@Path("/bulk") @Path("/bulk")
@Consumes(Servlets.JSON_MEDIA_TYPE) @Consumes(Servlets.JSON_MEDIA_TYPE)
@Produces(Servlets.JSON_MEDIA_TYPE) @Produces(Servlets.JSON_MEDIA_TYPE)
public AtlasEntitiesWithExtInfo getByGuids(@QueryParam("guid") List<String> guids) throws AtlasBaseException { public AtlasEntitiesWithExtInfo getByGuids(@QueryParam("guid") List<String> guids, @QueryParam("minExtInfo") @DefaultValue("false") boolean minExtInfo) throws AtlasBaseException {
if (CollectionUtils.isNotEmpty(guids)) { if (CollectionUtils.isNotEmpty(guids)) {
for (String guid : guids) { for (String guid : guids) {
Servlets.validateQueryParamLength("guid", guid); Servlets.validateQueryParamLength("guid", guid);
...@@ -603,7 +609,7 @@ public class EntityREST { ...@@ -603,7 +609,7 @@ public class EntityREST {
throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, guids); throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, guids);
} }
return entitiesStore.getByIds(guids); return entitiesStore.getByIds(guids, minExtInfo);
} finally { } finally {
AtlasPerfTracer.log(perf); AtlasPerfTracer.log(perf);
} }
...@@ -693,38 +699,6 @@ public class EntityREST { ...@@ -693,38 +699,6 @@ public class EntityREST {
} }
} }
@GET
@Path("{guid}/audit")
@Consumes(Servlets.JSON_MEDIA_TYPE)
@Produces(Servlets.JSON_MEDIA_TYPE)
public List<EntityAuditEventV2> getAuditEvents(@PathParam("guid") String guid, @QueryParam("startKey") String startKey,
@QueryParam("count") @DefaultValue("100") short count) throws AtlasBaseException {
AtlasPerfTracer perf = null;
try {
if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, "EntityREST.getAuditEvents(" + guid + ", " + startKey + ", " + count + ")");
}
List events = auditRepository.listEvents(guid, startKey, count);
List<EntityAuditEventV2> ret = new ArrayList<>();
for (Object event : events) {
if (event instanceof EntityAuditEventV2) {
ret.add((EntityAuditEventV2) event);
} else if (event instanceof EntityAuditEvent) {
ret.add(instanceConverter.toV2AuditEvent((EntityAuditEvent) event));
} else {
LOG.warn("unknown entity-audit event type {}. Ignored", event != null ? event.getClass().getCanonicalName() : "null");
}
}
return ret;
} finally {
AtlasPerfTracer.log(perf);
}
}
private AtlasEntityType ensureEntityType(String typeName) throws AtlasBaseException { private AtlasEntityType ensureEntityType(String typeName) throws AtlasBaseException {
AtlasEntityType ret = typeRegistry.getEntityTypeByName(typeName); AtlasEntityType ret = typeRegistry.getEntityTypeByName(typeName);
......
...@@ -165,7 +165,7 @@ public class TestEntitiesREST { ...@@ -165,7 +165,7 @@ public class TestEntitiesREST {
@Test(dependsOnMethods = "testCreateOrUpdateEntities") @Test(dependsOnMethods = "testCreateOrUpdateEntities")
public void testGetEntities() throws Exception { public void testGetEntities() throws Exception {
final AtlasEntitiesWithExtInfo response = entityREST.getByGuids(createdGuids); final AtlasEntitiesWithExtInfo response = entityREST.getByGuids(createdGuids, false);
final List<AtlasEntity> entities = response.getEntities(); final List<AtlasEntity> entities = response.getEntities();
Assert.assertNotNull(entities); Assert.assertNotNull(entities);
......
...@@ -99,7 +99,7 @@ public class TestEntityREST { ...@@ -99,7 +99,7 @@ public class TestEntityREST {
@Test @Test
public void testGetEntityById() throws Exception { public void testGetEntityById() throws Exception {
createTestEntity(); createTestEntity();
AtlasEntityWithExtInfo response = entityREST.getById(dbEntity.getGuid()); AtlasEntityWithExtInfo response = entityREST.getById(dbEntity.getGuid(), false);
Assert.assertNotNull(response); Assert.assertNotNull(response);
Assert.assertNotNull(response.getEntity()); Assert.assertNotNull(response.getEntity());
...@@ -183,7 +183,7 @@ public class TestEntityREST { ...@@ -183,7 +183,7 @@ public class TestEntityREST {
@Test(dependsOnMethods = "testAddAndGetClassification") @Test(dependsOnMethods = "testAddAndGetClassification")
public void testGetEntityWithAssociations() throws Exception { public void testGetEntityWithAssociations() throws Exception {
AtlasEntityWithExtInfo entity = entityREST.getById(dbEntity.getGuid()); AtlasEntityWithExtInfo entity = entityREST.getById(dbEntity.getGuid(), false);
final List<AtlasClassification> retrievedClassifications = entity.getEntity().getClassifications(); final List<AtlasClassification> retrievedClassifications = entity.getEntity().getClassifications();
Assert.assertNotNull(retrievedClassifications); Assert.assertNotNull(retrievedClassifications);
...@@ -315,7 +315,7 @@ public class TestEntityREST { ...@@ -315,7 +315,7 @@ public class TestEntityREST {
Assert.assertEquals(response.getEntitiesByOperation(EntityMutations.EntityOperation.PARTIAL_UPDATE).get(0).getGuid(), dbGuid); Assert.assertEquals(response.getEntitiesByOperation(EntityMutations.EntityOperation.PARTIAL_UPDATE).get(0).getGuid(), dbGuid);
//Get By unique attribute //Get By unique attribute
AtlasEntityWithExtInfo entity = entityREST.getByUniqueAttributes(TestUtilsV2.DATABASE_TYPE, toHttpServletRequest(TestUtilsV2.NAME, updatedDBName)); AtlasEntityWithExtInfo entity = entityREST.getByUniqueAttributes(TestUtilsV2.DATABASE_TYPE, false, toHttpServletRequest(TestUtilsV2.NAME, updatedDBName));
Assert.assertNotNull(entity); Assert.assertNotNull(entity);
Assert.assertNotNull(entity.getEntity().getGuid()); Assert.assertNotNull(entity.getEntity().getGuid());
Assert.assertEquals(entity.getEntity().getGuid(), dbGuid); Assert.assertEquals(entity.getEntity().getGuid(), dbGuid);
...@@ -340,7 +340,7 @@ public class TestEntityREST { ...@@ -340,7 +340,7 @@ public class TestEntityREST {
Assert.assertEquals(response.getEntitiesByOperation(EntityMutations.EntityOperation.PARTIAL_UPDATE).get(0).getGuid(), dbGuid); Assert.assertEquals(response.getEntitiesByOperation(EntityMutations.EntityOperation.PARTIAL_UPDATE).get(0).getGuid(), dbGuid);
//Get By unique attribute //Get By unique attribute
AtlasEntityWithExtInfo entity = entityREST.getByUniqueAttributes(TestUtilsV2.DATABASE_TYPE, toHttpServletRequest(TestUtilsV2.NAME, updatedDBName)); AtlasEntityWithExtInfo entity = entityREST.getByUniqueAttributes(TestUtilsV2.DATABASE_TYPE, false, toHttpServletRequest(TestUtilsV2.NAME, updatedDBName));
Assert.assertNotNull(entity); Assert.assertNotNull(entity);
Assert.assertNotNull(entity.getEntity().getGuid()); Assert.assertNotNull(entity.getEntity().getGuid());
Assert.assertEquals(entity.getEntity().getGuid(), dbGuid); Assert.assertEquals(entity.getEntity().getGuid(), dbGuid);
......
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