atlas-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mad...@apache.org
Subject [2/2] incubator-atlas git commit: ATLAS-1498: added unit-tests to validate handling of array/map/struct attributes in entity create/update
Date Fri, 27 Jan 2017 00:04:30 GMT
ATLAS-1498: added unit-tests to validate handling of array/map/struct attributes in entity create/update

Signed-off-by: Madhan Neethiraj <madhan@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/incubator-atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-atlas/commit/6ccba52c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-atlas/tree/6ccba52c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-atlas/diff/6ccba52c

Branch: refs/heads/master
Commit: 6ccba52c293d4c7e419a63326665faee7db9f231
Parents: 19a5f65
Author: Suma Shivaprasad <sumasai.shivaprasad@gmail.com>
Authored: Thu Jan 26 16:03:12 2017 -0800
Committer: Madhan Neethiraj <madhan@apache.org>
Committed: Thu Jan 26 16:04:19 2017 -0800

----------------------------------------------------------------------
 .../java/org/apache/atlas/AtlasErrorCode.java   |   2 +-
 .../atlas/model/instance/AtlasStruct.java       |   3 +-
 .../model/instance/EntityMutationResponse.java  |  53 +-
 .../apache/atlas/type/AtlasBuiltInTypes.java    |   6 +
 .../org/apache/atlas/type/AtlasMapType.java     |   6 +-
 .../org/apache/atlas/type/AtlasStructType.java  |   1 +
 .../java/org/apache/atlas/type/AtlasType.java   |   6 +-
 .../test/java/org/apache/atlas/TestUtilsV2.java |  14 +-
 release-log.txt                                 |   1 +
 .../store/graph/v1/ArrayVertexMapper.java       |   2 +-
 .../graph/v1/AtlasEntityGraphDiscoveryV1.java   |  51 +-
 .../store/graph/v1/AtlasEntityStoreV1.java      |  94 ++--
 .../store/graph/v1/AtlasGraphUtilsV1.java       |   6 +-
 .../store/graph/v1/AtlasStructDefStoreV1.java   |   3 +-
 .../store/graph/v1/DeleteHandlerV1.java         |   8 +-
 .../store/graph/v1/EntityGraphMapper.java       |  48 +-
 .../store/graph/v1/EntityMutationContext.java   |   9 +-
 .../store/graph/v1/GraphMutationContext.java    |  27 +-
 .../store/graph/v1/IDBasedEntityResolver.java   |   2 +-
 .../store/graph/v1/MapVertexMapper.java         |   9 +-
 .../store/graph/v1/StructVertexMapper.java      | 107 ++--
 .../graph/v1/UniqAttrBasedEntityResolver.java   |   8 +-
 .../store/graph/v1/AtlasEntityStoreV1Test.java  | 541 +++++++++++++++++--
 .../adapters/AtlasEntityFormatConverter.java    |   4 +-
 .../web/adapters/AtlasInstanceRestAdapters.java |  13 +-
 .../atlas/web/adapters/TestEntitiesREST.java    |  13 +-
 26 files changed, 812 insertions(+), 225 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
