This is an automated email from the ASF dual-hosted git repository.

madhan 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 9d4380e  ATLAS-3110: added REST API to get multiple entities given 
their unique attribute values
9d4380e is described below

commit 9d4380e0f32ab47ba51eba89d514be3968a3bd86
Author: Ayush Nigam <ayushmn...@gmail.com>
AuthorDate: Wed Apr 10 21:50:59 2019 -0700

    ATLAS-3110: added REST API to get multiple entities given their unique 
attribute values
    
    Signed-off-by: Madhan Neethiraj <mad...@apache.org>
---
 .../main/java/org/apache/atlas/AtlasClientV2.java  | 50 +++++++++---
 .../repository/store/graph/AtlasEntityStore.java   | 11 +++
 .../store/graph/v2/AtlasEntityStoreV2.java         | 24 ++++++
 .../store/graph/v2/EntityGraphRetriever.java       | 31 +++++++-
 .../java/org/apache/atlas/web/rest/EntityREST.java | 92 +++++++++++++++++++++-
 .../org/apache/atlas/examples/QuickStartV2IT.java  | 38 ++++++---
 6 files changed, 220 insertions(+), 26 deletions(-)

diff --git a/client/client-v2/src/main/java/org/apache/atlas/AtlasClientV2.java 
b/client/client-v2/src/main/java/org/apache/atlas/AtlasClientV2.java
index a5ef34b..c7ce5a9 100644
--- a/client/client-v2/src/main/java/org/apache/atlas/AtlasClientV2.java
+++ b/client/client-v2/src/main/java/org/apache/atlas/AtlasClientV2.java
@@ -27,7 +27,6 @@ import org.apache.atlas.model.instance.AtlasClassification;
 import 
org.apache.atlas.model.instance.AtlasClassification.AtlasClassifications;
 import org.apache.atlas.model.instance.AtlasEntity.AtlasEntitiesWithExtInfo;
 import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityWithExtInfo;
-import org.apache.atlas.model.instance.AtlasEntityHeader;
 import org.apache.atlas.model.instance.AtlasRelationship;
 import org.apache.atlas.model.instance.AtlasEntityHeaders;
 import org.apache.atlas.model.instance.EntityMutationResponse;
