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 01ea65c  ATLAS-3095: Update QuickStartV2 to use relationships
01ea65c is described below

commit 01ea65c2153c6541f479c6f4f527aa4883e9fbe2
Author: Sarath Subramanian <[email protected]>
AuthorDate: Mon Mar 25 13:54:09 2019 -0700

    ATLAS-3095: Update QuickStartV2 to use relationships
---
 .../atlas/model/typedef/AtlasRelationshipDef.java  |   3 +-
 .../java/org/apache/atlas/type/AtlasTypeUtil.java  |  35 ++
 .../store/graph/v2/AtlasGraphUtilsV2.java          |   2 +-
 .../org/apache/atlas/examples/QuickStartV2.java    | 472 ++++++++++++---------
 .../org/apache/atlas/examples/QuickStartV2IT.java  | 119 +++---
 5 files changed, 389 insertions(+), 242 deletions(-)

diff --git 
a/intg/src/main/java/org/apache/atlas/model/typedef/AtlasRelationshipDef.java 
b/intg/src/main/java/org/apache/atlas/model/typedef/AtlasRelationshipDef.java
index e3de460..b9e8af1 100644
--- 
a/intg/src/main/java/org/apache/atlas/model/typedef/AtlasRelationshipDef.java
+++ 
b/intg/src/main/java/org/apache/atlas/model/typedef/AtlasRelationshipDef.java
@@ -152,13 +152,12 @@ public class AtlasRelationshipDef extends AtlasStructDef 
implements java.io.Seri
      *
      *            The ends are defined as 1 and 2 to avoid implying a 
direction. So we do not use to and from.
      *
-     * @throws AtlasBaseException
      */
     public AtlasRelationshipDef(String name, String description, String 
typeVersion,
                                 RelationshipCategory relationshipCategory,
                                 PropagateTags propagatetags,
                                 AtlasRelationshipEndDef endDef1,
-                                AtlasRelationshipEndDef endDef2) throws 
AtlasBaseException {
+                                AtlasRelationshipEndDef endDef2) {
         this(name, description, typeVersion, 
relationshipCategory,propagatetags, endDef1, endDef2,
              new ArrayList<AtlasAttributeDef>());
     }
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java 
b/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java
index 3ba8a12..079a8fc 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasTypeUtil.java
@@ -21,6 +21,7 @@ import org.apache.atlas.model.instance.AtlasClassification;
 import org.apache.atlas.model.instance.AtlasEntity;
 import org.apache.atlas.model.instance.AtlasEntityHeader;
 import org.apache.atlas.model.instance.AtlasObjectId;
+import org.apache.atlas.model.instance.AtlasRelatedObjectId;
 import org.apache.atlas.model.instance.AtlasStruct;
 import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
 import org.apache.atlas.model.typedef.AtlasClassificationDef;
@@ -276,6 +277,10 @@ public class AtlasTypeUtil {
         return new AtlasEntityDef(name, description, version, 
Arrays.asList(attrDefs), superTypes);
     }
 
+    public static AtlasEntityDef createClassTypeDef(String name, String 
description, String version, Set<String> superTypes, Map<String, String> 
options, AtlasAttributeDef... attrDefs) {
+        return new AtlasEntityDef(name, description, version, 
Arrays.asList(attrDefs), superTypes, options);
+    }
+
     public static AtlasRelationshipDef createRelationshipTypeDef(String        
          name,
                                                                  String        
          description,
                                                                  String        
          version,
@@ -288,6 +293,10 @@ public class AtlasTypeUtil {
                                         endDef1, endDef2, 
Arrays.asList(attrDefs));
     }
 