index e4f3dfd..e7dbb1c 100644
--- a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
+++ b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
@@ -60,7 +60,7 @@ public enum AtlasErrorCode {
     TYPE_NAME_NOT_FOUND(404, "ATLAS4041E", "Given typename {0} was invalid"),
     TYPE_GUID_NOT_FOUND(404, "ATLAS4042E", "Given type guid {0} was invalid"),
     EMPTY_RESULTS(404, "ATLAS4044E", "No result found for {0}"),
-    INSTANCE_GUID_NOT_FOUND(404, "ATLAS4045E", "Given instance guid {0} is invalid"),
+    INSTANCE_GUID_NOT_FOUND(404, "ATLAS4045E", "Given instance guid {0} is invalid/not found"),
     INSTANCE_LINEAGE_INVALID_PARAMS(404, "ATLAS4046E", "Invalid lineage query parameters passed {0}: {1}"),
     INSTANCE_LINEAGE_QUERY_FAILED(404, "ATLAS4047E", "Instance lineage query failed {0}"),
     DISCOVERY_QUERY_FAILED(404, "ATLAS4048E", "Discovery query failed {0}"),

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/intg/src/main/java/org/apache/atlas/model/instance/AtlasStruct.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/model/instance/AtlasStruct.java b/intg/src/main/java/org/apache/atlas/model/instance/AtlasStruct.java
index 794310a..c23f4d5 100644
--- a/intg/src/main/java/org/apache/atlas/model/instance/AtlasStruct.java
+++ b/intg/src/main/java/org/apache/atlas/model/instance/AtlasStruct.java
@@ -146,8 +146,9 @@ public class AtlasStruct implements Serializable {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         AtlasStruct that = (AtlasStruct) o;
+
         return Objects.equals(typeName, that.typeName) &&
-                Objects.equals(attributes, that.attributes);
+            Objects.equals(attributes, that.attributes);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/intg/src/main/java/org/apache/atlas/model/instance/EntityMutationResponse.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/model/instance/EntityMutationResponse.java b/intg/src/main/java/org/apache/atlas/model/instance/EntityMutationResponse.java
index 8aba1fb..c9b6e97 100644
--- a/intg/src/main/java/org/apache/atlas/model/instance/EntityMutationResponse.java
+++ b/intg/src/main/java/org/apache/atlas/model/instance/EntityMutationResponse.java
@@ -18,9 +18,11 @@
 package org.apache.atlas.model.instance;
 
 
+import org.apache.atlas.model.typedef.AtlasBaseTypeDef;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
 import org.codehaus.jackson.annotate.JsonAutoDetect;
+import org.codehaus.jackson.annotate.JsonIgnore;
 import org.codehaus.jackson.annotate.JsonIgnoreProperties;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 
@@ -43,7 +45,7 @@ import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONL
 @XmlAccessorType(XmlAccessType.PROPERTY)
 public class EntityMutationResponse {
 
-    Map<EntityMutations.EntityOperation, List<AtlasEntityHeader>> entitiesMutated = new HashMap<>();
+    Map<EntityMutations.EntityOperation, List<AtlasEntityHeader>> entitiesMutated;
 
     public EntityMutationResponse() {
     }
@@ -67,15 +69,39 @@ public class EntityMutationResponse {
         return null;
     }
 
+    @JsonIgnore
+    public AtlasEntityHeader getFirstEntityCreated() {
+        final List<AtlasEntityHeader> entitiesByOperation = getEntitiesByOperation(EntityMutations.EntityOperation.CREATE);
+        if ( entitiesByOperation != null && entitiesByOperation.size() > 0) {
+            return entitiesByOperation.get(0);
+        }
+
+        return null;
+    }
+
+    @JsonIgnore
+    public AtlasEntityHeader getFirstEntityUpdated() {
+        final List<AtlasEntityHeader> entitiesByOperation = getEntitiesByOperation(EntityMutations.EntityOperation.UPDATE);
+        if ( entitiesByOperation != null && entitiesByOperation.size() > 0) {
+            return entitiesByOperation.get(0);
+        }
+
+        return null;
+    }
+
     public void addEntity(EntityMutations.EntityOperation op, AtlasEntityHeader header) {
         if (entitiesMutated == null) {
             entitiesMutated = new HashMap<>();
         }
 
-        if (entitiesMutated != null && entitiesMutated.get(op) == null) {
-            entitiesMutated.put(op, new ArrayList<AtlasEntityHeader>());
+        List<AtlasEntityHeader> opEntities = entitiesMutated.get(op);
+
+        if (opEntities == null) {
+            opEntities = new ArrayList<>();
+            entitiesMutated.put(op, opEntities);
         }
-        entitiesMutated.get(op).add(header);
+
+        opEntities.add(header);
     }
 
 
@@ -84,24 +110,7 @@ public class EntityMutationResponse {
             sb = new StringBuilder();
         }
 
-        if (MapUtils.isNotEmpty(entitiesMutated)) {
-            int i = 0;
-            for (Map.Entry<EntityMutations.EntityOperation, List<AtlasEntityHeader>> e : entitiesMutated.entrySet()) {
-                if (i > 0) {
-                    sb.append(",");
-                }
-                sb.append(e.getKey()).append(":");
-                if (CollectionUtils.isNotEmpty(e.getValue())) {
-                    for (int j = 0; i < e.getValue().size(); j++) {
-                        if (j > 0) {
-                            sb.append(",");
-                        }
-                        e.getValue().get(i).toString(sb);
-                    }
-                }
-                i++;
-            }
-        }
+        AtlasBaseTypeDef.dumpObjects(entitiesMutated, sb);
 
         return sb;
     }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/intg/src/main/java/org/apache/atlas/type/AtlasBuiltInTypes.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasBuiltInTypes.java b/intg/src/main/java/org/apache/atlas/type/AtlasBuiltInTypes.java
index 5ad3a55..a25f3f6 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasBuiltInTypes.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasBuiltInTypes.java
@@ -477,6 +477,7 @@ public class AtlasBuiltInTypes {
      */
     public static class AtlasStringType extends AtlasType {
         private static final String DEFAULT_VALUE = "";
+        private static final String OPTIONAL_DEFAULT_VALUE = null;
 
         public AtlasStringType() {
             super(AtlasBaseTypeDef.ATLAS_TYPE_STRING, TypeCategory.PRIMITIVE);
@@ -488,6 +489,11 @@ public class AtlasBuiltInTypes {
         }
 
         @Override
+        public Object createOptionalDefaultValue() {
+            return OPTIONAL_DEFAULT_VALUE;
+        }
+
+        @Override
         public boolean isValidValue(Object obj) {
             return true;
         }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/intg/src/main/java/org/apache/atlas/type/AtlasMapType.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasMapType.java b/intg/src/main/java/org/apache/atlas/type/AtlasMapType.java
index 6e6c522..7624bc1 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasMapType.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasMapType.java
@@ -95,7 +95,11 @@ public class AtlasMapType extends AtlasType {
     public Map<Object, Object>  createDefaultValue() {
         Map<Object, Object> ret = new HashMap<>();
 
-        ret.put(keyType.createDefaultValue(), valueType.createDefaultValue());
+        Object key = keyType.createDefaultValue();
+
+        if ( key != null) {
+            ret.put(key, valueType.createDefaultValue());
+        }
 
         return ret;
     }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java b/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java
index 4712508..bac5800 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java
@@ -328,6 +328,7 @@ public class AtlasStructType extends AtlasType {
 
             if (attribute != null) {
                 AtlasType dataType = attribute.getAttributeType();
+
                 ret = dataType.createDefaultValue();
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/intg/src/main/java/org/apache/atlas/type/AtlasType.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasType.java b/intg/src/main/java/org/apache/atlas/type/AtlasType.java
index 6ea34b3..de71d11 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasType.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasType.java
@@ -33,7 +33,7 @@ import java.util.List;
 public abstract class AtlasType {
 
     private static final Gson GSON =
-            new GsonBuilder().setDateFormat(AtlasBaseTypeDef.SERIALIZED_DATE_FORMAT_STR).create();
+            new GsonBuilder().serializeNulls().setDateFormat(AtlasBaseTypeDef.SERIALIZED_DATE_FORMAT_STR).create();
 
     private final String       typeName;
     private final TypeCategory typeCategory;
@@ -59,6 +59,10 @@ public abstract class AtlasType {
 
     public abstract Object createDefaultValue();
 
+    public Object createOptionalDefaultValue() {
+        return createDefaultValue();
+    }
+
     public abstract boolean isValidValue(Object obj);
 
     public abstract Object getNormalizedValue(Object obj);

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/intg/src/test/java/org/apache/atlas/TestUtilsV2.java
----------------------------------------------------------------------
diff --git a/intg/src/test/java/org/apache/atlas/TestUtilsV2.java b/intg/src/test/java/org/apache/atlas/TestUtilsV2.java
index f9040f3..4f2916c 100755
--- a/intg/src/test/java/org/apache/atlas/TestUtilsV2.java
+++ b/intg/src/test/java/org/apache/atlas/TestUtilsV2.java
@@ -71,7 +71,7 @@ public final class TestUtilsV2 {
                 new AtlasEnumDef("OrgLevel", "OrgLevel"+_description, "1.0",
                         Arrays.asList(
                                 new AtlasEnumElementDef("L1", "Element"+_description, 1),
-                                new AtlasEnumElementDef("L1", "Element"+_description, 2)
+                                new AtlasEnumElementDef("L2", "Element"+_description, 2)
                         ));
 
         AtlasStructDef addressDetails =
@@ -149,7 +149,7 @@ public final class TestUtilsV2 {
                 new AtlasEnumDef("OrgLevel", "OrgLevel"+_description, "1.0",
                         Arrays.asList(
                                 new AtlasEnumElementDef("L1", "Element"+ _description, 1),
-                                new AtlasEnumElementDef("L1", "Element"+ _description, 2)
+                                new AtlasEnumElementDef("L2", "Element"+ _description, 2)
                         ));
 
         AtlasStructDef addressDetails =
@@ -443,6 +443,7 @@ public final class TestUtilsV2 {
         AtlasEntityDef databaseTypeDefinition =
                 AtlasTypeUtil.createClassTypeDef(DATABASE_TYPE, DATABASE_TYPE + _description,ImmutableSet.of(SUPER_TYPE_NAME),
                         AtlasTypeUtil.createUniqueRequiredAttrDef(NAME, "string"),
+                        AtlasTypeUtil.createOptionalAttrDef("isReplicated", "boolean"),
                         AtlasTypeUtil.createOptionalAttrDef("created", "string"),
                         AtlasTypeUtil.createRequiredAttrDef("description", "string"));
 
@@ -543,7 +544,7 @@ public final class TestUtilsV2 {
         AtlasEntityDef tableTypeDefinition =
                 AtlasTypeUtil.createClassTypeDef(TABLE_TYPE, TABLE_TYPE + _description, ImmutableSet.of(SUPER_TYPE_NAME),
                         AtlasTypeUtil.createUniqueRequiredAttrDef("name", "string"),
-                        AtlasTypeUtil.createRequiredAttrDef("description", "string"),
+                        AtlasTypeUtil.createOptionalAttrDef("description", "string"),
                         AtlasTypeUtil.createRequiredAttrDef("type", "string"),
                         AtlasTypeUtil.createOptionalAttrDef("created", "date"),
                         // enum
@@ -582,6 +583,11 @@ public final class TestUtilsV2 {
                                 AtlasAttributeDef.Cardinality.SINGLE, 0, 1,
                                 false, false,
                                 Collections.<AtlasStructDef.AtlasConstraintDef>emptyList()),
+
+                      // new ArrayList<AtlasStructDef.AtlasConstraintDef>() {{
+                     //add(new AtlasStructDef.AtlasConstraintDef(
+                       // AtlasStructDef.AtlasConstraintDef.CONSTRAINT_TYPE_MAPPED_FROM_REF, new HashMap<String, Object>()));
+                       //}}),
                         //map of structs
                         new AtlasAttributeDef("partitionsMap",
                                 String.format("map<%s,%s>", "string", "partition_struct_type"),
@@ -646,7 +652,7 @@ public final class TestUtilsV2 {
         entity.setAttribute("description", "random table");
         entity.setAttribute("type", "type");
         entity.setAttribute("tableType", "MANAGED");
-        entity.setAttribute("database", dbId);
+        entity.setAttribute("database", new AtlasObjectId(DATABASE_TYPE, dbId));
         entity.setAttribute("created", new Date());
 
         Map<String, Object> partAttributes = new HashMap<String, Object>() {{

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/release-log.txt
----------------------------------------------------------------------
diff --git a/release-log.txt b/release-log.txt
index a293bf1..108d86b 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -9,6 +9,7 @@ ATLAS-1060 Add composite indexes for exact match performance improvements for al
 ATLAS-1127 Modify creation and modification timestamps to Date instead of Long(sumasai)
 
 ALL CHANGES:
+ATLAS-1498 added unit-tests to validate handling of array/map/struct attributes in entity create/update (sumasai via mneethiraj)
 ATLAS-1114 Performance improvements for create/update entity (jnhagelb)
 ATLAS-1403 Perf and stability improvements to DSL search and lineage query execution (sarath.kum4r@gmail.com via mneethiraj)
 ATLAS-1425 Integrate Discovery/Search API in Atlas UI (kevalbhatt via mneethiraj)

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/ArrayVertexMapper.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/ArrayVertexMapper.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/ArrayVertexMapper.java
index 528430c..e63ea6e 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/ArrayVertexMapper.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/ArrayVertexMapper.java
@@ -82,7 +82,7 @@ public class ArrayVertexMapper implements InstanceGraphMapper<List> {
 
                 Optional<AtlasEdge> existingEdge = getEdgeAt(currentElements, index, arrType.getElementType());
 
-                GraphMutationContext arrCtx = new GraphMutationContext.Builder(ctx.getAttribute(),
+                GraphMutationContext arrCtx = new GraphMutationContext.Builder(ctx.getOp(), ctx.getAttribute(),
                     arrType.getElementType(), newElements.get(index))
                     .referringVertex(ctx.getReferringVertex())
                     .edge(existingEdge)

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityGraphDiscoveryV1.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityGraphDiscoveryV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityGraphDiscoveryV1.java
index b874c5d..4f5b4f4 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityGraphDiscoveryV1.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityGraphDiscoveryV1.java
@@ -18,8 +18,8 @@
 package org.apache.atlas.repository.store.graph.v1;
 
 import atlas.shaded.hbase.guava.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableMap;
 import com.google.inject.Provider;
+import org.apache.atlas.AtlasErrorCode;
 import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.model.TypeCategory;
 import org.apache.atlas.model.instance.AtlasEntity;
@@ -112,7 +112,11 @@ public class AtlasEntityGraphDiscoveryV1 implements EntityGraphDiscovery {
 
     protected void discover(final List<AtlasEntity> entities) throws AtlasBaseException {
         for (AtlasEntity entity : entities) {
-            AtlasType type = typeRegistry.getType(entity.getTypeName());
+            AtlasEntityType type = typeRegistry.getEntityTypeByName(entity.getTypeName());
+
+            if (type == null) {
+                throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID, TypeCategory.ENTITY.name(), entity.getTypeName());
+            }
 
             discoveredEntities.addRootEntity(entity);
             walkEntityGraph(type, entity);
@@ -120,27 +124,24 @@ public class AtlasEntityGraphDiscoveryV1 implements EntityGraphDiscovery {
     }
 
     private void visitReference(AtlasEntityType type, Object entity, boolean isManagedEntity) throws AtlasBaseException {
-        if ( entity != null) {
-            if ( entity instanceof String ) {
-                String guid = (String) entity;
-                discoveredEntities.addUnResolvedIdReference(type, guid);
-            } else if ( entity instanceof AtlasObjectId ) {
+        if (entity != null) {
+            if (entity instanceof AtlasObjectId) {
                 final String guid = ((AtlasObjectId) entity).getGuid();
                 discoveredEntities.addUnResolvedIdReference(type, guid);
-            } else if ( entity instanceof  AtlasEntity ) {
-                AtlasEntity entityObj = ( AtlasEntity ) entity;
-                if (!processedIds.contains(entityObj.getGuid())) {
-                    processedIds.add(entityObj.getGuid());
+            } else if (entity instanceof AtlasEntity) {
+                AtlasEntity entityObj = (AtlasEntity) entity;
+                if (isManagedEntity) {
+                    if (!processedIds.contains(entityObj.getGuid())) {
+                        processedIds.add(entityObj.getGuid());
 
-                    if ( isManagedEntity ) {
                         discoveredEntities.addRootEntity(entityObj);
                         visitStruct(type, entityObj);
-                    } else if ( entity instanceof AtlasObjectId) {
-                        discoveredEntities.addUnResolvedIdReference(type, ((AtlasObjectId) entity).getGuid());
-                    } else {
-                        discoveredEntities.addUnResolvedEntityReference(entityObj);
                     }
+                } else {
+                    discoveredEntities.addUnResolvedEntityReference(entityObj);
                 }
+            } else {
+                throw new AtlasBaseException(AtlasErrorCode.INSTANCE_CRUD_INVALID_PARAMS, "Invalid object type " + entity.getClass());
             }
         }
     }
@@ -161,12 +162,14 @@ public class AtlasEntityGraphDiscoveryV1 implements EntityGraphDiscovery {
             } else if (attrType.getTypeCategory() == TypeCategory.STRUCT) {
                 visitStruct(attrType, val);
             } else if (attrType.getTypeCategory() == TypeCategory.ENTITY) {
-                if ( val instanceof AtlasObjectId || val instanceof String) {
+                if ( val instanceof AtlasObjectId) {
                     visitReference((AtlasEntityType) attrType,  val, false);
                 } else if ( val instanceof AtlasEntity ) {
                     //TODO - Change this to foreign key checks after changes in the model
                    if ( parentType.isMappedFromRefAttribute(attrDef.getName())) {
                        visitReference((AtlasEntityType) attrType,  val, true);
+                   } else {
+                       visitReference((AtlasEntityType) attrType,  val, false);
                    }
                 }
             }
@@ -179,10 +182,9 @@ public class AtlasEntityGraphDiscoveryV1 implements EntityGraphDiscovery {
         }
 
         if (val != null) {
-            Iterator<Map.Entry> it = null;
+
             if (Map.class.isAssignableFrom(val.getClass())) {
-                it = ((Map) val).entrySet().iterator();
-                ImmutableMap.Builder b = ImmutableMap.builder();
+                Iterator<Map.Entry> it = ((Map) val).entrySet().iterator();
                 while (it.hasNext()) {
                     Map.Entry e = it.next();
                     visitAttribute(parentType, keyType, attrDef, e.getKey());
@@ -224,11 +226,10 @@ public class AtlasEntityGraphDiscoveryV1 implements EntityGraphDiscovery {
 
         AtlasStructType structType = (AtlasStructType) type;
 
-        for (AtlasStructDef.AtlasAttributeDef attributeDef : structType.getStructDef().getAttributeDefs()) {
-            String attrName = attributeDef.getName();
-            AtlasType attrType = structType.getAttributeType(attrName);
-            Object attrVal = ((AtlasStruct) val).getAttribute(attrName);
-            visitAttribute(structType, attrType, attributeDef, attrVal);
+        for (AtlasStructType.AtlasAttribute attribute : structType.getAllAttributes().values()) {
+            AtlasType attrType = attribute.getAttributeType();
+            Object attrVal = ((AtlasStruct) val).getAttribute(attribute.getAttributeDef().getName());
+            visitAttribute(structType, attrType, attribute.getAttributeDef(), attrVal);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java
index 18e397b..48bb77e 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1.java
@@ -70,43 +70,6 @@ public class AtlasEntityStoreV1 implements AtlasEntityStore {
         return createOrUpdate(new ArrayList<AtlasEntity>() {{ add(entity); }});
     }
 
-    public EntityMutationContext preCreateOrUpdate(final List<AtlasEntity> atlasEntities) throws AtlasBaseException {
-
-        EntityGraphDiscoveryContext discoveredEntities = graphDiscoverer.discoverEntities(atlasEntities);
-        EntityMutationContext context = new EntityMutationContext(discoveredEntities);
-        for (AtlasEntity entity : discoveredEntities.getRootEntities()) {
-
-            AtlasVertex vertex = null;
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("<== AtlasEntityStoreV1.preCreateOrUpdate({}): {}", entity);
-            }
-
-            AtlasEntityType entityType = (AtlasEntityType) typeRegistry.getType(entity.getTypeName());
-
-            if ( discoveredEntities.isResolved(entity.getGuid()) ) {
-                vertex = discoveredEntities.getResolvedReference(entity.getGuid());
-                context.addUpdated(entity, entityType, vertex);
-
-                String guid = AtlasGraphUtilsV1.getIdFromVertex(vertex);
-                RequestContextV1.get().recordEntityUpdate(guid);
-            } else {
-                //Create vertices which do not exist in the repository
-                vertex = graphMapper.createVertexTemplate(entity, entityType);
-                context.addCreated(entity, entityType, vertex);
-                discoveredEntities.addRepositoryResolvedReference(new AtlasObjectId(entityType.getTypeName(), entity.getGuid()), vertex);
-
-                String guid = AtlasGraphUtilsV1.getIdFromVertex(vertex);
-                RequestContextV1.get().recordEntityCreate(guid);
-            }
-
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("<== AtlasEntityStoreV1.preCreateOrUpdate({}): {}", entity, vertex);
-            }
-        }
-
-        return context;
-    }
-
     @Override
     public EntityMutationResponse updateById(final String guid, final AtlasEntity entity) {
         return null;
@@ -205,15 +168,56 @@ public class AtlasEntityStoreV1 implements AtlasEntityStore {
         return null;
     }
 
+    private EntityMutationContext preCreateOrUpdate(final List<AtlasEntity> atlasEntities) throws AtlasBaseException {
+
+        EntityGraphDiscoveryContext discoveredEntities = graphDiscoverer.discoverEntities(atlasEntities);
+        EntityMutationContext context = new EntityMutationContext(discoveredEntities);
+        for (AtlasEntity entity : discoveredEntities.getRootEntities()) {
+
+            AtlasVertex vertex = null;
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("<== AtlasEntityStoreV1.preCreateOrUpdate({}): {}", entity);
+            }
+
+            AtlasEntityType entityType = typeRegistry.getEntityTypeByName(entity.getTypeName());
+
+            if ( entityType == null) {
+                throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID, TypeCategory.ENTITY.name(), entity.getTypeName());
+            }
+
+            if ( discoveredEntities.isResolved(entity.getGuid()) ) {
+                vertex = discoveredEntities.getResolvedReference(entity.getGuid());
+                context.addUpdated(entity, entityType, vertex);
+
+                String guid = AtlasGraphUtilsV1.getIdFromVertex(vertex);
+                RequestContextV1.get().recordEntityUpdate(guid);
+            } else {
+                //Create vertices which do not exist in the repository
+                vertex = graphMapper.createVertexTemplate(entity, entityType);
+                context.addCreated(entity, entityType, vertex);
+                discoveredEntities.addRepositoryResolvedReference(new AtlasObjectId(entityType.getTypeName(), entity.getGuid()), vertex);
+
+                String guid = AtlasGraphUtilsV1.getIdFromVertex(vertex);
+                RequestContextV1.get().recordEntityCreate(guid);
+            }
+
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("<== AtlasEntityStoreV1.preCreateOrUpdate({}): {}", entity, vertex);
+            }
+        }
+
+        return context;
+    }
+
     private List<AtlasEntity> validateAndNormalize(final List<AtlasEntity> entities) throws AtlasBaseException {
 
         List<AtlasEntity> normalizedEntities = new ArrayList<>();
         List<String> messages = new ArrayList<>();
 
         for (AtlasEntity entity : entities) {
-            AtlasType type = typeRegistry.getType(entity.getTypeName());
-            if (type.getTypeCategory() != TypeCategory.ENTITY) {
-                throw new AtlasBaseException(AtlasErrorCode.TYPE_MATCH_FAILED, type.getTypeCategory().name(), TypeCategory.ENTITY.name());
+            AtlasEntityType type = typeRegistry.getEntityTypeByName(entity.getTypeName());
+            if (type == null) {
+                throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID, TypeCategory.ENTITY.name(), entity.getTypeName());
             }
 
             type.validateValue(entity, entity.getTypeName(), messages);
@@ -232,16 +236,6 @@ public class AtlasEntityStoreV1 implements AtlasEntityStore {
         return normalizedEntities;
     }
 
-    @VisibleForTesting
-    EntityGraphDiscovery getGraphDiscoverer() {
-        return graphDiscoverer;
-    }
-
-    @VisibleForTesting
-    void setGraphDiscoverer(EntityGraphDiscovery discoverer) {
-        this.graphDiscoverer = discoverer;
-    }
-
     public void cleanUp() throws AtlasBaseException {
         this.graphDiscoverer.cleanUp();
     }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasGraphUtilsV1.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasGraphUtilsV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasGraphUtilsV1.java
index 1947855..7fe5e14 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasGraphUtilsV1.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasGraphUtilsV1.java
@@ -94,8 +94,12 @@ public class AtlasGraphUtilsV1 {
         return PROPERTY_PREFIX + "edge." + fromNode + "." + toNode;
     }
 
+    public static String getEdgeLabel(String property) {
+        return GraphHelper.EDGE_LABEL_PREFIX + property;
+    }
+
     public static String getAttributeEdgeLabel(AtlasStructType fromType, String attributeName) throws AtlasBaseException {
-        return GraphHelper.EDGE_LABEL_PREFIX + getQualifiedAttributePropertyKey(fromType, attributeName);
+        return getEdgeLabel(getQualifiedAttributePropertyKey(fromType, attributeName));
     }
 
     public static String getQualifiedAttributePropertyKey(AtlasStructType fromType, String attributeName) throws AtlasBaseException {

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasStructDefStoreV1.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasStructDefStoreV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasStructDefStoreV1.java
index 425bde9..163ddef 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasStructDefStoreV1.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasStructDefStoreV1.java
@@ -25,6 +25,7 @@ import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
 import org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef;
 import org.apache.atlas.model.typedef.AtlasStructDef.AtlasStructDefs;
 import org.apache.atlas.repository.Constants;
+import org.apache.atlas.repository.graph.GraphHelper;
 import org.apache.atlas.repository.graphdb.AtlasVertex;
 import org.apache.atlas.repository.store.graph.AtlasStructDefStore;
 import org.apache.atlas.repository.util.FilterUtil;
@@ -462,7 +463,7 @@ public class AtlasStructDefStoreV1 extends AtlasAbstractDefStoreV1 implements At
         if (CollectionUtils.isNotEmpty(attrNames)) {
             for (String attrName : attrNames) {
                 String propertyKey = AtlasGraphUtilsV1.getTypeDefPropertyKey(ret, attrName);
-                String attribJson  = vertex.getProperty(propertyKey, String.class);
+                String attribJson  = vertex.getProperty(GraphHelper.encodePropertyKey(propertyKey), String.class);
 
                 attributeDefs.add(toAttributeDefFromJson(structDef, AtlasType.fromJson(attribJson, Map.class),
                                   typeDefStore));

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerV1.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerV1.java
index 3b557e6..34e02c6 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerV1.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerV1.java
@@ -18,6 +18,7 @@
 package org.apache.atlas.repository.store.graph.v1;
 
 
+import org.apache.atlas.AtlasErrorCode;
 import org.apache.atlas.AtlasException;
 import org.apache.atlas.RequestContextV1;
 import org.apache.atlas.exception.AtlasBaseException;
@@ -129,7 +130,12 @@ public abstract class DeleteHandlerV1 {
                 continue;
             }
             result.add(new GraphHelper.VertexInfo(guid, vertex, typeName));
-            AtlasEntityType entityType = (AtlasEntityType) typeRegistry.getType(typeName);
+            AtlasEntityType entityType = typeRegistry.getEntityTypeByName(typeName);
+
+            if (entityType == null) {
+                throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID, TypeCategory.ENTITY.name(), typeName);
+            }
+
             for (AtlasStructType.AtlasAttribute attributeInfo : entityType.getAllAttributes().values()) {
                 if (!entityType.isMappedFromRefAttribute(attributeInfo.getAttributeDef().getName())) {
                     continue;

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java
index 174e490..c98d340 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityGraphMapper.java
@@ -22,6 +22,7 @@ import com.google.inject.Inject;
 import org.apache.atlas.AtlasErrorCode;
 import org.apache.atlas.RequestContextV1;
 import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.TypeCategory;
 import org.apache.atlas.model.instance.AtlasEntity;
 import org.apache.atlas.model.instance.AtlasEntityHeader;
 import org.apache.atlas.model.instance.AtlasObjectId;
@@ -36,9 +37,11 @@ import org.apache.atlas.repository.graphdb.AtlasEdge;
 import org.apache.atlas.repository.graphdb.AtlasVertex;
 import org.apache.atlas.type.AtlasEntityType;
 import org.apache.atlas.type.AtlasStructType;
+import org.apache.atlas.type.AtlasType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Map;
 import java.util.UUID;
 
 public class EntityGraphMapper implements InstanceGraphMapper<AtlasEdge> {
@@ -86,13 +89,12 @@ public class EntityGraphMapper implements InstanceGraphMapper<AtlasEdge> {
         AtlasEdge result = null;
 
         String guid = getId(ctx.getValue());
-
         AtlasVertex entityVertex = context.getDiscoveryContext().getResolvedReference(guid);
-        String edgeLabel = AtlasGraphUtilsV1.getAttributeEdgeLabel(ctx.getParentType(), ctx.getAttributeDef().getName());
         if ( ctx.getCurrentEdge().isPresent() ) {
             updateEdge(ctx.getAttributeDef(), ctx.getValue(), ctx.getCurrentEdge().get(), entityVertex);
             result = ctx.getCurrentEdge().get();
-        } else {
+        } else if (ctx.getValue() != null) {
+            String edgeLabel = AtlasGraphUtilsV1.getEdgeLabel(ctx.getVertexPropertyKey());
             try {
                 result = graphHelper.getOrCreateEdge(ctx.getReferringVertex(), entityVertex, edgeLabel);
             } catch (RepositoryException e) {
@@ -112,7 +114,7 @@ public class EntityGraphMapper implements InstanceGraphMapper<AtlasEdge> {
         LOG.debug("Updating entity reference {} for reference attribute {}",  attributeDef.getName());
         // Update edge if it exists
 
-        AtlasVertex currentVertex = currentEdge.getOutVertex();
+        AtlasVertex currentVertex = currentEdge.getInVertex();
         String currentEntityId = AtlasGraphUtilsV1.getIdFromVertex(currentVertex);
         String newEntityId = getId(value);
         AtlasEdge newEdge = currentEdge;
@@ -140,17 +142,17 @@ public class EntityGraphMapper implements InstanceGraphMapper<AtlasEdge> {
         if (ctx.getCreatedEntities() != null) {
             for (AtlasEntity createdEntity : ctx.getCreatedEntities()) {
                 AtlasVertex vertex = ctx.getVertex(createdEntity);
-                structVertexMapper.mapAttributestoVertex((AtlasStructType) ctx.getType(createdEntity), createdEntity, vertex);
-                resp.addEntity(EntityMutations.EntityOperation.CREATE, constructHeader(createdEntity, vertex));
+                structVertexMapper.mapAttributestoVertex(EntityMutations.EntityOperation.CREATE, ctx.getType(createdEntity), createdEntity, vertex);
+                resp.addEntity(EntityMutations.EntityOperation.CREATE, constructHeader(createdEntity, ctx.getType(createdEntity), vertex));
             }
         }
 
         if (ctx.getUpdatedEntities() != null) {
             for (AtlasEntity updated : ctx.getUpdatedEntities()) {
                 AtlasVertex vertex = ctx.getVertex(updated);
-                structVertexMapper.mapAttributestoVertex((AtlasStructType) ctx.getType(updated), updated, vertex);
+                structVertexMapper.mapAttributestoVertex(EntityMutations.EntityOperation.UPDATE, ctx.getType(updated), updated, vertex);
 
-                resp.addEntity(EntityMutations.EntityOperation.UPDATE, constructHeader(updated, vertex));
+                resp.addEntity(EntityMutations.EntityOperation.UPDATE, constructHeader(updated, ctx.getType(updated), vertex));
             }
         }
 
@@ -165,13 +167,30 @@ public class EntityGraphMapper implements InstanceGraphMapper<AtlasEdge> {
             } else if (value instanceof AtlasEntity) {
                 return ((AtlasEntity) value).getGuid();
             }
+
+            throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, (String) value);
         }
-        throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, (String) value);
+
+        return null;
     }
 
-    private AtlasEntityHeader constructHeader(AtlasEntity entity, AtlasVertex vertex) {
+    private AtlasEntityHeader constructHeader(AtlasEntity entity, final AtlasEntityType type, AtlasVertex vertex) {
         //TODO - enhance to return only selective attributes
-        return new AtlasEntityHeader(entity.getTypeName(), AtlasGraphUtilsV1.getIdFromVertex(vertex), entity.getAttributes());
+        AtlasEntityHeader header = new AtlasEntityHeader(entity.getTypeName(), AtlasGraphUtilsV1.getIdFromVertex(vertex), entity.getAttributes());
+        final Map<String, AtlasStructType.AtlasAttribute> allAttributes = type.getAllAttributes();
+        for (String attribute : allAttributes.keySet()) {
+            AtlasType attributeType = allAttributes.get(attribute).getAttributeType();
+            AtlasStructDef.AtlasAttributeDef attributeDef = allAttributes.get(attribute).getAttributeDef();
+            if ( header.getAttribute(attribute) == null && (TypeCategory.PRIMITIVE == attributeType.getTypeCategory())) {
+
+                if ( attributeDef.getIsOptional()) {
+                    header.setAttribute(attribute, attributeType.createOptionalDefaultValue());
+                } else {
+                    header.setAttribute(attribute, attributeType.createDefaultValue());
+                }
+            }
+        }
+        return header;
     }
 
     public EntityMutationContext getContext() {
@@ -180,6 +199,11 @@ public class EntityGraphMapper implements InstanceGraphMapper<AtlasEdge> {
 
     public AtlasEntityType getInstanceType(Object val) throws AtlasBaseException {
         String guid = getId(val);
-        return (AtlasEntityType) getContext().getType(guid);
+
+        if ( guid != null) {
+            return (AtlasEntityType) getContext().getType(guid);
+        }
+
+        return null;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityMutationContext.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityMutationContext.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityMutationContext.java
index f942a91..f6e5055 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityMutationContext.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/EntityMutationContext.java
@@ -21,6 +21,7 @@ import org.apache.atlas.model.instance.AtlasEntity;
 
 import org.apache.atlas.repository.graphdb.AtlasVertex;
 import org.apache.atlas.repository.store.graph.EntityGraphDiscoveryContext;
+import org.apache.atlas.type.AtlasEntityType;
 import org.apache.atlas.type.AtlasType;
 
 import java.util.ArrayList;
@@ -35,20 +36,20 @@ public class EntityMutationContext {
     private List<AtlasEntity> entitiesUpdated  = new ArrayList<>();
 
     private EntityGraphDiscoveryContext context;
-    private Map<String, AtlasType> entityVsType = new HashMap<>();
+    private Map<String, AtlasEntityType> entityVsType = new HashMap<>();
     private Map<String, AtlasVertex> entityVsVertex = new HashMap<>();
 
     public EntityMutationContext(final EntityGraphDiscoveryContext context) {
         this.context = context;
     }
 
-    public void addCreated(AtlasEntity entity, AtlasType type, AtlasVertex atlasVertex) {
+    public void addCreated(AtlasEntity entity, AtlasEntityType type, AtlasVertex atlasVertex) {
         entitiesCreated.add(entity);
         entityVsVertex.put(entity.getGuid(), atlasVertex);
         entityVsType.put(entity.getGuid(), type);
     }
 
-    public void addUpdated(AtlasEntity entity, AtlasType type, AtlasVertex atlasVertex) {
+    public void addUpdated(AtlasEntity entity, AtlasEntityType type, AtlasVertex atlasVertex) {
         entitiesUpdated.add(entity);
         entityVsVertex.put(entity.getGuid(), atlasVertex);
         entityVsType.put(entity.getGuid(), type);
@@ -62,7 +63,7 @@ public class EntityMutationContext {
         return entitiesUpdated;
     }
 
-    public AtlasType getType(AtlasEntity entity) {
+    public AtlasEntityType getType(AtlasEntity entity) {
         return entityVsType.get(entity.getGuid());
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/GraphMutationContext.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/GraphMutationContext.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/GraphMutationContext.java
index d5ba7e1..89419d9 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/GraphMutationContext.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/GraphMutationContext.java
@@ -19,6 +19,7 @@ package org.apache.atlas.repository.store.graph.v1;
 
 
 import com.google.common.base.Optional;
+import org.apache.atlas.model.instance.EntityMutations;
 import org.apache.atlas.model.typedef.AtlasStructDef;
 import org.apache.atlas.repository.graphdb.AtlasEdge;
 import org.apache.atlas.repository.graphdb.AtlasVertex;
@@ -30,6 +31,7 @@ import java.util.Objects;
 public class GraphMutationContext {
 
 
+    private EntityMutations.EntityOperation op;
     /**
      * Atlas Attribute
      */
@@ -65,6 +67,7 @@ public class GraphMutationContext {
 
 
     private GraphMutationContext(final Builder builder) {
+        this.op = builder.op;
         this.attribute = builder.attribute;
         this.currentElementType = builder.elementType;
         this.existingEdge = builder.currentEdge;
@@ -79,7 +82,7 @@ public class GraphMutationContext {
 
     @Override
     public int hashCode() {
-        return Objects.hash(attribute, value, referringVertex, vertexPropertyKey, existingEdge);
+        return Objects.hash(op, attribute, value, referringVertex, vertexPropertyKey, existingEdge);
     }
 
     @Override
@@ -96,13 +99,16 @@ public class GraphMutationContext {
                  && Objects.equals(value, rhs.getValue())
                  && Objects.equals(referringVertex, rhs.getReferringVertex())
                  && Objects.equals(vertexPropertyKey, rhs.getReferringVertex())
-                 && Objects.equals(existingEdge, rhs.getCurrentEdge());
+                 && Objects.equals(existingEdge, rhs.getCurrentEdge())
+                 && Objects.equals(op, rhs.getOp());
         }
     }
 
 
     public static final class Builder {
 
+        private final EntityMutations.EntityOperation op;
+
         private final AtlasStructType.AtlasAttribute attribute;
 
         private final AtlasType elementType;
@@ -116,16 +122,15 @@ public class GraphMutationContext {
         private  String vertexPropertyKey;
 
 
-        public Builder(AtlasStructType.AtlasAttribute attribute, AtlasType currentElementType, Object currentValue) {
+        public Builder(EntityMutations.EntityOperation op, AtlasStructType.AtlasAttribute attribute, AtlasType currentElementType, Object currentValue) {
+            this.op = op;
             this.attribute = attribute;
             this.elementType = currentElementType;
             this.currentValue = currentValue;
         }
 
-        public Builder(AtlasStructType.AtlasAttribute attribute, Object currentValue) {
-            this.attribute = attribute;
-            this.elementType = null;
-            this.currentValue = currentValue;
+        public Builder(EntityMutations.EntityOperation op, AtlasStructType.AtlasAttribute attribute, Object currentValue) {
+           this(op, attribute, null, currentValue);
         }
 
         Builder referringVertex(AtlasVertex referringVertex) {
@@ -192,4 +197,12 @@ public class GraphMutationContext {
     public AtlasStructType.AtlasAttribute getAttribute() {
         return attribute;
     }
+
+    public EntityMutations.EntityOperation getOp() {
+        return op;
+    }
+
+    public void setExistingEdge(final Optional<AtlasEdge> existingEdge) {
+        this.existingEdge = existingEdge;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/IDBasedEntityResolver.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/IDBasedEntityResolver.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/IDBasedEntityResolver.java
index 488f141..d02b5a1 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/IDBasedEntityResolver.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/IDBasedEntityResolver.java
@@ -105,7 +105,7 @@ public class IDBasedEntityResolver implements EntityResolver {
         if ( vertex != null ) {
             return Optional.of(vertex);
         } else {
-            throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, "Could not find an entity with the specified guid " + typeIdPair.getGuid() + " in Atlas respository");
+            throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND, typeIdPair.getGuid());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/MapVertexMapper.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/MapVertexMapper.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/MapVertexMapper.java
index 9d219f5..efafcc9 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/MapVertexMapper.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/MapVertexMapper.java
@@ -97,13 +97,16 @@ public class MapVertexMapper implements InstanceGraphMapper<Map> {
                     String propertyNameForKey = GraphHelper.getQualifiedNameForMapKey(ctx.getVertexPropertyKey(), keyStr);
                     Optional<AtlasEdge> existingEdge = getEdgeIfExists(mapType, currentMap, keyStr);
 
-                    GraphMutationContext mapCtx =  new GraphMutationContext.Builder(ctx.getAttribute(), mapType.getValueType(), entry.getValue())
+                    GraphMutationContext mapCtx =  new GraphMutationContext.Builder(ctx.getOp(), ctx.getAttribute(), mapType.getValueType(), entry.getValue())
                         .referringVertex(ctx.getReferringVertex())
                         .edge(existingEdge)
                         .vertexProperty(propertyNameForKey).build();
 
 
+                    //Add/Update/Remove property value
                     Object newEntry = structVertexMapper.mapCollectionElementsToVertex(mapCtx);
+                    MapVertexMapper.setMapValueProperty(mapType.getValueType(), ctx.getReferringVertex(), propertyNameForKey, newEntry);
+
                     newMap.put(keyStr, newEntry);
                 }
             }
@@ -192,7 +195,9 @@ public class MapVertexMapper implements InstanceGraphMapper<Map> {
     private Optional<AtlasEdge> getEdgeIfExists(AtlasMapType mapType, Map<String, Object> currentMap, String keyStr) {
         Optional<AtlasEdge> existingEdge = Optional.absent();
         if ( AtlasGraphUtilsV1.isReference(mapType.getValueType()) ) {
-            existingEdge = Optional.of((AtlasEdge) currentMap.get(keyStr));
+            if ( currentMap.get(keyStr) != null) {
+                existingEdge = Optional.of((AtlasEdge) currentMap.get(keyStr));
+            }
         }
         
         return existingEdge;

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/StructVertexMapper.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/StructVertexMapper.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/StructVertexMapper.java
index ae9ecc4..22851ca 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/StructVertexMapper.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/StructVertexMapper.java
@@ -17,27 +17,31 @@
  */
 package org.apache.atlas.repository.store.graph.v1;
 
+import com.google.common.base.Optional;
 import org.apache.atlas.AtlasErrorCode;
 import org.apache.atlas.RequestContextV1;
 import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.model.TypeCategory;
 import org.apache.atlas.model.instance.AtlasEntity;
 import org.apache.atlas.model.instance.AtlasStruct;
+import org.apache.atlas.model.instance.EntityMutations;
 import org.apache.atlas.model.typedef.AtlasStructDef;
 import org.apache.atlas.repository.Constants;
 import org.apache.atlas.repository.RepositoryException;
+import org.apache.atlas.repository.graph.AtlasEdgeLabel;
 import org.apache.atlas.repository.graph.AtlasGraphProvider;
 import org.apache.atlas.repository.graph.GraphHelper;
 import org.apache.atlas.repository.graphdb.AtlasEdge;
 import org.apache.atlas.repository.graphdb.AtlasGraph;
 import org.apache.atlas.repository.graphdb.AtlasVertex;
 import org.apache.atlas.type.AtlasEntityType;
-import org.apache.atlas.type.AtlasMapType;
 import org.apache.atlas.type.AtlasStructType;
 import org.apache.atlas.type.AtlasType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Map;
+
 public class StructVertexMapper implements InstanceGraphMapper<AtlasEdge> {
 
     private final AtlasGraph graph;
@@ -64,18 +68,17 @@ public class StructVertexMapper implements InstanceGraphMapper<AtlasEdge> {
 
     @Override
     public AtlasEdge toGraph(GraphMutationContext ctx) throws AtlasBaseException {
-        AtlasEdge result = null;
-
-        String edgeLabel = AtlasGraphUtilsV1.getAttributeEdgeLabel(ctx.getParentType(), ctx.getAttributeDef().getName());
+        AtlasEdge ret = null;
 
         if ( ctx.getCurrentEdge().isPresent() ) {
-            updateVertex(ctx.getParentType(), (AtlasStructType) ctx.getAttrType(), ctx.getAttributeDef(), (AtlasStruct) ctx.getValue(), ctx.getCurrentEdge().get().getOutVertex());
-            result = ctx.getCurrentEdge().get();
-        } else {
-            result = createVertex(ctx.getParentType(), (AtlasStructType) ctx.getAttrType(), ctx.getAttributeDef(), (AtlasStruct) ctx.getValue(), ctx.getReferringVertex(), edgeLabel);
+            updateVertex(ctx.getParentType(), (AtlasStructType) ctx.getAttrType(), ctx.getAttributeDef(), (AtlasStruct) ctx.getValue(), ctx.getCurrentEdge().get().getInVertex());
+            ret = ctx.getCurrentEdge().get();
+        } else if (ctx.getValue() != null) {
+            String edgeLabel = AtlasGraphUtilsV1.getEdgeLabel(ctx.getVertexPropertyKey());
+            ret = createVertex(ctx.getParentType(), (AtlasStructType) ctx.getAttrType(), ctx.getAttributeDef(), (AtlasStruct) ctx.getValue(), ctx.getReferringVertex(), edgeLabel);
         }
 
-        return result;
+        return ret;
     }
 
     @Override
@@ -88,44 +91,86 @@ public class StructVertexMapper implements InstanceGraphMapper<AtlasEdge> {
 
     /**
      * Map attributes for entity, struct or trait
+     *
+     * @param op
      * @param structType
      * @param struct
      * @param vertex
      * @return
      * @throws AtlasBaseException
      */
-    public AtlasVertex mapAttributestoVertex(AtlasStructType structType, AtlasStruct struct, AtlasVertex vertex) throws AtlasBaseException {
+    public AtlasVertex mapAttributestoVertex(final EntityMutations.EntityOperation op, AtlasStructType structType, AtlasStruct struct, AtlasVertex vertex) throws AtlasBaseException {
         if (struct.getAttributes() != null) {
-            for (String attrName : struct.getAttributes().keySet()) {
-                Object value = struct.getAttribute(attrName);
-                AtlasType attributeType = structType.getAttributeType(attrName);
-                if ( attributeType != null) {
-                    final AtlasStructType.AtlasAttribute attribute = structType.getAttribute(attrName);
-
-                    GraphMutationContext ctx =  new GraphMutationContext.Builder(attribute, value)
-                        .referringVertex(vertex)
-                        .vertexProperty(AtlasGraphUtilsV1.getQualifiedAttributePropertyKey(structType, attrName)).build();
-                    mapToVertexByTypeCategory(ctx);
+            if (op.equals(EntityMutations.EntityOperation.CREATE)) {
+                final Map<String, AtlasStructType.AtlasAttribute> allAttributes = structType.getAllAttributes();
+                for (String attrName : allAttributes.keySet()) {
+                    Object value = struct.getAttribute(attrName);
+
+                    mapAttribute(op, structType, attrName, value, vertex);
+                }
+            } else if (op.equals(EntityMutations.EntityOperation.UPDATE)) {
+                for (String attrName : struct.getAttributes().keySet()) {
+                    Object value = struct.getAttribute(attrName);
+                    mapAttribute(op, structType, attrName, value, vertex);
                 }
             }
-
-            //Set updated timestamp
-            AtlasGraphUtilsV1.setProperty(vertex, Constants.MODIFICATION_TIMESTAMP_PROPERTY_KEY, RequestContextV1.get().getRequestTime());
-            GraphHelper.setProperty(vertex, Constants.MODIFIED_BY_KEY, RequestContextV1.get().getUser());
+            updateModificationMetadata(vertex);
         }
         return vertex;
     }
 
+    private void mapAttribute(final EntityMutations.EntityOperation op, AtlasStructType structType, String attrName, Object value, AtlasVertex vertex) throws AtlasBaseException {
+        AtlasType attributeType = structType.getAttributeType(attrName);
+        if (attributeType != null) {
+            final AtlasStructType.AtlasAttribute attribute = structType.getAttribute(attrName);
+
+            if (value == null) {
+                if ( attribute.getAttributeType().getTypeCategory() == TypeCategory.PRIMITIVE) {
+                    if ( attribute.getAttributeDef().getIsOptional()) {
+                        value = attribute.getAttributeType().createOptionalDefaultValue();
+                    } else {
+                        value = attribute.getAttributeType().createDefaultValue();
+                    }
+                }
+            }
+
+            final String vertexProperty = structType.getQualifiedAttributeName(attrName);
+            GraphMutationContext ctx = new GraphMutationContext.Builder(op, attribute, value)
+                .referringVertex(vertex)
+                .vertexProperty(GraphHelper.encodePropertyKey(vertexProperty)).build();
+            mapToVertexByTypeCategory(ctx);
+        }
+    }
+
+    private void updateModificationMetadata(AtlasVertex vertex) {
+        //Set updated timestamp
+        AtlasGraphUtilsV1.setProperty(vertex, Constants.MODIFICATION_TIMESTAMP_PROPERTY_KEY, RequestContextV1.get().getRequestTime());
+        GraphHelper.setProperty(vertex, Constants.MODIFIED_BY_KEY, RequestContextV1.get().getUser());
+    }
+
+
     protected Object mapToVertexByTypeCategory(GraphMutationContext ctx) throws AtlasBaseException {
-        switch(ctx.getAttrType().getTypeCategory()) {
+        if (ctx.getOp() == EntityMutations.EntityOperation.CREATE && ctx.getValue() == null) {
+            return null;
+        }
+
+        switch (ctx.getAttrType().getTypeCategory()) {
         case PRIMITIVE:
         case ENUM:
             return primitivesToVertex(ctx);
         case STRUCT:
+            String edgeLabel = AtlasGraphUtilsV1.getEdgeLabel(ctx.getVertexPropertyKey());
+            AtlasEdge currentEdge = graphHelper.getEdgeForLabel(ctx.getReferringVertex(), edgeLabel);
+            Optional<AtlasEdge> edge = currentEdge != null ? Optional.of(currentEdge) : Optional.<AtlasEdge>absent();
+            ctx.setExistingEdge(edge);
             return toGraph(ctx);
         case ENTITY:
+            edgeLabel = AtlasGraphUtilsV1.getEdgeLabel(ctx.getVertexPropertyKey());
+            currentEdge = graphHelper.getEdgeForLabel(ctx.getReferringVertex(), edgeLabel);
             AtlasEntityType instanceType = entityVertexMapper.getInstanceType(ctx.getValue());
+            edge = currentEdge != null ? Optional.of(currentEdge) : Optional.<AtlasEdge>absent();
             ctx.setElementType(instanceType);
+            ctx.setExistingEdge(edge);
             return entityVertexMapper.toGraph(ctx);
         case MAP:
             return mapVertexMapper.toGraph(ctx);
@@ -137,17 +182,13 @@ public class StructVertexMapper implements InstanceGraphMapper<AtlasEdge> {
     }
 
     protected Object primitivesToVertex(GraphMutationContext ctx) {
-        if ( ctx.getAttrType().getTypeCategory() == TypeCategory.MAP ) {
-            MapVertexMapper.setMapValueProperty(((AtlasMapType) ctx.getAttrType()).getValueType(), ctx.getReferringVertex(), ctx.getVertexPropertyKey(), ctx.getValue());
-        } else {
-            AtlasGraphUtilsV1.setProperty(ctx.getReferringVertex(), ctx.getVertexPropertyKey(), ctx.getValue());
-        }
+        AtlasGraphUtilsV1.setProperty(ctx.getReferringVertex(), ctx.getVertexPropertyKey(), ctx.getValue());
         return ctx.getValue();
     }
 
     private AtlasEdge createVertex(AtlasStructType parentType, AtlasStructType attrType, AtlasStructDef.AtlasAttributeDef attributeDef, AtlasStruct struct, AtlasVertex referringVertex, String edgeLabel) throws AtlasBaseException {
         AtlasVertex vertex = createVertexTemplate(struct, attrType);
-        mapAttributestoVertex(attrType, struct, vertex);
+        mapAttributestoVertex(EntityMutations.EntityOperation.CREATE, attrType, struct, vertex);
 
         try {
             //TODO - Map directly in AtlasGraphUtilsV1
@@ -158,7 +199,7 @@ public class StructVertexMapper implements InstanceGraphMapper<AtlasEdge> {
     }
 
     private void updateVertex(AtlasStructType parentType, AtlasStructType structAttributeType, AtlasStructDef.AtlasAttributeDef attributeDef, AtlasStruct value, AtlasVertex structVertex) throws AtlasBaseException {
-        mapAttributestoVertex(structAttributeType, value, structVertex);
+        mapAttributestoVertex(EntityMutations.EntityOperation.CREATE, structAttributeType, value, structVertex);
     }
 
     protected AtlasVertex createVertexTemplate(final AtlasStruct instance, final AtlasStructType structType) {
@@ -187,7 +228,7 @@ public class StructVertexMapper implements InstanceGraphMapper<AtlasEdge> {
         switch(ctx.getAttrType().getTypeCategory()) {
         case PRIMITIVE:
         case ENUM:
-            return primitivesToVertex(ctx);
+            return ctx.getValue();
         case STRUCT:
             return toGraph(ctx);
         case ENTITY:

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6ccba52c/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/UniqAttrBasedEntityResolver.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/UniqAttrBasedEntityResolver.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/UniqAttrBasedEntityResolver.java
index 8025f1e..2698504 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/UniqAttrBasedEntityResolver.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/UniqAttrBasedEntityResolver.java
@@ -20,6 +20,7 @@ package org.apache.atlas.repository.store.graph.v1;
 import com.google.common.base.Optional;
 import org.apache.atlas.AtlasErrorCode;
 import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.TypeCategory;
 import org.apache.atlas.model.instance.AtlasEntity;
 import org.apache.atlas.model.instance.AtlasObjectId;
 import org.apache.atlas.model.typedef.AtlasStructDef;
@@ -98,7 +99,12 @@ public class UniqAttrBasedEntityResolver implements EntityResolver {
     }
 
     Optional<AtlasVertex> resolveByUniqueAttribute(AtlasEntity entity) throws AtlasBaseException {
-        AtlasEntityType entityType = (AtlasEntityType) typeRegistry.getType(entity.getTypeName());
+        AtlasEntityType entityType = typeRegistry.getEntityTypeByName(entity.getTypeName());
+
+        if (entityType == null) {
+            throw new AtlasBaseException(AtlasErrorCode.TYPE_NAME_INVALID, TypeCategory.ENTITY.name(), entity.getTypeName());
+        }
+
         for (AtlasStructType.AtlasAttribute attr : entityType.getAllAttributes().values()) {
             if (attr.getAttributeDef().getIsUnique()) {
                 Object attrVal = entity.getAttribute(attr.getAttributeDef().getName());


Mime
View raw message