@@ -56,6 +55,7 @@ public class AtlasClientV2 extends AtlasBaseClient {
     // Entity APIs
     public static final  String ENTITY_API           = BASE_URI + "v2/entity/";
     private static final String PREFIX_ATTR          = "attr:";
+    private static final String PREFIX_ATTR_         = "attr_";
     private static final String TYPEDEFS_API         = TYPES_API + "typedefs/";
     private static final String TYPEDEF_BY_NAME      = TYPES_API + 
"typedef/name/";
     private static final String TYPEDEF_BY_GUID      = TYPES_API + 
"typedef/guid/";
@@ -271,12 +271,12 @@ public class AtlasClientV2 extends AtlasBaseClient {
         return callAPI(API_V2.GET_ENTITY_BY_GUID, 
AtlasEntityWithExtInfo.class, queryParams, guid);
     }
 
-    public AtlasEntityWithExtInfo getEntityByAttribute(String type, 
Map<String, String> attributes) throws AtlasServiceException {
-        return getEntityByAttribute(type, attributes, false, false);
+    public AtlasEntityWithExtInfo getEntityByAttribute(String type, 
Map<String, String> uniqAttributes) throws AtlasServiceException {
+        return getEntityByAttribute(type, uniqAttributes, false, false);
     }
 
-    public AtlasEntityWithExtInfo getEntityByAttribute(String type, 
Map<String, String> attributes, boolean minExtInfo, boolean ignoreRelationship) 
throws AtlasServiceException {
-        MultivaluedMap<String, String> queryParams = 
attributesToQueryParams(attributes);
+    public AtlasEntityWithExtInfo getEntityByAttribute(String type, 
Map<String, String> uniqAttributes, boolean minExtInfo, boolean 
ignoreRelationship) throws AtlasServiceException {
+        MultivaluedMap<String, String> queryParams = 
attributesToQueryParams(uniqAttributes);
 
         queryParams.add("minExtInfo", String.valueOf(minExtInfo));
         queryParams.add("ignoreRelationships", 
String.valueOf(ignoreRelationship));
@@ -284,17 +284,31 @@ public class AtlasClientV2 extends AtlasBaseClient {
         return callAPI(API_V2.GET_ENTITY_BY_ATTRIBUTE, 
AtlasEntityWithExtInfo.class, queryParams, type);
     }
 
-    public EntityMutationResponse updateEntityByAttribute(String type, 
Map<String, String> attributes, AtlasEntityWithExtInfo entityInfo)
+    public AtlasEntitiesWithExtInfo getEntitiesByAttribute(String type, 
List<Map<String,String>> uniqAttributesList) throws AtlasServiceException {
+        return getEntitiesByAttribute(type, uniqAttributesList, false, false);
+    }
+
+    public AtlasEntitiesWithExtInfo getEntitiesByAttribute(String type, 
List<Map<String, String>> uniqAttributesList, boolean minExtInfo, boolean 
ignoreRelationship) throws AtlasServiceException {
+        MultivaluedMap<String, String> queryParams = 
attributesToQueryParams(uniqAttributesList, null);
+
+        queryParams.add("minExtInfo", String.valueOf(minExtInfo));
+        queryParams.add("ignoreRelationships", 
String.valueOf(ignoreRelationship));
+
+        return callAPI(API_V2.GET_ENTITIES_BY_ATTRIBUTES, 
AtlasEntitiesWithExtInfo.class, queryParams, type);
+    }
+
+
+    public EntityMutationResponse updateEntityByAttribute(String type, 
Map<String, String> uniqAttributes, AtlasEntityWithExtInfo entityInfo)
             throws AtlasServiceException {
-        MultivaluedMap<String, String> queryParams = 
attributesToQueryParams(attributes);
+        MultivaluedMap<String, String> queryParams = 
attributesToQueryParams(uniqAttributes);
 
         return callAPI(API_V2.UPDATE_ENTITY_BY_ATTRIBUTE, 
EntityMutationResponse.class, entityInfo, queryParams, type);
     }
 
     /* Lineage Calls  */
 
-    public EntityMutationResponse deleteEntityByAttribute(String type, 
Map<String, String> attributes) throws AtlasServiceException {
-        MultivaluedMap<String, String> queryParams = 
attributesToQueryParams(attributes);
+    public EntityMutationResponse deleteEntityByAttribute(String type, 
Map<String, String> uniqAttributes) throws AtlasServiceException {
+        MultivaluedMap<String, String> queryParams = 
attributesToQueryParams(uniqAttributes);
 
         return callAPI(API_V2.DELETE_ENTITY_BY_ATTRIBUTE, 
EntityMutationResponse.class, queryParams, type);
     }
@@ -462,6 +476,23 @@ public class AtlasClientV2 extends AtlasBaseClient {
         return queryParams;
     }
 
+    private MultivaluedMap<String, String> 
attributesToQueryParams(List<Map<String, String>>      attributesList,
+                                                                   
MultivaluedMap<String, String> queryParams) {
+        if (queryParams == null) {
+            queryParams = new MultivaluedMapImpl();
+        }
+
+        for (int i = 0; i < attributesList.size(); i++) {
+            Map<String, String> attributes = attributesList.get(i);
+
+            for (Map.Entry<String, String> entry : attributes.entrySet()) {
+                queryParams.putSingle(PREFIX_ATTR_ + i + ":" + entry.getKey(), 
entry.getValue());
+            }
+        }
+
+        return queryParams;
+    }
+
     private <T> T getTypeDefByName(final String name, Class<T> typeDefClass) 
throws AtlasServiceException {
         String atlasPath = getAtlasPath(typeDefClass);
         API    api       = new API(String.format(GET_BY_NAME_TEMPLATE, 
atlasPath, name), HttpMethod.GET, Response.Status.OK);
@@ -502,6 +533,7 @@ public class AtlasClientV2 extends AtlasBaseClient {
         public static final API_V2 UPDATE_ENTITY_BY_ATTRIBUTE  = new 
API_V2(ENTITY_API + "uniqueAttribute/type/", HttpMethod.PUT, 
Response.Status.OK);
         public static final API_V2 DELETE_ENTITY_BY_GUID       = new 
API_V2(ENTITY_API + "guid/", HttpMethod.DELETE, Response.Status.OK);
         public static final API_V2 DELETE_ENTITY_BY_ATTRIBUTE  = new 
API_V2(ENTITY_API + "uniqueAttribute/type/", HttpMethod.DELETE, 
Response.Status.OK);
+        public static final API_V2 GET_ENTITIES_BY_ATTRIBUTES  = new 
API_V2(ENTITY_BULK_API + "uniqueAttribute/type/", HttpMethod.GET, 
Response.Status.OK);
         public static final API_V2 GET_ENTITIES_BY_GUIDS       = new 
API_V2(ENTITY_BULK_API, HttpMethod.GET, Response.Status.OK);
         public static final API_V2 CREATE_ENTITIES             = new 
API_V2(ENTITY_BULK_API, HttpMethod.POST, Response.Status.OK);
         public static final API_V2 UPDATE_ENTITIES             = new 
API_V2(ENTITY_BULK_API, HttpMethod.POST, Response.Status.OK);
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 74c19e2..01b8d19 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
@@ -89,6 +89,17 @@ public interface AtlasEntityStore {
     AtlasEntitiesWithExtInfo getByIds(List<String> guid, boolean isMinExtInfo, 
boolean ignoreRelationships) throws AtlasBaseException;
 
     /**
+     * Batch GET to retrieve entities by their uniqueIds
+     * @param entityType
+     * @param uniqueAttributes
+     * @param isMinExtInfo
+     * @param ignoreRelationships
+     * @return
+     * @throws AtlasBaseException
+     */
+    AtlasEntitiesWithExtInfo getEntitiesByUniqueAttributes(AtlasEntityType 
entityType, List<Map<String, Object>> uniqueAttributes, boolean isMinExtInfo, 
boolean ignoreRelationships) throws AtlasBaseException;
+
+    /**
      *
      * Get an eneity by its unique attribute
      * @param entityType     type of the entity
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 a74eded..bf90df1 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
@@ -189,6 +189,30 @@ public class AtlasEntityStoreV2 implements 
AtlasEntityStore {
 
     @Override
     @GraphTransaction
+    public AtlasEntitiesWithExtInfo 
getEntitiesByUniqueAttributes(AtlasEntityType entityType, List<Map<String, 
Object>> uniqueAttributes , boolean isMinExtInfo, boolean ignoreRelationships) 
throws AtlasBaseException {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("==> getEntitiesByUniqueAttributes({}, {})", 
entityType.getTypeName(), uniqueAttributes);
+        }
+
+        EntityGraphRetriever entityRetriever = new 
EntityGraphRetriever(typeRegistry, ignoreRelationships);
+
+        AtlasEntitiesWithExtInfo ret = 
entityRetriever.getEntitiesByUniqueAttributes(entityType.getTypeName(), 
uniqueAttributes, isMinExtInfo);
+
+        if (ret != null && ret.getEntities() != null) {
+            for (AtlasEntity entity : ret.getEntities()) {
+                AtlasAuthorizationUtils.verifyAccess(new 
AtlasEntityAccessRequest(typeRegistry, AtlasPrivilege.ENTITY_READ, new 
AtlasEntityHeader(entity)), "read entity: typeName=", entityType.getTypeName(), 
", guid=", entity.getGuid());
+            }
+        }
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("<== getEntitiesByUniqueAttributes({}, {}): {}", 
entityType.getTypeName(), uniqueAttributes, ret);
+        }
+
+        return ret;
+    }
+
+    @Override
+    @GraphTransaction
     public AtlasEntityWithExtInfo getByUniqueAttributes(AtlasEntityType 
entityType, Map<String, Object> uniqAttributes)
             throws AtlasBaseException {
         return getByUniqueAttributes(entityType, uniqAttributes, false, false);
diff --git 
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/EntityGraphRetriever.java
 
b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/EntityGraphRetriever.java
index 764b1e5..5aa6c8f 100644
--- 
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/EntityGraphRetriever.java
+++ 
b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/EntityGraphRetriever.java
@@ -35,7 +35,6 @@ import org.apache.atlas.model.instance.AtlasRelationship;
 import 
org.apache.atlas.model.instance.AtlasRelationship.AtlasRelationshipWithExtInfo;
 import org.apache.atlas.model.instance.AtlasStruct;
 import org.apache.atlas.model.typedef.AtlasRelationshipDef;
-import org.apache.atlas.model.typedef.AtlasRelationshipDef.PropagateTags;
 import org.apache.atlas.model.typedef.AtlasRelationshipEndDef;
 import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
 import org.apache.atlas.repository.Constants;
@@ -45,7 +44,6 @@ import org.apache.atlas.repository.graphdb.AtlasEdgeDirection;
 import org.apache.atlas.repository.graphdb.AtlasElement;
 import org.apache.atlas.repository.graphdb.AtlasVertex;
 import org.apache.atlas.type.AtlasArrayType;
-import org.apache.atlas.type.AtlasClassificationType;
 import org.apache.atlas.type.AtlasEntityType;
 import org.apache.atlas.type.AtlasMapType;
 import org.apache.atlas.type.AtlasRelationshipType;
@@ -119,8 +117,6 @@ import static 
org.apache.atlas.repository.graph.GraphHelper.getPrimitiveMap;
 import static org.apache.atlas.repository.graph.GraphHelper.getReferenceMap;
 import static 
org.apache.atlas.repository.graph.GraphHelper.getOutGoingEdgesByLabel;
 import static org.apache.atlas.repository.graph.GraphHelper.getPropagateTags;
-import static 
org.apache.atlas.repository.graph.GraphHelper.getPropagatedClassificationEdge;
-import static 
org.apache.atlas.repository.graph.GraphHelper.getPropagationEnabledClassificationVertices;
 import static 
org.apache.atlas.repository.graph.GraphHelper.getRelationshipGuid;
 import static 
org.apache.atlas.repository.graph.GraphHelper.getRemovePropagations;
 import static org.apache.atlas.repository.graph.GraphHelper.getTypeName;
@@ -375,6 +371,33 @@ public class EntityGraphRetriever {
         return ret;
     }
 
+    public AtlasEntitiesWithExtInfo getEntitiesByUniqueAttributes(String 
typeName, List<Map<String, Object>> uniqueAttributesList, boolean isMinExtInfo) 
throws AtlasBaseException {
+        AtlasEntitiesWithExtInfo ret        = new AtlasEntitiesWithExtInfo();
+        AtlasEntityType          entityType = 
typeRegistry.getEntityTypeByName(typeName);
+
+        if (entityType != null) {
+            for (Map<String, Object> uniqAttributes : uniqueAttributesList) {
+                try {
+                    AtlasVertex vertex = 
AtlasGraphUtilsV2.getVertexByUniqueAttributes(entityType, uniqAttributes);
+
+                    if (vertex != null) {
+                        AtlasEntity entity = mapVertexToAtlasEntity(vertex, 
ret, isMinExtInfo);
+
+                        ret.addEntity(entity);
+                    }
+                } catch(AtlasBaseException e) {
+                    if (e.getAtlasErrorCode() != 
AtlasErrorCode.INSTANCE_BY_UNIQUE_ATTRIBUTE_NOT_FOUND) {
+                        throw e;
+                    }
+                }
+            }
+        }
+
+        ret.compact();
+
+        return ret;
+    }
+
     private AtlasVertex getEntityVertex(AtlasObjectId objId) throws 
AtlasBaseException {
         AtlasVertex ret = null;
 
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 2c21773..f4abd7f 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
@@ -81,7 +81,9 @@ public class EntityREST {
     private static final Logger LOG      = 
LoggerFactory.getLogger(EntityREST.class);
     private static final Logger PERF_LOG = 
AtlasPerfTracer.getPerfLogger("rest.EntityREST");
 
-    public static final String PREFIX_ATTR = "attr:";
+    public static final String PREFIX_ATTR  = "attr:";
+    public static final String PREFIX_ATTR_ = "attr_";
+
 
     private final AtlasTypeRegistry      typeRegistry;
     private final AtlasEntityStore       entitiesStore;
@@ -159,6 +161,8 @@ public class EntityREST {
      * GET /v2/entity/uniqueAttribute/type/aType?attr:aTypeAttribute=someValue
      *
      * @param typeName
+     * @param minExtInfo
+     * @param ignoreRelationships
      * @return AtlasEntityWithExtInfo
      * @throws AtlasBaseException
      */
@@ -582,6 +586,54 @@ public class EntityREST {
     /******************************************************************/
 
     /**
+     * Bulk API to retrieve list of entities identified by its unique 
attributes.
+     *
+     * In addition to the typeName path parameter, attribute key-value pair(s) 
can be provided in the following format
+     *
+     * 
typeName=<typeName>&attr_1:<attrName>=<attrValue>&attr_2:<attrName>=<attrValue>&attr_3:<attrName>=<attrValue>
+     *
+     * NOTE: The attrName should be an unique attribute for the given 
entity-type
+     *
+     * The REST request would look something like this
+     *
+     * GET 
/v2/entity/bulk/uniqueAttribute/type/hive_db?attrs_0:qualifiedName=db1@cl1&attrs_2:qualifiedName=db2@cl1
+     *
+     * @param typeName
+     * @param minExtInfo
+     * @param ignoreRelationships
+     * @return AtlasEntitiesWithExtInfo
+     * @throws AtlasBaseException
+     */
+    @GET
+    @Path("/bulk/uniqueAttribute/type/{typeName}")
+    public AtlasEntitiesWithExtInfo 
getEntitiesByUniqueAttributes(@PathParam("typeName") String typeName,
+                                                                  
@QueryParam("minExtInfo") @DefaultValue("false") boolean minExtInfo,
+                                                                  
@QueryParam("ignoreRelationships") @DefaultValue("false") boolean 
ignoreRelationships,
+                                                                  @Context 
HttpServletRequest servletRequest) throws AtlasBaseException {
+        Servlets.validateQueryParamLength("typeName", typeName);
+
+        AtlasPerfTracer perf = null;
+
+        try {
+            List<Map<String, Object>> uniqAttributesList = 
getAttributesList(servletRequest);
+
+            if (AtlasPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
+                perf = AtlasPerfTracer.getPerfTracer(PERF_LOG, 
"EntityREST.getEntitiesByUniqueAttributes(" + typeName + "," + 
uniqAttributesList + ")");
+            }
+
+            AtlasEntityType entityType = ensureEntityType(typeName);
+
+            for (Map<String, Object> uniqAttributes : uniqAttributesList) {
+                validateUniqueAttribute(entityType, uniqAttributes);
+            }
+
+            return entitiesStore.getEntitiesByUniqueAttributes(entityType, 
uniqAttributesList, minExtInfo, ignoreRelationships);
+        } finally {
+            AtlasPerfTracer.log(perf);
+        }
+    }
+
+    /**
      * Bulk API to retrieve list of entities identified by its GUIDs.
      */
     @GET
@@ -781,6 +833,7 @@ public class EntityREST {
         return ret;
     }
 
+    // attr:qualifiedName=db1@cl1 ==> { qualifiedName:db1@cl1 }
     private Map<String, Object> getAttributes(HttpServletRequest request) {
         Map<String, Object> attributes = new HashMap<>();
 
@@ -800,6 +853,43 @@ public class EntityREST {
         return attributes;
     }
 
+    // attrs_1:qualifiedName=db1@cl1&attrs_2:qualifiedName=db2@cl1 ==> [ { 
qualifiedName:db1@cl1 }, { qualifiedName:db2@cl1 } ]
+    private List<Map<String, Object>> getAttributesList(HttpServletRequest 
request) {
+        Map<String, Map<String, Object>> ret = new HashMap<>();
+
+        if (MapUtils.isNotEmpty(request.getParameterMap())) {
+            for (Map.Entry<String, String[]> entry : 
request.getParameterMap().entrySet()) {
+                String key = entry.getKey();
+
+                if (key == null || !key.startsWith(PREFIX_ATTR_)) {
+                    continue;
+                }
+
+                int      sepPos = key.indexOf(':', PREFIX_ATTR_.length());
+                String[] values = entry.getValue();
+                String   value  = values != null && values.length > 0 ? 
values[0] : null;
+
+                if (sepPos == -1 || value == null) {
+                    continue;
+                }
+
+                String              attrName   = key.substring(sepPos + 1);
+                String              listIdx    = 
key.substring(PREFIX_ATTR_.length(), sepPos);
+                Map<String, Object> attributes = ret.get(listIdx);
+
+                if (attributes == null) {
+                    attributes = new HashMap<>();
+
+                    ret.put(listIdx, attributes);
+                }
+
+                attributes.put(attrName, value);
+            }
+        }
+
+        return new ArrayList<>(ret.values());
+    }
+
     /**
      * Validate that each attribute given is an unique attribute
      * @param entityType the entity type
diff --git a/webapp/src/test/java/org/apache/atlas/examples/QuickStartV2IT.java 
b/webapp/src/test/java/org/apache/atlas/examples/QuickStartV2IT.java
index 496a0e2..c65f6d3 100644
--- a/webapp/src/test/java/org/apache/atlas/examples/QuickStartV2IT.java
+++ b/webapp/src/test/java/org/apache/atlas/examples/QuickStartV2IT.java
@@ -23,6 +23,7 @@ import org.apache.atlas.model.instance.AtlasClassification;
 import 
org.apache.atlas.model.instance.AtlasClassification.AtlasClassifications;
 import org.apache.atlas.model.instance.AtlasEntity;
 import org.apache.atlas.model.instance.AtlasEntityHeader;
+import org.apache.atlas.model.instance.AtlasEntity.AtlasEntitiesWithExtInfo;
 import org.apache.atlas.model.lineage.AtlasLineageInfo;
 import org.apache.atlas.model.lineage.AtlasLineageInfo.LineageDirection;
 import org.apache.atlas.model.lineage.AtlasLineageInfo.LineageRelation;
@@ -31,24 +32,14 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
 import static org.apache.atlas.AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME;
-import static org.apache.atlas.examples.QuickStartV2.CLUSTER_SUFFIX;
-import static org.apache.atlas.examples.QuickStartV2.LOAD_PROCESS_TYPE;
-import static org.apache.atlas.examples.QuickStartV2.LOAD_SALES_DAILY_PROCESS;
-import static 
org.apache.atlas.examples.QuickStartV2.LOAD_SALES_MONTHLY_PROCESS;
-import static org.apache.atlas.examples.QuickStartV2.PRODUCT_DIM_TABLE;
-import static org.apache.atlas.examples.QuickStartV2.PRODUCT_DIM_VIEW;
-import static org.apache.atlas.examples.QuickStartV2.SALES_DB;
-import static org.apache.atlas.examples.QuickStartV2.SALES_FACT_DAILY_MV_TABLE;
-import static 
org.apache.atlas.examples.QuickStartV2.SALES_FACT_MONTHLY_MV_TABLE;
-import static org.apache.atlas.examples.QuickStartV2.SALES_FACT_TABLE;
-import static org.apache.atlas.examples.QuickStartV2.TIME_DIM_TABLE;
-import static org.apache.atlas.examples.QuickStartV2.VIEW_TYPE;
+import static org.apache.atlas.examples.QuickStartV2.*;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.AssertJUnit.assertTrue;
@@ -91,6 +82,19 @@ public class QuickStartV2IT extends BaseResourceIT {
         verifyTrait(table);
     }
 
+    @Test
+    public void testTablesAreAdded2() throws AtlasServiceException {
+        List<String> tableNames = Arrays.asList(SALES_FACT_TABLE, 
PRODUCT_DIM_TABLE, CUSTOMER_DIM_TABLE,
+                                                TIME_DIM_TABLE, 
SALES_FACT_DAILY_MV_TABLE, SALES_FACT_MONTHLY_MV_TABLE,
+                                                LOG_FACT_DAILY_MV_TABLE, 
LOG_FACT_MONTHLY_MV_TABLE);
+
+        AtlasEntitiesWithExtInfo entities = getTables(tableNames);
+
+        assertNotNull(entities);
+        assertNotNull(entities.getEntities());
+        assertEquals(entities.getEntities().size(), tableNames.size());
+    }
+
     private AtlasEntity getTable(String tableName) throws 
AtlasServiceException {
         Map<String, String> attributes  = 
Collections.singletonMap(REFERENCEABLE_ATTRIBUTE_NAME, tableName + 
CLUSTER_SUFFIX);
         AtlasEntity         tableEntity = 
atlasClientV2.getEntityByAttribute(QuickStartV2.TABLE_TYPE, 
attributes).getEntity();
@@ -98,6 +102,16 @@ public class QuickStartV2IT extends BaseResourceIT {
         return tableEntity;
     }
 
+    private AtlasEntitiesWithExtInfo getTables(List<String> tableNames) throws 
AtlasServiceException {
+        List<Map<String, String>> attributesList = new ArrayList<>();
+
+        for (String tableName : tableNames) {
+            
attributesList.add(Collections.singletonMap(REFERENCEABLE_ATTRIBUTE_NAME, 
tableName + CLUSTER_SUFFIX));
+        }
+
+        return atlasClientV2.getEntitiesByAttribute(QuickStartV2.TABLE_TYPE, 
attributesList);
+    }
+
     private AtlasEntity getProcess(String processName) throws 
AtlasServiceException {
         Map<String, String> attributes    = 
Collections.singletonMap(REFERENCEABLE_ATTRIBUTE_NAME, processName + 
CLUSTER_SUFFIX);
         AtlasEntity         processEntity = 
atlasClientV2.getEntityByAttribute(LOAD_PROCESS_TYPE, attributes).getEntity();

Reply via email to