+    public static AtlasRelationshipEndDef createRelationshipEndDef(String 
typeName, String name, Cardinality cardinality, boolean isContainer) {
+        return new AtlasRelationshipEndDef(typeName, name, cardinality, 
isContainer);
+    }
+
     public static AtlasTypesDef getTypesDef(List<AtlasEnumDef> enums,
         List<AtlasStructDef> structs,
         List<AtlasClassificationDef> traits,
@@ -295,6 +304,14 @@ public class AtlasTypeUtil {
         return new AtlasTypesDef(enums, structs, traits, classes);
     }
 
+    public static AtlasTypesDef getTypesDef(List<AtlasEnumDef> enums,
+                                            List<AtlasStructDef> structs,
+                                            List<AtlasClassificationDef> 
traits,
+                                            List<AtlasEntityDef> classes,
+                                            List<AtlasRelationshipDef> 
relations) {
+        return new AtlasTypesDef(enums, structs, traits, classes, relations);
+    }
+
     public static List<AtlasTypeDefHeader> toTypeDefHeader(AtlasTypesDef 
typesDef) {
         List<AtlasTypeDefHeader> headerList = new LinkedList<>();
         if (CollectionUtils.isNotEmpty(typesDef.getEnumDefs())) {
@@ -360,6 +377,20 @@ public class AtlasTypeUtil {
         return ret;
     }
 
+    public static Collection<AtlasRelatedObjectId> 
toAtlasRelatedObjectIds(Collection<AtlasEntity> entities) {
+        List<AtlasRelatedObjectId> ret = new ArrayList<>();
+
+        if (CollectionUtils.isNotEmpty(entities)) {
+            for (AtlasEntity entity : entities) {
+                if (entity != null) {
+                    ret.add(toAtlasRelatedObjectId(entity));
+                }
+            }
+        }
+
+        return ret;
+    }
+
     public static Map toStructAttributes(Map map) {
         if (map != null && map.containsKey("typeName") && 
map.containsKey("attributes") && map.get("attributes") instanceof Map) {
             return (Map)map.get("attributes");
@@ -378,6 +409,10 @@ public class AtlasTypeUtil {
         return ret;
     }
 
+    public static AtlasRelatedObjectId toAtlasRelatedObjectId(AtlasEntity 
entity) {
+        return new AtlasRelatedObjectId(getAtlasObjectId(entity));
+    }
+
     public static AtlasObjectId getAtlasObjectId(AtlasEntity entity) {
         return new AtlasObjectId(entity.getGuid(), entity.getTypeName());
     }
diff --git 
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasGraphUtilsV2.java
 
b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasGraphUtilsV2.java
index dda324b..eac2a03 100644
--- 
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasGraphUtilsV2.java
+++ 
b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasGraphUtilsV2.java
@@ -95,7 +95,7 @@ public class AtlasGraphUtilsV2 {
     public static final String VERTEX_TYPE                 = "typeSystem";
 
     private static boolean USE_INDEX_QUERY_TO_FIND_ENTITY_BY_UNIQUE_ATTRIBUTES 
= false;
-    private static boolean USE_UNIQUE_INDEX_PROPERTY_TO_FIND_ENTITY            
= false;
+    private static boolean USE_UNIQUE_INDEX_PROPERTY_TO_FIND_ENTITY            
= true;
     private static String  INDEX_SEARCH_PREFIX;
 
     static {
diff --git a/webapp/src/main/java/org/apache/atlas/examples/QuickStartV2.java 
b/webapp/src/main/java/org/apache/atlas/examples/QuickStartV2.java
index 8bd2aad..6fcea9e 100755
--- a/webapp/src/main/java/org/apache/atlas/examples/QuickStartV2.java
+++ b/webapp/src/main/java/org/apache/atlas/examples/QuickStartV2.java
@@ -21,7 +21,6 @@ package org.apache.atlas.examples;
 import com.google.common.annotations.VisibleForTesting;
 import com.sun.jersey.core.util.MultivaluedMapImpl;
 import org.apache.atlas.ApplicationProperties;
-import org.apache.atlas.AtlasClient;
 import org.apache.atlas.AtlasClientV2;
 import org.apache.atlas.AtlasException;
 import org.apache.atlas.AtlasServiceException;
@@ -38,13 +37,11 @@ import 
org.apache.atlas.model.instance.EntityMutations.EntityOperation;
 import org.apache.atlas.model.lineage.AtlasLineageInfo;
 import org.apache.atlas.model.lineage.AtlasLineageInfo.LineageDirection;
 import org.apache.atlas.model.lineage.AtlasLineageInfo.LineageRelation;
-import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
 import org.apache.atlas.model.typedef.AtlasClassificationDef;
 import org.apache.atlas.model.typedef.AtlasEntityDef;
-import org.apache.atlas.model.typedef.AtlasEnumDef;
-import org.apache.atlas.model.typedef.AtlasStructDef;
+import org.apache.atlas.model.typedef.AtlasRelationshipDef;
+import org.apache.atlas.model.typedef.AtlasRelationshipDef.PropagateTags;
 import org.apache.atlas.model.typedef.AtlasTypesDef;
-import org.apache.atlas.type.AtlasTypeUtil;
 import org.apache.atlas.utils.AuthenticationUtil;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.configuration.Configuration;
@@ -53,9 +50,21 @@ import org.apache.commons.lang.ArrayUtils;
 import javax.ws.rs.core.MultivaluedMap;
 import java.util.*;
 
-import static 
org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_PARAM_ATTRIBUTE;
-import static 
org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_TYPE_INVERSE_REF;
-import static 
org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_TYPE_OWNED_REF;
+import static java.util.Arrays.asList;
+import static org.apache.atlas.AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME;
+import static 
org.apache.atlas.model.typedef.AtlasRelationshipDef.RelationshipCategory.AGGREGATION;
+import static 
org.apache.atlas.model.typedef.AtlasRelationshipDef.RelationshipCategory.COMPOSITION;
+import static 
org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef.Cardinality.SET;
+import static 
org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE;
+import static org.apache.atlas.type.AtlasTypeUtil.createClassTypeDef;
+import static org.apache.atlas.type.AtlasTypeUtil.createOptionalAttrDef;
+import static org.apache.atlas.type.AtlasTypeUtil.createRelationshipEndDef;
+import static org.apache.atlas.type.AtlasTypeUtil.createRelationshipTypeDef;
+import static org.apache.atlas.type.AtlasTypeUtil.createRequiredAttrDef;
+import static org.apache.atlas.type.AtlasTypeUtil.createTraitTypeDef;
+import static org.apache.atlas.type.AtlasTypeUtil.createUniqueRequiredAttrDef;
+import static org.apache.atlas.type.AtlasTypeUtil.toAtlasRelatedObjectId;
+import static org.apache.atlas.type.AtlasTypeUtil.toAtlasRelatedObjectIds;
 
 /**
  * A driver that sets up sample types and entities using v2 types and entity 
model for testing purposes.
@@ -112,9 +121,21 @@ public class QuickStartV2 {
     public static final String LOAD_PROCESS_TYPE           = "LoadProcess";
     public static final String STORAGE_DESC_TYPE           = "StorageDesc";
 
+    public static final String TABLE_DATABASE_TYPE         = "Table_DB";
+    public static final String VIEW_DATABASE_TYPE          = "View_DB";
+    public static final String VIEW_TABLES_TYPE            = "View_Tables";
+    public static final String TABLE_COLUMNS_TYPE          = "Table_Columns";
+    public static final String TABLE_STORAGE_DESC_TYPE     = 
"Table_StorageDesc";
+
+    public static final String VERSION_1                   = "1.0";
+    public static final String MANAGED_TABLE               = "Managed";
+    public static final String EXTERNAL_TABLE              = "External";
+    public static final String CLUSTER_SUFFIX              = "@cl1";
+
     public static final String[] TYPES = { DATABASE_TYPE, TABLE_TYPE, 
STORAGE_DESC_TYPE, COLUMN_TYPE, LOAD_PROCESS_TYPE,
                                            VIEW_TYPE, JDBC_CLASSIFICATION, 
ETL_CLASSIFICATION, METRIC_CLASSIFICATION,
-                                           PII_CLASSIFICATION, 
FACT_CLASSIFICATION, DIMENSION_CLASSIFICATION, LOGDATA_CLASSIFICATION };
+                                           PII_CLASSIFICATION, 
FACT_CLASSIFICATION, DIMENSION_CLASSIFICATION, LOGDATA_CLASSIFICATION,
+                                           TABLE_DATABASE_TYPE, 
VIEW_DATABASE_TYPE, VIEW_TABLES_TYPE, TABLE_COLUMNS_TYPE, 
TABLE_STORAGE_DESC_TYPE };
 
     public static void main(String[] args) throws Exception {
         String[] basicAuthUsernamePassword = null;
@@ -129,6 +150,7 @@ public class QuickStartV2 {
     @VisibleForTesting
     static void runQuickstart(String[] args, String[] 
basicAuthUsernamePassword) throws Exception {
         String[] urls = getServerUrl(args);
+
         QuickStartV2 quickStartV2;
 
         if (!AuthenticationUtil.isKerberosAuthenticationEnabled()) {
@@ -157,7 +179,7 @@ public class QuickStartV2 {
         }
 
         Configuration configuration = ApplicationProperties.get();
-        String[] urls = configuration.getStringArray(ATLAS_REST_ADDRESS);
+        String[]      urls          = 
configuration.getStringArray(ATLAS_REST_ADDRESS);
 
         if (ArrayUtils.isEmpty(urls)) {
             System.out.println("org.apache.atlas.examples.QuickStartV2 <Atlas 
REST address <http/https>://<atlas-fqdn>:<atlas-port> like 
http://localhost:21000>");
@@ -182,77 +204,90 @@ public class QuickStartV2 {
         AtlasTypesDef atlasTypesDef = createTypeDefinitions();
 
         System.out.println("\nCreating sample types: ");
+
         atlasClientV2.createAtlasTypeDefs(atlasTypesDef);
 
         verifyTypesCreated();
     }
 
-    AtlasTypesDef createTypeDefinitions() throws Exception {
-        AtlasEntityDef dbType   = 
AtlasTypeUtil.createClassTypeDef(DATABASE_TYPE, DATABASE_TYPE, "1.0", null,
-                                  
AtlasTypeUtil.createUniqueRequiredAttrDef("name", "string"),
-                                  
AtlasTypeUtil.createOptionalAttrDef("description", "string"),
-                                  
AtlasTypeUtil.createOptionalAttrDef("locationUri", "string"),
-                                  AtlasTypeUtil.createOptionalAttrDef("owner", 
"string"),
-                                  
AtlasTypeUtil.createOptionalAttrDef("createTime", "long"));
-
-        AtlasEntityDef sdType   = 
AtlasTypeUtil.createClassTypeDef(STORAGE_DESC_TYPE, STORAGE_DESC_TYPE, "1.0", 
null,
-                                  
AtlasTypeUtil.createOptionalAttrDefWithConstraint("table", TABLE_TYPE, 
CONSTRAINT_TYPE_INVERSE_REF,
-                                          new HashMap<String, Object>() {{ 
put(CONSTRAINT_PARAM_ATTRIBUTE, "sd"); }}),
-                                  
AtlasTypeUtil.createOptionalAttrDef("location", "string"),
-                                  
AtlasTypeUtil.createOptionalAttrDef("inputFormat", "string"),
-                                  
AtlasTypeUtil.createOptionalAttrDef("outputFormat", "string"),
-                                  
AtlasTypeUtil.createRequiredAttrDef("compressed", "boolean"));
-
-        AtlasEntityDef colType  = 
AtlasTypeUtil.createClassTypeDef(COLUMN_TYPE, COLUMN_TYPE, "1.0", null,
-                                  AtlasTypeUtil.createOptionalAttrDef("name", 
"string"),
-                                  
AtlasTypeUtil.createOptionalAttrDef("dataType", "string"),
-                                  
AtlasTypeUtil.createOptionalAttrDef("comment", "string"),
-                                  
AtlasTypeUtil.createOptionalAttrDefWithConstraint("table", TABLE_TYPE, 
CONSTRAINT_TYPE_INVERSE_REF,
-                                          new HashMap<String, Object>() {{ 
put(CONSTRAINT_PARAM_ATTRIBUTE, "columns"); }}));
-
-        colType.setOptions(new HashMap<String, String>() {{ 
put("schemaAttributes", "[\"name\", \"description\", \"owner\", \"type\", 
\"comment\", \"position\"]"); }});
-
-        AtlasEntityDef tblType  = AtlasTypeUtil.createClassTypeDef(TABLE_TYPE, 
TABLE_TYPE, "1.0", Collections.singleton("DataSet"),
-                                  AtlasTypeUtil.createRequiredAttrDef("db", 
DATABASE_TYPE),
-                                  
AtlasTypeUtil.createRequiredAttrDefWithConstraint("sd", STORAGE_DESC_TYPE, 
CONSTRAINT_TYPE_OWNED_REF, null),
-                                  AtlasTypeUtil.createOptionalAttrDef("owner", 
"string"),
-                                  
AtlasTypeUtil.createOptionalAttrDef("createTime", "long"),
-                                  
AtlasTypeUtil.createOptionalAttrDef("lastAccessTime", "long"),
-                                  
AtlasTypeUtil.createOptionalAttrDef("retention", "long"),
-                                  
AtlasTypeUtil.createOptionalAttrDef("viewOriginalText", "string"),
-                                  
AtlasTypeUtil.createOptionalAttrDef("viewExpandedText", "string"),
-                                  
AtlasTypeUtil.createOptionalAttrDef("tableType", "string"),
-                                  
AtlasTypeUtil.createOptionalAttrDef("temporary", "boolean"),
-                                  
AtlasTypeUtil.createRequiredListAttrDefWithConstraint("columns", 
AtlasBaseTypeDef.getArrayTypeName(COLUMN_TYPE),
-                                          CONSTRAINT_TYPE_OWNED_REF, null));
-
-        tblType.setOptions(new HashMap<String, String>() {{ 
put("schemaElementsAttribute", "columns"); }});
-
-        AtlasEntityDef procType = 
AtlasTypeUtil.createClassTypeDef(LOAD_PROCESS_TYPE, LOAD_PROCESS_TYPE, "1.0", 
Collections.singleton("Process"),
-                                  
AtlasTypeUtil.createOptionalAttrDef("userName", "string"),
-                                  
AtlasTypeUtil.createOptionalAttrDef("startTime", "long"),
-                                  
AtlasTypeUtil.createOptionalAttrDef("endTime", "long"),
-                                  
AtlasTypeUtil.createRequiredAttrDef("queryText", "string"),
-                                  
AtlasTypeUtil.createRequiredAttrDef("queryPlan", "string"),
-                                  
AtlasTypeUtil.createRequiredAttrDef("queryId", "string"),
-                                  
AtlasTypeUtil.createRequiredAttrDef("queryGraph", "string"));
-
-        AtlasEntityDef viewType = AtlasTypeUtil.createClassTypeDef(VIEW_TYPE, 
VIEW_TYPE, "1.0", Collections.singleton("DataSet"),
-                                  AtlasTypeUtil.createRequiredAttrDef("db", 
DATABASE_TYPE),
-                                  
AtlasTypeUtil.createOptionalListAttrDef("inputTables", 
AtlasBaseTypeDef.getArrayTypeName(TABLE_TYPE)));
-
-        AtlasClassificationDef dimClassifDef    = 
AtlasTypeUtil.createTraitTypeDef(DIMENSION_CLASSIFICATION,  "Dimension 
Classification", "1.0", Collections.<String>emptySet());
-        AtlasClassificationDef factClassifDef   = 
AtlasTypeUtil.createTraitTypeDef(FACT_CLASSIFICATION, "Fact Classification", 
"1.0", Collections.<String>emptySet());
-        AtlasClassificationDef piiClassifDef    = 
AtlasTypeUtil.createTraitTypeDef(PII_CLASSIFICATION, "PII Classification", 
"1.0", Collections.<String>emptySet());
-        AtlasClassificationDef metricClassifDef = 
AtlasTypeUtil.createTraitTypeDef(METRIC_CLASSIFICATION, "Metric 
Classification", "1.0", Collections.<String>emptySet());
-        AtlasClassificationDef etlClassifDef    = 
AtlasTypeUtil.createTraitTypeDef(ETL_CLASSIFICATION, "ETL Classification", 
"1.0", Collections.<String>emptySet());
-        AtlasClassificationDef jdbcClassifDef   = 
AtlasTypeUtil.createTraitTypeDef(JDBC_CLASSIFICATION, "JdbcAccess 
Classification", "1.0", Collections.<String>emptySet());
-        AtlasClassificationDef logClassifDef    = 
AtlasTypeUtil.createTraitTypeDef(LOGDATA_CLASSIFICATION, "LogData 
Classification", "1.0", Collections.<String>emptySet());
-
-        return AtlasTypeUtil.getTypesDef(Collections.<AtlasEnumDef>emptyList(),
-                                         
Collections.<AtlasStructDef>emptyList(),
-                                         Arrays.asList(dimClassifDef, 
factClassifDef, piiClassifDef, metricClassifDef, etlClassifDef, jdbcClassifDef, 
logClassifDef),
-                                         Arrays.asList(dbType, sdType, 
colType, tblType, procType, viewType));
+    AtlasTypesDef createTypeDefinitions() {
+        // Entity-Definitions
+        AtlasEntityDef dbTypeDef      = createClassTypeDef(DATABASE_TYPE, 
DATABASE_TYPE, VERSION_1, Collections.singleton("DataSet"),
+                                                            
createUniqueRequiredAttrDef("name", "string"),
+                                                            
createOptionalAttrDef("description", "string"),
+                                                            
createOptionalAttrDef("locationUri", "string"),
+                                                            
createOptionalAttrDef("owner", "string"),
+                                                            
createOptionalAttrDef("createTime", "long"));
+
+        AtlasEntityDef tableTypeDef   = createClassTypeDef(TABLE_TYPE, 
TABLE_TYPE, VERSION_1, Collections.singleton("DataSet"),
+                                                            new 
HashMap<String, String>() {{ put("schemaElementsAttribute", "columns"); }} ,
+                                                            
createOptionalAttrDef("owner", "string"),
+                                                            
createOptionalAttrDef("createTime", "long"),
+                                                            
createOptionalAttrDef("lastAccessTime", "long"),
+                                                            
createOptionalAttrDef("retention", "long"),
+                                                            
createOptionalAttrDef("viewOriginalText", "string"),
+                                                            
createOptionalAttrDef("viewExpandedText", "string"),
+                                                            
createOptionalAttrDef("tableType", "string"),
+                                                            
createOptionalAttrDef("temporary", "boolean"));
+
+        AtlasEntityDef colTypeDef     = createClassTypeDef(COLUMN_TYPE, 
COLUMN_TYPE, VERSION_1, Collections.singleton("DataSet"),
+                                                            new 
HashMap<String, String>() {{ put("schemaAttributes", "[\"name\", 
\"description\", \"owner\", \"type\", \"comment\", \"position\"]"); }},
+                                                            
createOptionalAttrDef("name", "string"),
+                                                            
createOptionalAttrDef("dataType", "string"),
+                                                            
createOptionalAttrDef("comment", "string"));
+
+        AtlasEntityDef sdTypeDef      = createClassTypeDef(STORAGE_DESC_TYPE, 
STORAGE_DESC_TYPE, VERSION_1, Collections.singleton("DataSet"),
+                                                            
createOptionalAttrDef("location", "string"),
+                                                            
createOptionalAttrDef("inputFormat", "string"),
+                                                            
createOptionalAttrDef("outputFormat", "string"),
+                                                            
createRequiredAttrDef("compressed", "boolean"));
+
+        AtlasEntityDef processTypeDef = createClassTypeDef(LOAD_PROCESS_TYPE, 
LOAD_PROCESS_TYPE, VERSION_1, Collections.singleton("Process"),
+                                                            
createOptionalAttrDef("userName", "string"),
+                                                            
createOptionalAttrDef("startTime", "long"),
+                                                            
createOptionalAttrDef("endTime", "long"),
+                                                            
createRequiredAttrDef("queryText", "string"),
+                                                            
createRequiredAttrDef("queryPlan", "string"),
+                                                            
createRequiredAttrDef("queryId", "string"),
+                                                            
createRequiredAttrDef("queryGraph", "string"));
+
+        AtlasEntityDef viewTypeDef    = createClassTypeDef(VIEW_TYPE, 
VIEW_TYPE, VERSION_1, Collections.singleton("DataSet"));
+
+        // Relationship-Definitions
+        AtlasRelationshipDef tableDatabaseTypeDef    = 
createRelationshipTypeDef(TABLE_DATABASE_TYPE, TABLE_DATABASE_TYPE, VERSION_1, 
AGGREGATION, PropagateTags.NONE,
+                                                                               
     createRelationshipEndDef(TABLE_TYPE, "db", SINGLE, false),
+                                                                               
     createRelationshipEndDef(DATABASE_TYPE, "tables", SET, true));
+
+        AtlasRelationshipDef viewDatabaseTypeDef     = 
createRelationshipTypeDef(VIEW_DATABASE_TYPE, VIEW_DATABASE_TYPE, VERSION_1, 
AGGREGATION, PropagateTags.NONE,
+                                                                               
     createRelationshipEndDef(VIEW_TYPE, "db", SINGLE, false),
+                                                                               
     createRelationshipEndDef(DATABASE_TYPE, "views", SET, true));
+
+        AtlasRelationshipDef viewTablesTypeDef       = 
createRelationshipTypeDef(VIEW_TABLES_TYPE, VIEW_TABLES_TYPE, VERSION_1, 
AGGREGATION, PropagateTags.NONE,
+                                                                               
     createRelationshipEndDef(VIEW_TYPE, "inputTables", SET, true),
+                                                                               
     createRelationshipEndDef(TABLE_TYPE, "view", SINGLE, false));
+
+        AtlasRelationshipDef tableColumnsTypeDef     = 
createRelationshipTypeDef(TABLE_COLUMNS_TYPE, TABLE_COLUMNS_TYPE, VERSION_1, 
COMPOSITION, PropagateTags.NONE,
+                                                                               
     createRelationshipEndDef(TABLE_TYPE, "columns", SET, true),
+                                                                               
     createRelationshipEndDef(COLUMN_TYPE, "table", SINGLE, false));
+
+        AtlasRelationshipDef tableStorageDescTypeDef = 
createRelationshipTypeDef(TABLE_STORAGE_DESC_TYPE, TABLE_STORAGE_DESC_TYPE, 
VERSION_1, COMPOSITION, PropagateTags.NONE,
+                                                                               
     createRelationshipEndDef(TABLE_TYPE, "sd", SINGLE, true),
+                                                                               
     createRelationshipEndDef(STORAGE_DESC_TYPE, "table", SINGLE, false));
+
+        // Classification-Definitions
+        AtlasClassificationDef dimClassifDef    = 
createTraitTypeDef(DIMENSION_CLASSIFICATION,  "Dimension Classification", 
VERSION_1, Collections.emptySet());
+        AtlasClassificationDef factClassifDef   = 
createTraitTypeDef(FACT_CLASSIFICATION, "Fact Classification", VERSION_1, 
Collections.emptySet());
+        AtlasClassificationDef piiClassifDef    = 
createTraitTypeDef(PII_CLASSIFICATION, "PII Classification", VERSION_1, 
Collections.emptySet());
+        AtlasClassificationDef metricClassifDef = 
createTraitTypeDef(METRIC_CLASSIFICATION, "Metric Classification", VERSION_1, 
Collections.emptySet());
+        AtlasClassificationDef etlClassifDef    = 
createTraitTypeDef(ETL_CLASSIFICATION, "ETL Classification", VERSION_1, 
Collections.emptySet());
+        AtlasClassificationDef jdbcClassifDef   = 
createTraitTypeDef(JDBC_CLASSIFICATION, "JdbcAccess Classification", VERSION_1, 
Collections.emptySet());
+        AtlasClassificationDef logClassifDef    = 
createTraitTypeDef(LOGDATA_CLASSIFICATION, "LogData Classification", VERSION_1, 
Collections.emptySet());
+
+        List<AtlasEntityDef>         entityDefs         = asList(dbTypeDef, 
sdTypeDef, colTypeDef, tableTypeDef, processTypeDef, viewTypeDef);
+        List<AtlasRelationshipDef>   relationshipDefs   = 
asList(tableDatabaseTypeDef, viewDatabaseTypeDef, viewTablesTypeDef, 
tableColumnsTypeDef, tableStorageDescTypeDef);
+        List<AtlasClassificationDef> classificationDefs = 
asList(dimClassifDef, factClassifDef, piiClassifDef, metricClassifDef, 
etlClassifDef, jdbcClassifDef, logClassifDef);
+
+        return new AtlasTypesDef(Collections.emptyList(), 
Collections.emptyList(), classificationDefs, entityDefs, relationshipDefs);
     }
 
     void createEntities() throws Exception {
@@ -263,165 +298,207 @@ public class QuickStartV2 {
         AtlasEntity reportingDB = createDatabase(REPORTING_DB, "reporting 
database", "Jane BI", "hdfs://host:8000/apps/warehouse/reporting");
         AtlasEntity logDB       = createDatabase(LOGGING_DB, "logging 
database", "Tim ETL", "hdfs://host:8000/apps/warehouse/logging");
 
-        // Storage Descriptor entities
-        AtlasEntity storageDesc = 
createStorageDescriptor("hdfs://host:8000/apps/warehouse/sales", 
"TextInputFormat", "TextOutputFormat", true);
-
-        // Column entities
-        List<AtlasEntity> salesFactColumns   = 
Arrays.asList(createColumn(TIME_ID_COLUMN, "int", "time id"),
-                                                                
createColumn(PRODUCT_ID_COLUMN, "int", "product id"),
-                                                                
createColumn(CUSTOMER_ID_COLUMN, "int", "customer id", PII_CLASSIFICATION),
-                                                                
createColumn(SALES_COLUMN, "double", "product id", METRIC_CLASSIFICATION));
-
-        List<AtlasEntity> logFactColumns     = 
Arrays.asList(createColumn(TIME_ID_COLUMN, "int", "time id"),
-                                                                
createColumn(APP_ID_COLUMN, "int", "app id"),
-                                                                
createColumn(MACHINE_ID_COLUMN, "int", "machine id"),
-                                                                
createColumn(LOG_COLUMN, "string", "log data", LOGDATA_CLASSIFICATION));
-
-        List<AtlasEntity> productDimColumns  = 
Arrays.asList(createColumn(PRODUCT_ID_COLUMN, "int", "product id"),
-                                                                
createColumn(PRODUCT_NAME_COLUMN, "string", "product name"),
-                                                                
createColumn(BRAND_NAME_COLUMN, "int", "brand name"));
-
-        List<AtlasEntity> timeDimColumns     = 
Arrays.asList(createColumn(TIME_ID_COLUMN, "int", "time id"),
-                                                                
createColumn(DAY_OF_YEAR_COLUMN, "int", "day Of Year"),
-                                                                
createColumn(WEEKDAY_COLUMN, "int", "week Day"));
-
-        List<AtlasEntity> customerDimColumns = 
Arrays.asList(createColumn(CUSTOMER_ID_COLUMN, "int", "customer id", 
PII_CLASSIFICATION),
-                                                                
createColumn(NAME_COLUMN, "string", "customer name", PII_CLASSIFICATION),
-                                                                
createColumn(ADDRESS_COLUMN, "string", "customer address", PII_CLASSIFICATION));
-
         // Table entities
-        AtlasEntity salesFact          = createTable(SALES_FACT_TABLE, "sales 
fact table", salesDB, storageDesc,
-                                                     "Joe", "Managed", 
salesFactColumns, FACT_CLASSIFICATION);
-        AtlasEntity productDim         = createTable(PRODUCT_DIM_TABLE, 
"product dimension table", salesDB, storageDesc,
-                                                     "John Doe", "Managed", 
productDimColumns, DIMENSION_CLASSIFICATION);
-        AtlasEntity customerDim        = createTable(CUSTOMER_DIM_TABLE, 
"customer dimension table", salesDB, storageDesc,
-                                                     "fetl", "External", 
customerDimColumns, DIMENSION_CLASSIFICATION);
-        AtlasEntity timeDim            = createTable(TIME_DIM_TABLE, "time 
dimension table", salesDB, storageDesc,
-                                                     "John Doe", "External", 
timeDimColumns, DIMENSION_CLASSIFICATION);
-        AtlasEntity loggingFactDaily   = createTable(LOG_FACT_DAILY_MV_TABLE, 
"log fact daily materialized view", logDB,
-                                                     storageDesc, "Tim ETL", 
"Managed", logFactColumns, LOGDATA_CLASSIFICATION);
-        AtlasEntity loggingFactMonthly = 
createTable(LOG_FACT_MONTHLY_MV_TABLE, "logging fact monthly materialized 
view", logDB,
-                                                     storageDesc, "Tim ETL", 
"Managed", logFactColumns, LOGDATA_CLASSIFICATION);
-        AtlasEntity salesFactDaily     = 
createTable(SALES_FACT_DAILY_MV_TABLE, "sales fact daily materialized view", 
reportingDB,
-                                                     storageDesc, "Joe BI", 
"Managed", salesFactColumns, METRIC_CLASSIFICATION);
-        AtlasEntity salesFactMonthly   = 
createTable(SALES_FACT_MONTHLY_MV_TABLE, "sales fact monthly materialized 
view", reportingDB,
-                                                     storageDesc, "Jane BI", 
"Managed", salesFactColumns, METRIC_CLASSIFICATION);
+        AtlasEntity salesFact = createTable(SALES_FACT_TABLE, "sales fact 
table", salesDB, "Joe", MANAGED_TABLE,
+                                                        
Arrays.asList(createColumn(TIME_ID_COLUMN, "int", "time id"),
+                                                                      
createColumn(PRODUCT_ID_COLUMN, "int", "product id"),
+                                                                      
createColumn(CUSTOMER_ID_COLUMN, "int", "customer id", PII_CLASSIFICATION),
+                                                                      
createColumn(SALES_COLUMN, "double", "product id", METRIC_CLASSIFICATION)),
+                                                        FACT_CLASSIFICATION);
+
+        AtlasEntity productDim = createTable(PRODUCT_DIM_TABLE, "product 
dimension table", salesDB, "John Doe", MANAGED_TABLE,
+                                                        
Arrays.asList(createColumn(PRODUCT_ID_COLUMN, "int", "product id"),
+                                                                      
createColumn(PRODUCT_NAME_COLUMN, "string", "product name"),
+                                                                      
createColumn(BRAND_NAME_COLUMN, "int", "brand name")),
+                                                        
DIMENSION_CLASSIFICATION);
+
+        AtlasEntity customerDim = createTable(CUSTOMER_DIM_TABLE, "customer 
dimension table", salesDB, "fetl", EXTERNAL_TABLE,
+                                                        
Arrays.asList(createColumn(CUSTOMER_ID_COLUMN, "int", "customer id", 
PII_CLASSIFICATION),
+                                                                      
createColumn(NAME_COLUMN, "string", "customer name", PII_CLASSIFICATION),
+                                                                      
createColumn(ADDRESS_COLUMN, "string", "customer address", PII_CLASSIFICATION)),
+                                                        
DIMENSION_CLASSIFICATION);
+
+        AtlasEntity timeDim = createTable(TIME_DIM_TABLE, "time dimension 
table", salesDB, "John Doe", EXTERNAL_TABLE,
+                                                        
Arrays.asList(createColumn(TIME_ID_COLUMN, "int", "time id"),
+                                                                      
createColumn(DAY_OF_YEAR_COLUMN, "int", "day Of Year"),
+                                                                      
createColumn(WEEKDAY_COLUMN, "int", "week Day")),
+                                                        
DIMENSION_CLASSIFICATION);
+
+        AtlasEntity loggingFactDaily = createTable(LOG_FACT_DAILY_MV_TABLE, 
"log fact daily materialized view", logDB, "Tim ETL", MANAGED_TABLE,
+                                                        
Arrays.asList(createColumn(TIME_ID_COLUMN, "int", "time id"),
+                                                                      
createColumn(APP_ID_COLUMN, "int", "app id"),
+                                                                      
createColumn(MACHINE_ID_COLUMN, "int", "machine id"),
+                                                                      
createColumn(LOG_COLUMN, "string", "log data", LOGDATA_CLASSIFICATION)),
+                                                        
LOGDATA_CLASSIFICATION);
+
+        AtlasEntity loggingFactMonthly = 
createTable(LOG_FACT_MONTHLY_MV_TABLE, "logging fact monthly materialized 
view", logDB, "Tim ETL", MANAGED_TABLE,
+                                                        
Arrays.asList(createColumn(TIME_ID_COLUMN, "int", "time id"),
+                                                                      
createColumn(APP_ID_COLUMN, "int", "app id"),
+                                                                      
createColumn(MACHINE_ID_COLUMN, "int", "machine id"),
+                                                                      
createColumn(LOG_COLUMN, "string", "log data", LOGDATA_CLASSIFICATION)),
+                                                        
LOGDATA_CLASSIFICATION);
+
+        AtlasEntity salesFactDaily = createTable(SALES_FACT_DAILY_MV_TABLE, 
"sales fact daily materialized view", reportingDB, "Joe BI", MANAGED_TABLE,
+                                                        
Arrays.asList(createColumn(TIME_ID_COLUMN, "int", "time id"),
+                                                                      
createColumn(PRODUCT_ID_COLUMN, "int", "product id"),
+                                                                      
createColumn(CUSTOMER_ID_COLUMN, "int", "customer id", PII_CLASSIFICATION),
+                                                                      
createColumn(SALES_COLUMN, "double", "product id", METRIC_CLASSIFICATION)),
+                                                        METRIC_CLASSIFICATION);
+
+        AtlasEntity salesFactMonthly = 
createTable(SALES_FACT_MONTHLY_MV_TABLE, "sales fact monthly materialized 
view", reportingDB, "Jane BI", MANAGED_TABLE,
+                                                        
Arrays.asList(createColumn(TIME_ID_COLUMN, "int", "time id"),
+                                                                      
createColumn(PRODUCT_ID_COLUMN, "int", "product id"),
+                                                                      
createColumn(CUSTOMER_ID_COLUMN, "int", "customer id", PII_CLASSIFICATION),
+                                                                      
createColumn(SALES_COLUMN, "double", "product id", METRIC_CLASSIFICATION)),
+                                                        METRIC_CLASSIFICATION);
 
         // View entities
-        createView(PRODUCT_DIM_VIEW, reportingDB, 
Collections.singletonList(productDim), DIMENSION_CLASSIFICATION, 
JDBC_CLASSIFICATION);
-        createView(CUSTOMER_DIM_VIEW, reportingDB, 
Collections.singletonList(customerDim), DIMENSION_CLASSIFICATION, 
JDBC_CLASSIFICATION);
+        createView(PRODUCT_DIM_VIEW, reportingDB, asList(productDim), 
DIMENSION_CLASSIFICATION, JDBC_CLASSIFICATION);
+        createView(CUSTOMER_DIM_VIEW, reportingDB, asList(customerDim), 
DIMENSION_CLASSIFICATION, JDBC_CLASSIFICATION);
 
         // Process entities
         createProcess(LOAD_SALES_DAILY_PROCESS, "hive query for daily 
summary", "John ETL",
-                      Arrays.asList(salesFact, timeDim),
-                      Collections.singletonList(salesFactDaily),
+                      asList(salesFact, timeDim),
+                      asList(salesFactDaily),
                       "create table as select ", "plan", "id", "graph", 
ETL_CLASSIFICATION);
 
         createProcess(LOAD_SALES_MONTHLY_PROCESS, "hive query for monthly 
summary", "John ETL",
-                      Collections.singletonList(salesFactDaily),
-                      Collections.singletonList(salesFactMonthly),
+                      asList(salesFactDaily),
+                        asList(salesFactMonthly),
                       "create table as select ", "plan", "id", "graph", 
ETL_CLASSIFICATION);
 
         createProcess(LOAD_LOGS_MONTHLY_PROCESS, "hive query for monthly 
summary", "Tim ETL",
-                      Collections.singletonList(loggingFactDaily),
-                      Collections.singletonList(loggingFactMonthly),
+                      asList(loggingFactDaily),
+                      asList(loggingFactMonthly),
                       "create table as select ", "plan", "id", "graph", 
ETL_CLASSIFICATION);
     }
 
-    private AtlasEntity createInstance(AtlasEntity entity, String[] 
traitNames) throws Exception {
-        AtlasEntity ret = null;
-        EntityMutationResponse  response = atlasClientV2.createEntity(new 
AtlasEntityWithExtInfo(entity));
+    private AtlasEntity createInstance(AtlasEntity entity) throws Exception {
+        return createInstance(new AtlasEntityWithExtInfo(entity));
+    }
+
+    private AtlasEntity createInstance(AtlasEntityWithExtInfo 
entityWithExtInfo) throws Exception {
+        AtlasEntity             ret      = null;
+        EntityMutationResponse  response = 
atlasClientV2.createEntity(entityWithExtInfo);
         List<AtlasEntityHeader> entities = 
response.getEntitiesByOperation(EntityOperation.CREATE);
 
         if (CollectionUtils.isNotEmpty(entities)) {
             AtlasEntityWithExtInfo getByGuidResponse = 
atlasClientV2.getEntityByGuid(entities.get(0).getGuid());
+
             ret = getByGuidResponse.getEntity();
+
             System.out.println("Created entity of type [" + ret.getTypeName() 
+ "], guid: " + ret.getGuid());
         }
 
         return ret;
     }
 
-    AtlasEntity createDatabase(String name, String description, String owner, 
String locationUri, String... traitNames)
-            throws Exception {
+    AtlasEntity createDatabase(String name, String description, String owner, 
String locationUri, String... classificationNames) throws Exception {
         AtlasEntity entity = new AtlasEntity(DATABASE_TYPE);
 
-        entity.setClassifications(toAtlasClassifications(traitNames));
+        // set attributes
         entity.setAttribute("name", name);
+        entity.setAttribute(REFERENCEABLE_ATTRIBUTE_NAME, name + 
CLUSTER_SUFFIX);
         entity.setAttribute("description", description);
         entity.setAttribute("owner", owner);
         entity.setAttribute("locationuri", locationUri);
         entity.setAttribute("createTime", System.currentTimeMillis());
 
-        return createInstance(entity, traitNames);
+        // set classifications
+        entity.setClassifications(toAtlasClassifications(classificationNames));
+
+        return createInstance(entity);
     }
 
-    private List<AtlasClassification> toAtlasClassifications(String[] 
traitNames) {
-        List<AtlasClassification> ret    = new ArrayList<>();
-        List<String>              traits = Arrays.asList(traitNames);
+    private List<AtlasClassification> toAtlasClassifications(String[] 
classificationNames) {
+        List<AtlasClassification> ret             = new ArrayList<>();
+        List<String>              classifications = 
asList(classificationNames);
 
-        if (CollectionUtils.isNotEmpty(traits)) {
-            for (String trait : traits) {
-                ret.add(new AtlasClassification(trait));
+        if (CollectionUtils.isNotEmpty(classifications)) {
+            for (String classificationName : classifications) {
+                ret.add(new AtlasClassification(classificationName));
             }
         }
 
         return ret;
     }
 
-    AtlasEntity createStorageDescriptor(String location, String inputFormat, 
String outputFormat, boolean compressed)
-            throws Exception {
-        AtlasEntity entity = new AtlasEntity(STORAGE_DESC_TYPE);
+    AtlasEntity createStorageDescriptor(String location, String inputFormat, 
String outputFormat, boolean compressed) {
+        AtlasEntity ret = new AtlasEntity(STORAGE_DESC_TYPE);
 
-        entity.setAttribute("location", location);
-        entity.setAttribute("inputFormat", inputFormat);
-        entity.setAttribute("outputFormat", outputFormat);
-        entity.setAttribute("compressed", compressed);
+        ret.setAttribute("name", "sd:" + location);
+        ret.setAttribute(REFERENCEABLE_ATTRIBUTE_NAME, "sd:" + location + 
CLUSTER_SUFFIX);
+        ret.setAttribute("location", location);
+        ret.setAttribute("inputFormat", inputFormat);
+        ret.setAttribute("outputFormat", outputFormat);
+        ret.setAttribute("compressed", compressed);
 
-        return createInstance(entity, null);
+        return ret;
     }
 
-    AtlasEntity createColumn(String name, String dataType, String comment, 
String... traitNames) throws Exception {
+    AtlasEntity createColumn(String name, String dataType, String comment, 
String... classificationNames) {
+        AtlasEntity ret = new AtlasEntity(COLUMN_TYPE);
 
-        AtlasEntity entity = new AtlasEntity(COLUMN_TYPE);
-        entity.setClassifications(toAtlasClassifications(traitNames));
-        entity.setAttribute("name", name);
-        entity.setAttribute("dataType", dataType);
-        entity.setAttribute("comment", comment);
+        // set attributes
+        ret.setAttribute("name", name);
+        ret.setAttribute(REFERENCEABLE_ATTRIBUTE_NAME, name + CLUSTER_SUFFIX);
+        ret.setAttribute("dataType", dataType);
+        ret.setAttribute("comment", comment);
 
-        return createInstance(entity, traitNames);
+        // set classifications
+        ret.setClassifications(toAtlasClassifications(classificationNames));
+
+        return ret;
     }
 
-    AtlasEntity createTable(String name, String description, AtlasEntity db, 
AtlasEntity sd, String owner, String tableType,
-                            List<AtlasEntity> columns, String... traitNames) 
throws Exception {
-        AtlasEntity entity = new AtlasEntity(TABLE_TYPE);
+    AtlasEntity createTable(String name, String description, AtlasEntity 
database, String owner, String tableType,
+                            List<AtlasEntity> columns, String... 
classificationNames) throws Exception {
+        AtlasEntity tblEntity = new AtlasEntity(TABLE_TYPE);
+
+        // set attributes
+        tblEntity.setAttribute("name", name);
+        tblEntity.setAttribute(REFERENCEABLE_ATTRIBUTE_NAME, name + 
CLUSTER_SUFFIX);
+        tblEntity.setAttribute("description", description);
+        tblEntity.setAttribute("owner", owner);
+        tblEntity.setAttribute("tableType", tableType);
+        tblEntity.setAttribute("createTime", System.currentTimeMillis());
+        tblEntity.setAttribute("lastAccessTime", System.currentTimeMillis());
+        tblEntity.setAttribute("retention", System.currentTimeMillis());
+
+        // set relationship attributes
+        AtlasEntity storageDesc = 
createStorageDescriptor("hdfs://host:8000/apps/warehouse/sales", 
"TextInputFormat", "TextOutputFormat", true);
+        storageDesc.setRelationshipAttribute("table", 
toAtlasRelatedObjectId(tblEntity));
 
-        entity.setClassifications(toAtlasClassifications(traitNames));
-        entity.setAttribute("name", name);
-        entity.setAttribute(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, name);
-        entity.setAttribute("description", description);
-        entity.setAttribute("owner", owner);
-        entity.setAttribute("tableType", tableType);
-        entity.setAttribute("createTime", System.currentTimeMillis());
-        entity.setAttribute("lastAccessTime", System.currentTimeMillis());
-        entity.setAttribute("retention", System.currentTimeMillis());
-        entity.setAttribute("db", AtlasTypeUtil.getAtlasObjectId(db));
-        entity.setAttribute("sd", AtlasTypeUtil.getAtlasObjectId(sd));
-        entity.setAttribute("columns", AtlasTypeUtil.toObjectIds(columns));
+        tblEntity.setRelationshipAttribute("db", 
toAtlasRelatedObjectId(database));
+        tblEntity.setRelationshipAttribute("sd", 
toAtlasRelatedObjectId(storageDesc));
+        tblEntity.setRelationshipAttribute("columns", 
toAtlasRelatedObjectIds(columns));
 
-        return createInstance(entity, traitNames);
+        // set classifications
+        
tblEntity.setClassifications(toAtlasClassifications(classificationNames));
+
+        AtlasEntityWithExtInfo entityWithExtInfo = new 
AtlasEntityWithExtInfo();
+
+        entityWithExtInfo.setEntity(tblEntity);
+        entityWithExtInfo.addReferredEntity(storageDesc);
+
+        for (AtlasEntity column : columns) {
+            column.setRelationshipAttribute("table", 
toAtlasRelatedObjectId(tblEntity));
+
+            entityWithExtInfo.addReferredEntity(column);
+        }
+
+        return createInstance(entityWithExtInfo);
     }
 
     AtlasEntity createProcess(String name, String description, String user, 
List<AtlasEntity> inputs, List<AtlasEntity> outputs,
-            String queryText, String queryPlan, String queryId, String 
queryGraph, String... traitNames) throws Exception {
+            String queryText, String queryPlan, String queryId, String 
queryGraph, String... classificationNames) throws Exception {
+
         AtlasEntity entity = new AtlasEntity(LOAD_PROCESS_TYPE);
 
-        entity.setClassifications(toAtlasClassifications(traitNames));
-        entity.setAttribute(AtlasClient.NAME, name);
-        entity.setAttribute(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, name);
+        // set attributes
+        entity.setAttribute("name", name);
+        entity.setAttribute(REFERENCEABLE_ATTRIBUTE_NAME, name + 
CLUSTER_SUFFIX);
         entity.setAttribute("description", description);
-        entity.setAttribute("inputs", inputs);
-        entity.setAttribute("outputs", outputs);
         entity.setAttribute("user", user);
         entity.setAttribute("startTime", System.currentTimeMillis());
         entity.setAttribute("endTime", System.currentTimeMillis() + 10000);
@@ -430,19 +507,31 @@ public class QuickStartV2 {
         entity.setAttribute("queryId", queryId);
         entity.setAttribute("queryGraph", queryGraph);
 
-        return createInstance(entity, traitNames);
+        // set relationship attributes
+        entity.setRelationshipAttribute("inputs", 
toAtlasRelatedObjectIds(inputs));
+        entity.setRelationshipAttribute("outputs", 
toAtlasRelatedObjectIds(outputs));
+
+        // set classifications
+        entity.setClassifications(toAtlasClassifications(classificationNames));
+
+        return createInstance(entity);
     }
 
-    AtlasEntity createView(String name, AtlasEntity db, List<AtlasEntity> 
inputTables, String... traitNames) throws Exception {
+    AtlasEntity createView(String name, AtlasEntity database, 
List<AtlasEntity> inputTables, String... classificationNames) throws Exception {
         AtlasEntity entity = new AtlasEntity(VIEW_TYPE);
 
-        entity.setClassifications(toAtlasClassifications(traitNames));
+        // set attributes
         entity.setAttribute("name", name);
-        entity.setAttribute(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, name);
-        entity.setAttribute("db", db);
-        entity.setAttribute("inputTables", inputTables);
+        entity.setAttribute(REFERENCEABLE_ATTRIBUTE_NAME, name + 
CLUSTER_SUFFIX);
 
-        return createInstance(entity, traitNames);
+        // set relationship attributes
+        entity.setRelationshipAttribute("db", 
toAtlasRelatedObjectId(database));
+        entity.setRelationshipAttribute("inputTables", 
toAtlasRelatedObjectIds(inputTables));
+
+        // set classifications
+        entity.setClassifications(toAtlasClassifications(classificationNames));
+
+        return createInstance(entity);
     }
 
     private void verifyTypesCreated() throws Exception {
@@ -451,10 +540,12 @@ public class QuickStartV2 {
         for (String typeName : TYPES) {
             searchParams.clear();
             searchParams.add(SearchFilter.PARAM_NAME, typeName);
-            SearchFilter searchFilter = new SearchFilter(searchParams);
-            AtlasTypesDef searchDefs = 
atlasClientV2.getAllTypeDefs(searchFilter);
+
+            SearchFilter  searchFilter = new SearchFilter(searchParams);
+            AtlasTypesDef searchDefs   = 
atlasClientV2.getAllTypeDefs(searchFilter);
 
             assert (!searchDefs.isEmpty());
+
             System.out.println("Created type [" + typeName + "]");
         }
     }
@@ -537,8 +628,8 @@ public class QuickStartV2 {
     private void lineage() throws AtlasServiceException {
         System.out.println("\nSample Lineage Info: ");
 
-        AtlasLineageInfo lineageInfo = 
atlasClientV2.getLineageInfo(getTableId(SALES_FACT_DAILY_MV_TABLE), 
LineageDirection.BOTH, 0);
-        Set<LineageRelation> relations = lineageInfo.getRelations();
+        AtlasLineageInfo               lineageInfo   = 
atlasClientV2.getLineageInfo(getTableId(SALES_FACT_DAILY_MV_TABLE), 
LineageDirection.BOTH, 0);
+        Set<LineageRelation>           relations     = 
lineageInfo.getRelations();
         Map<String, AtlasEntityHeader> guidEntityMap = 
lineageInfo.getGuidEntityMap();
 
         for (LineageRelation relation : relations) {
@@ -551,10 +642,9 @@ public class QuickStartV2 {
     }
 
     private String getTableId(String tableName) throws AtlasServiceException {
-        Map<String, String> attributes = new HashMap<>();
-        attributes.put(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, tableName);
+        Map<String, String> attributes  = 
Collections.singletonMap(REFERENCEABLE_ATTRIBUTE_NAME, tableName + 
CLUSTER_SUFFIX);
+        AtlasEntity         tableEntity = 
atlasClientV2.getEntityByAttribute(TABLE_TYPE, attributes).getEntity();
 
-        AtlasEntity tableEntity = 
atlasClientV2.getEntityByAttribute(TABLE_TYPE, attributes).getEntity();
         return tableEntity.getGuid();
     }
-}
+}
\ No newline at end of file
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 02041ac..496a0e2 100644
--- a/webapp/src/test/java/org/apache/atlas/examples/QuickStartV2IT.java
+++ b/webapp/src/test/java/org/apache/atlas/examples/QuickStartV2IT.java
@@ -18,9 +18,9 @@
 
 package org.apache.atlas.examples;
 
-import org.apache.atlas.AtlasClient;
 import org.apache.atlas.AtlasServiceException;
 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.lineage.AtlasLineageInfo;
@@ -31,11 +31,24 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import java.util.ArrayList;
-import java.util.HashMap;
+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.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.AssertJUnit.assertTrue;
@@ -45,27 +58,30 @@ public class QuickStartV2IT extends BaseResourceIT {
     @BeforeClass
     public void runQuickStart() throws Exception {
         super.setUp();
+
         QuickStartV2.runQuickstart(new String[]{}, new String[]{"admin", 
"admin"});
     }
 
     @Test
     public void testDBIsAdded() throws Exception {
-        AtlasEntity db = getDB(QuickStartV2.SALES_DB);
+        AtlasEntity         db           = getDB(SALES_DB);
         Map<String, Object> dbAttributes = db.getAttributes();
-        assertEquals(QuickStartV2.SALES_DB, dbAttributes.get("name"));
+
+        assertEquals(SALES_DB, dbAttributes.get("name"));
         assertEquals("sales database", dbAttributes.get("description"));
     }
 
     private AtlasEntity getDB(String dbName) throws AtlasServiceException {
-        Map<String, String> attributes = new HashMap<>();
-        attributes.put("name", dbName);
-        AtlasEntity dbEntity = 
atlasClientV2.getEntityByAttribute(QuickStartV2.DATABASE_TYPE, 
attributes).getEntity();
+        Map<String, String> attributes = 
Collections.singletonMap(REFERENCEABLE_ATTRIBUTE_NAME, dbName + CLUSTER_SUFFIX);
+        AtlasEntity         dbEntity   = 
atlasClientV2.getEntityByAttribute(QuickStartV2.DATABASE_TYPE, 
attributes).getEntity();
+
         return dbEntity;
     }
 
     @Test
     public void testTablesAreAdded() throws AtlasServiceException {
-        AtlasEntity table = getTable(QuickStart.SALES_FACT_TABLE);
+        AtlasEntity table = getTable(SALES_FACT_TABLE);
+
         verifySimpleTableAttributes(table);
 
         verifyDBIsLinkedToTable(table);
@@ -76,67 +92,72 @@ public class QuickStartV2IT extends BaseResourceIT {
     }
 
     private AtlasEntity getTable(String tableName) throws 
AtlasServiceException {
-        Map<String, String> attributes = new HashMap<>();
-        attributes.put(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, tableName);
-        AtlasEntity tableEntity = 
atlasClientV2.getEntityByAttribute(QuickStartV2.TABLE_TYPE, 
attributes).getEntity();
+        Map<String, String> attributes  = 
Collections.singletonMap(REFERENCEABLE_ATTRIBUTE_NAME, tableName + 
CLUSTER_SUFFIX);
+        AtlasEntity         tableEntity = 
atlasClientV2.getEntityByAttribute(QuickStartV2.TABLE_TYPE, 
attributes).getEntity();
+
         return tableEntity;
     }
 
     private AtlasEntity getProcess(String processName) throws 
AtlasServiceException {
-        Map<String, String> attributes = new HashMap<>();
-        attributes.put(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, processName);
-        AtlasEntity processEntity = 
atlasClientV2.getEntityByAttribute(QuickStartV2.LOAD_PROCESS_TYPE, 
attributes).getEntity();
+        Map<String, String> attributes    = 
Collections.singletonMap(REFERENCEABLE_ATTRIBUTE_NAME, processName + 
CLUSTER_SUFFIX);
+        AtlasEntity         processEntity = 
atlasClientV2.getEntityByAttribute(LOAD_PROCESS_TYPE, attributes).getEntity();
+
         return processEntity;
     }
 
 
     private void verifyTrait(AtlasEntity table) throws AtlasServiceException {
-        AtlasClassification.AtlasClassifications classfications = 
atlasClientV2.getClassifications(table.getGuid());
-        List<AtlasClassification> traits = classfications.getList();
+        AtlasClassifications      classfications = 
atlasClientV2.getClassifications(table.getGuid());
+        List<AtlasClassification> traits         = classfications.getList();
+
         assertNotNull(traits.get(0).getTypeName());
     }
 
     private void verifyColumnsAreAddedToTable(AtlasEntity table) {
-        Map<String, Object> tableAttributes = table.getAttributes();
-        List<Map> columns = (List<Map>) tableAttributes.get("columns");
+        Map<String, Object> tableAttributes = 
table.getRelationshipAttributes();
+        List<Map>           columns         = (List<Map>) 
tableAttributes.get("columns");
+
         assertEquals(4, columns.size());
 
         for (Map colMap : columns) {
             String colGuid = (String) colMap.get("guid");
+
             assertNotNull(UUID.fromString(colGuid));
         }
     }
 
     private void verifyDBIsLinkedToTable(AtlasEntity table) throws 
AtlasServiceException {
-        AtlasEntity db = getDB(QuickStartV2.SALES_DB);
-        Map<String, Object> tableAttributes = table.getAttributes();
-        Map dbFromTable = (Map) tableAttributes.get("db");
+        AtlasEntity         db              = getDB(SALES_DB);
+        Map<String, Object> tableAttributes = 
table.getRelationshipAttributes();
+        Map                 dbFromTable     = (Map) tableAttributes.get("db");
+
         assertEquals(db.getGuid(), dbFromTable.get("guid"));
     }
 
     private void verifySimpleTableAttributes(AtlasEntity table) {
         Map<String, Object> tableAttributes = table.getAttributes();
-        assertEquals(QuickStartV2.SALES_FACT_TABLE, 
tableAttributes.get("name"));
+
+        assertEquals(SALES_FACT_TABLE, tableAttributes.get("name"));
         assertEquals("sales fact table", tableAttributes.get("description"));
     }
 
     @Test
     public void testProcessIsAdded() throws AtlasServiceException {
-        Map<String, String> attributes = new HashMap<>();
-        attributes.put(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, 
QuickStartV2.LOAD_SALES_DAILY_PROCESS);
-        AtlasEntity loadProcess = 
atlasClientV2.getEntityByAttribute(QuickStartV2.LOAD_PROCESS_TYPE, 
attributes).getEntity();
+        Map<String, String> attributes         = 
Collections.singletonMap(REFERENCEABLE_ATTRIBUTE_NAME, LOAD_SALES_DAILY_PROCESS 
+ CLUSTER_SUFFIX);
+        AtlasEntity         loadProcess        = 
atlasClientV2.getEntityByAttribute(LOAD_PROCESS_TYPE, attributes).getEntity();
+        Map                 loadProcessAttribs = loadProcess.getAttributes();
 
-        Map loadProcessAttribs = loadProcess.getAttributes();
-        assertEquals(QuickStartV2.LOAD_SALES_DAILY_PROCESS, 
loadProcessAttribs.get(AtlasClient.NAME));
+        assertEquals(LOAD_SALES_DAILY_PROCESS, loadProcessAttribs.get(NAME));
         assertEquals("hive query for daily summary", 
loadProcessAttribs.get("description"));
 
         List inputs = (List) loadProcessAttribs.get("inputs");
         List outputs = (List) loadProcessAttribs.get("outputs");
+
         assertEquals(2, inputs.size());
 
-        String salesFactTableId = getTableId(QuickStartV2.SALES_FACT_TABLE);
-        String timeDimTableId = getTableId(QuickStartV2.TIME_DIM_TABLE);
-        String salesFactDailyMVId = 
getTableId(QuickStartV2.SALES_FACT_DAILY_MV_TABLE);
+        String salesFactTableId   = getTableId(SALES_FACT_TABLE);
+        String timeDimTableId     = getTableId(TIME_DIM_TABLE);
+        String salesFactDailyMVId = getTableId(SALES_FACT_DAILY_MV_TABLE);
 
         assertEquals(salesFactTableId, ((Map) inputs.get(0)).get("guid"));
         assertEquals(timeDimTableId, ((Map) inputs.get(1)).get("guid"));
@@ -153,16 +174,16 @@ public class QuickStartV2IT extends BaseResourceIT {
 
     @Test
     public void testLineageIsMaintained() throws AtlasServiceException {
-        String salesFactTableId      = 
getTableId(QuickStartV2.SALES_FACT_TABLE);
-        String timeDimTableId        = getTableId(QuickStartV2.TIME_DIM_TABLE);
-        String salesFactDailyMVId    = 
getTableId(QuickStartV2.SALES_FACT_DAILY_MV_TABLE);
-        String salesFactMonthlyMvId  = 
getTableId(QuickStartV2.SALES_FACT_MONTHLY_MV_TABLE);
-        String salesDailyProcessId   = 
getProcessId(QuickStartV2.LOAD_SALES_DAILY_PROCESS);
-        String salesMonthlyProcessId = 
getProcessId(QuickStartV2.LOAD_SALES_MONTHLY_PROCESS);
+        String salesFactTableId      = getTableId(SALES_FACT_TABLE);
+        String timeDimTableId        = getTableId(TIME_DIM_TABLE);
+        String salesFactDailyMVId    = getTableId(SALES_FACT_DAILY_MV_TABLE);
+        String salesFactMonthlyMvId  = getTableId(SALES_FACT_MONTHLY_MV_TABLE);
+        String salesDailyProcessId   = getProcessId(LOAD_SALES_DAILY_PROCESS);
+        String salesMonthlyProcessId = 
getProcessId(LOAD_SALES_MONTHLY_PROCESS);
 
-        AtlasLineageInfo inputLineage = 
atlasClientV2.getLineageInfo(salesFactDailyMVId, LineageDirection.BOTH, 0);
-        List<LineageRelation> relations = new 
ArrayList<>(inputLineage.getRelations());
-        Map<String, AtlasEntityHeader> entityMap = 
inputLineage.getGuidEntityMap();
+        AtlasLineageInfo               inputLineage = 
atlasClientV2.getLineageInfo(salesFactDailyMVId, LineageDirection.BOTH, 0);
+        List<LineageRelation>          relations    = new 
ArrayList<>(inputLineage.getRelations());
+        Map<String, AtlasEntityHeader> entityMap    = 
inputLineage.getGuidEntityMap();
 
         assertEquals(relations.size(), 5);
         assertEquals(entityMap.size(), 6);
@@ -177,15 +198,17 @@ public class QuickStartV2IT extends BaseResourceIT {
 
     @Test
     public void testViewIsAdded() throws AtlasServiceException {
-        Map<String, String> attributes = new HashMap<>();
-        attributes.put(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, 
QuickStartV2.PRODUCT_DIM_VIEW);
-        AtlasEntity view = 
atlasClientV2.getEntityByAttribute(QuickStartV2.VIEW_TYPE, 
attributes).getEntity();
-        Map<String, Object> viewAttributes = view.getAttributes();
-        assertEquals(QuickStartV2.PRODUCT_DIM_VIEW, 
viewAttributes.get(AtlasClient.NAME));
-
-        String productDimId = 
getTable(QuickStartV2.PRODUCT_DIM_TABLE).getGuid();
-        List inputTables = (List) viewAttributes.get("inputTables");
-        Map inputTablesMap = (Map) inputTables.get(0);
+        Map<String, String> attributes                 = 
Collections.singletonMap(REFERENCEABLE_ATTRIBUTE_NAME, PRODUCT_DIM_VIEW + 
CLUSTER_SUFFIX);
+        AtlasEntity         view                       = 
atlasClientV2.getEntityByAttribute(VIEW_TYPE, attributes).getEntity();
+        Map<String, Object> viewAttributes             = view.getAttributes();
+        Map<String, Object> viewRelationshipAttributes = 
view.getRelationshipAttributes();
+
+        assertEquals(PRODUCT_DIM_VIEW, viewAttributes.get(NAME));
+
+        String productDimId   = getTable(PRODUCT_DIM_TABLE).getGuid();
+        List   inputTables    = (List) 
viewRelationshipAttributes.get("inputTables");
+        Map    inputTablesMap = (Map) inputTables.get(0);
+
         assertEquals(productDimId, inputTablesMap.get("guid"));
     }
 }

Reply via email to