This is an automated email from the ASF dual-hosted git repository.
sarath pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/atlas.git
The following commit(s) were added to refs/heads/master by this push:
new 1e0962d ATLAS-3549 Add a new REST endpoint to get EntityHeader using
unique attributes
1e0962d is described below
commit 1e0962d70008cccfb9d4f1db624963faa74d0c19
Author: Mandar Ambawane <[email protected]>
AuthorDate: Thu Dec 5 19:36:13 2019 +0530
ATLAS-3549 Add a new REST endpoint to get EntityHeader using unique
attributes
Signed-off-by: Sarath Subramanian <[email protected]>
---
.../repository/store/graph/AtlasEntityStore.java | 3 ++
.../store/graph/v2/AtlasEntityStoreV2.java | 27 ++++++++++++
.../java/org/apache/atlas/web/rest/EntityREST.java | 41 ++++++++++++++++++
.../apache/atlas/web/adapters/TestEntityREST.java | 49 ++++++++++++++++++++++
4 files changed, 120 insertions(+)
diff --git
a/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java
b/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java
index 49dd5c5..928c70d 100644
---
a/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java
+++
b/repository/src/main/java/org/apache/atlas/repository/store/graph/AtlasEntityStore.java
@@ -72,6 +72,9 @@ public interface AtlasEntityStore {
*/
AtlasEntityHeader getHeaderById(String guid) throws AtlasBaseException;
+
+ public AtlasEntityHeader getEntityHeaderByUniqueAttributes(AtlasEntityType
entityType, Map<String, Object> uniqAttributes) throws AtlasBaseException;
+
/**
* Batch GET to retrieve entities by their ID
* @param guid
diff --git
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java
b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java
index c8e65ef..bc4cc8b 100644
---
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java
+++
b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasEntityStoreV2.java
@@ -264,6 +264,33 @@ public class AtlasEntityStoreV2 implements
AtlasEntityStore {
return ret;
}
+ @Override
+ @GraphTransaction
+ public AtlasEntityHeader getEntityHeaderByUniqueAttributes(AtlasEntityType
entityType, Map<String, Object> uniqAttributes) throws AtlasBaseException {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("==> getEntityHeaderByUniqueAttributes({}, {})",
entityType.getTypeName(), uniqAttributes);
+ }
+
+ AtlasVertex entityVertex =
AtlasGraphUtilsV2.getVertexByUniqueAttributes(entityType, uniqAttributes);
+
+ EntityGraphRetriever entityRetriever = new
EntityGraphRetriever(typeRegistry);
+
+ AtlasEntityHeader ret =
entityRetriever.toAtlasEntityHeader(entityVertex);
+
+ if (ret == null) {
+ throw new
AtlasBaseException(AtlasErrorCode.INSTANCE_BY_UNIQUE_ATTRIBUTE_NOT_FOUND,
entityType.getTypeName(),
+ uniqAttributes.toString());
+ }
+
+ AtlasAuthorizationUtils.verifyAccess(new
AtlasEntityAccessRequest(typeRegistry, AtlasPrivilege.ENTITY_READ, ret), "read
entity: typeName=", entityType.getTypeName(), ", uniqueAttributes=",
uniqAttributes);
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("<== getEntityHeaderByUniqueAttributes({}, {}): {}",
entityType.getTypeName(), uniqAttributes, ret);
+ }
+
+ return ret;
+ }
+
/**
* Check state of entities in the store
* @param request AtlasCheckStateRequest
diff --git a/webapp/src/main/java/org/apache/atlas/web/rest/EntityREST.java
b/webapp/src/main/java/org/apache/atlas/web/rest/EntityREST.java
index 33f4828..6845121 100644
--- a/webapp/src/main/java/org/apache/atlas/web/rest/EntityREST.java
+++ b/webapp/src/main/java/org/apache/atlas/web/rest/EntityREST.java
@@ -149,6 +149,47 @@ public class EntityREST {
}
/**
+ * Fetch AtlasEntityHeader given its type and unique attribute.
+ *
+ * In addition to the typeName path parameter, attribute key-value pair(s)
can be provided in the following format
+ *
+ * attr:<attrName>=<attrValue>
+ *
+ * NOTE: The attrName and attrValue should be unique across entities, eg.
qualifiedName
+ *
+ * The REST request would look something like this
+ *
+ * GET
/v2/entity/uniqueAttribute/type/aType/header?attr:aTypeAttribute=someValue
+ *
+ * @param typeName
+ * @return AtlasEntityHeader
+ * @throws AtlasBaseException
+ */
+ @GET
+ @Path("/uniqueAttribute/type/{typeName}/header")
+ public AtlasEntityHeader
getEntityHeaderByUniqueAttributes(@PathParam("typeName") String typeName,
+ @Context
HttpServletRequest servletRequest) throws AtlasBaseException {
+ Servlets.validateQueryParamLength("typeName", typeName);
+
+ AtlasPerfTracer perf = null;
+
+ try {
+ Map<String, Object> attributes = getAttributes(servletRequest);
+ if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
+ perf = AtlasPerfTracer.getPerfTracer(PERF_LOG,
"EntityREST.getEntityHeaderByUniqueAttributes(" + typeName + "," + attributes +
")");
+ }
+
+ AtlasEntityType entityType = ensureEntityType(typeName);
+
+ validateUniqueAttribute(entityType, attributes);
+
+ return entitiesStore.getEntityHeaderByUniqueAttributes(entityType,
attributes);
+ } finally {
+ AtlasPerfTracer.log(perf);
+ }
+ }
+
+ /**
* Fetch complete definition of an entity given its type and unique
attribute.
*
* In addition to the typeName path parameter, attribute key-value pair(s)
can be provided in the following format
diff --git
a/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java
b/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java
index b747124..9584f99 100644
--- a/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java
+++ b/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java
@@ -110,6 +110,55 @@ public class TestEntityREST {
TestEntitiesREST.verifyAttributes(response.getEntity().getAttributes(),
dbEntity.getAttributes());
}
+ @Test
+ public void testGetEntityHeaderByUniqueAttributes() throws Exception {
+ createTestEntity();
+
+ String[] attrVal = {String.valueOf(dbEntity.getAttribute("name"))};
+
+ Map<String, String[]> paramMap = new HashMap<>();
+ paramMap.put("attr:name", attrVal);
+
+ HttpServletRequest mockRequest =
Mockito.mock(HttpServletRequest.class);
+ Mockito.when(mockRequest.getParameterMap()).thenReturn(paramMap);
+
+ AtlasEntityHeader response =
entityREST.getEntityHeaderByUniqueAttributes(dbEntity.getTypeName(),
mockRequest);
+
+ Assert.assertNotNull(response);
+ Assert.assertEquals(dbEntity.getAttribute("name"),
response.getAttribute("name"));
+ Assert.assertEquals(dbEntity.getAttribute("description"),
response.getAttribute("description"));
+ }
+
+ @Test(expectedExceptions = AtlasBaseException.class)
+ public void testGetEntityHeaderByUniqueAttributes_2() throws Exception {
+ createTestEntity();
+
+ String[] attrVal = {String.valueOf(dbEntity.getAttribute("name") +
"_2")};
+
+ Map<String, String[]> paramMap = new HashMap<>();
+ paramMap.put("attr:name", attrVal);
+
+ HttpServletRequest mockRequest =
Mockito.mock(HttpServletRequest.class);
+ Mockito.when(mockRequest.getParameterMap()).thenReturn(paramMap);
+
+ entityREST.getEntityHeaderByUniqueAttributes(dbEntity.getTypeName(),
mockRequest);
+ }
+
+ @Test(expectedExceptions = AtlasBaseException.class)
+ public void testGetEntityHeaderByUniqueAttributes_3() throws Exception {
+ createTestEntity();
+
+ String[] attrVal =
{String.valueOf(dbEntity.getAttribute("description"))};
+
+ Map<String, String[]> paramMap = new HashMap<>();
+ paramMap.put("attr:description", attrVal);
+
+ HttpServletRequest mockRequest =
Mockito.mock(HttpServletRequest.class);
+ Mockito.when(mockRequest.getParameterMap()).thenReturn(paramMap);
+
+ entityREST.getEntityHeaderByUniqueAttributes(dbEntity.getTypeName(),
mockRequest);
+ }
+
@Test(dependsOnMethods = "testGetEntityById")
public void testAddAndGetClassification() throws Exception {