You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by ma...@apache.org on 2017/11/05 20:31:44 UTC

[22/40] atlas git commit: ATLAS-2251: Remove TypeSystem and related implementation, to avoid unncessary duplicate of type details in cache

http://git-wip-us.apache.org/repos/asf/atlas/blob/0877e47c/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedMetadataRepositoryDeleteTestBase.java
----------------------------------------------------------------------
diff --git a/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedMetadataRepositoryDeleteTestBase.java b/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedMetadataRepositoryDeleteTestBase.java
deleted file mode 100644
index 0834601..0000000
--- a/repository/src/test/java/org/apache/atlas/repository/graph/GraphBackedMetadataRepositoryDeleteTestBase.java
+++ /dev/null
@@ -1,1205 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.atlas.repository.graph;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import org.apache.atlas.AtlasClient;
-import org.apache.atlas.AtlasException;
-import org.apache.atlas.CreateUpdateEntitiesResult;
-import org.apache.atlas.RequestContext;
-import org.apache.atlas.TestModules;
-import org.apache.atlas.TestUtils;
-import org.apache.atlas.model.legacy.EntityResult;
-import org.apache.atlas.repository.Constants;
-import org.apache.atlas.repository.MetadataRepository;
-import org.apache.atlas.repository.RepositoryException;
-import org.apache.atlas.repository.graphdb.AtlasGraph;
-import org.apache.atlas.repository.graphdb.AtlasVertex;
-import org.apache.atlas.type.AtlasTypeRegistry;
-import org.apache.atlas.typesystem.IReferenceableInstance;
-import org.apache.atlas.typesystem.IStruct;
-import org.apache.atlas.typesystem.ITypedReferenceableInstance;
-import org.apache.atlas.typesystem.ITypedStruct;
-import org.apache.atlas.typesystem.Referenceable;
-import org.apache.atlas.typesystem.Struct;
-import org.apache.atlas.typesystem.TypesDef;
-import org.apache.atlas.typesystem.exception.EntityExistsException;
-import org.apache.atlas.typesystem.exception.EntityNotFoundException;
-import org.apache.atlas.typesystem.exception.NullRequiredAttributeException;
-import org.apache.atlas.typesystem.persistence.Id;
-import org.apache.atlas.typesystem.types.*;
-import org.apache.atlas.typesystem.types.utils.TypesUtil;
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Guice;
-import org.testng.annotations.Test;
-
-import javax.inject.Inject;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.atlas.TestUtils.*;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotEquals;
-import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.fail;
-
-/**
- * Test for GraphBackedMetadataRepository.deleteEntities
- *
- * Guice loads the dependencies and injects the necessary objects
- *
- */
-@Guice(modules = TestModules.TestOnlyModule.class)
-public abstract class GraphBackedMetadataRepositoryDeleteTestBase {
-
-    protected MetadataRepository repositoryService;
-
-    private TypeSystem typeSystem;
-
-    private ClassType compositeMapOwnerType;
-
-    private ClassType compositeMapValueType;
-
-    @Inject
-    AtlasGraph atlasGraph;
-
-    @BeforeClass
-    public void setUp() throws Exception {
-
-        typeSystem = TypeSystem.getInstance();
-        typeSystem.reset();
-
-        new GraphBackedSearchIndexer(new AtlasTypeRegistry());
-        final GraphBackedMetadataRepository delegate = new GraphBackedMetadataRepository(getDeleteHandler(typeSystem), atlasGraph);
-
-        repositoryService = TestUtils.addTransactionWrapper(delegate);
-
-        TestUtils.defineDeptEmployeeTypes(typeSystem);
-        TestUtils.createHiveTypes(typeSystem);
-
-        // Define type for map value.
-        HierarchicalTypeDefinition<ClassType> mapValueDef = TypesUtil.createClassTypeDef("CompositeMapValue",
-            ImmutableSet.<String>of(),
-            TypesUtil.createUniqueRequiredAttrDef(NAME, DataTypes.STRING_TYPE));
-
-        // Define type with map where the value is a composite class reference to MapValue.
-        HierarchicalTypeDefinition<ClassType> mapOwnerDef = TypesUtil.createClassTypeDef("CompositeMapOwner",
-            ImmutableSet.<String>of(),
-            TypesUtil.createUniqueRequiredAttrDef(NAME, DataTypes.STRING_TYPE),
-            new AttributeDefinition("map", DataTypes.mapTypeName(DataTypes.STRING_TYPE.getName(),
-                        "CompositeMapValue"), Multiplicity.OPTIONAL, true, null));
-        TypesDef typesDef = TypesUtil.getTypesDef(ImmutableList.<EnumTypeDefinition>of(),
-            ImmutableList.<StructTypeDefinition>of(), ImmutableList.<HierarchicalTypeDefinition<TraitType>>of(),
-            ImmutableList.of(mapOwnerDef, mapValueDef));
-        typeSystem.defineTypes(typesDef);
-        compositeMapOwnerType = typeSystem.getDataType(ClassType.class, "CompositeMapOwner");
-        compositeMapValueType = typeSystem.getDataType(ClassType.class, "CompositeMapValue");
-    }
-
-    abstract DeleteHandler getDeleteHandler(TypeSystem typeSystem);
-
-    @BeforeMethod
-    public void setupContext() {
-        TestUtils.resetRequestContext();
-    }
-
-    @AfterClass
-    public void tearDown() throws Exception {
-        TypeSystem.getInstance().reset();
-//        AtlasGraphProvider.cleanup();
-    }
-
-    @Test
-    public void testDeleteAndCreate() throws Exception {
-        Referenceable entity = createDBEntity();
-        String id = createInstance(entity);
-
-        //get entity by unique attribute should return the created entity
-        ITypedReferenceableInstance instance =
-                repositoryService.getEntityDefinition(TestUtils.DATABASE_TYPE, "name", entity.get("name"));
-        assertEquals(instance.getId()._getId(), id);
-
-        //delete entity should mark it as deleted
-        List<String> results = deleteEntities(id).getDeletedEntities();
-        assertEquals(results.get(0), id);
-        assertEntityDeleted(id);
-
-        //get entity by unique attribute should throw EntityNotFoundException
-        try {
-            repositoryService.getEntityDefinition(TestUtils.DATABASE_TYPE, "name", entity.get("name"));
-            fail("Expected EntityNotFoundException");
-        } catch(EntityNotFoundException e) {
-            //expected
-        }
-
-        //Create the same entity again, should create new entity
-        String newId = createInstance(entity);
-        assertNotEquals(id, newId);
-
-        //get by unique attribute should return the new entity
-        instance = repositoryService.getEntityDefinition(TestUtils.DATABASE_TYPE, "name", entity.get("name"));
-        assertEquals(instance.getId()._getId(), newId);
-    }
-
-    @Test
-    public void testDeleteEntityWithTraits() throws Exception {
-        Referenceable entity = createDBEntity();
-        String id = createInstance(entity);
-
-        TraitType dataType = typeSystem.getDataType(TraitType.class, PII);
-        ITypedStruct trait = dataType.convert(new Struct(TestUtils.PII), Multiplicity.REQUIRED);
-        repositoryService.addTrait(id, trait);
-
-        ITypedReferenceableInstance instance = repositoryService.getEntityDefinition(id);
-        assertTrue(instance.getTraits().contains(PII));
-
-        deleteEntities(id);
-        assertEntityDeleted(id);
-        assertTestDeleteEntityWithTraits(id);
-    }
-
-    protected abstract void assertTestDeleteEntityWithTraits(String guid)
-            throws EntityNotFoundException, RepositoryException, Exception;
-
-    @Test
-    public void testDeleteReference() throws Exception {
-        //Deleting column should update table
-        Referenceable db = createDBEntity();
-        String dbId = createInstance(db);
-
-        Referenceable column = createColumnEntity();
-        String colId = createInstance(column);
-
-        Referenceable table = createTableEntity(dbId);
-        table.set(COLUMNS_ATTR_NAME, Arrays.asList(new Id(colId, 0, COLUMN_TYPE)));
-        String tableId = createInstance(table);
-
-        EntityResult entityResult = deleteEntities(colId);
-        assertEquals(entityResult.getDeletedEntities().size(), 1);
-        assertEquals(entityResult.getDeletedEntities().get(0), colId);
-        assertEquals(entityResult.getUpdateEntities().size(), 1);
-        assertEquals(entityResult.getUpdateEntities().get(0), tableId);
-
-        assertEntityDeleted(colId);
-
-        ITypedReferenceableInstance tableInstance = repositoryService.getEntityDefinition(tableId);
-        assertColumnForTestDeleteReference(tableInstance);
-
-        //Deleting table should update process
-        Referenceable process = new Referenceable(PROCESS_TYPE);
-        process.set(AtlasClient.PROCESS_ATTRIBUTE_OUTPUTS, Arrays.asList(new Id(tableId, 0, TABLE_TYPE)));
-        String processId = createInstance(process);
-        ITypedReferenceableInstance processInstance = repositoryService.getEntityDefinition(processId);
-
-        deleteEntities(tableId);
-        assertEntityDeleted(tableId);
-
-        assertTableForTestDeleteReference(tableId);
-        assertProcessForTestDeleteReference(processInstance);
-    }
-
-    protected abstract void assertTableForTestDeleteReference(String tableId) throws Exception;
-
-    protected abstract void assertColumnForTestDeleteReference(ITypedReferenceableInstance tableInstance)
-            throws AtlasException;
-
-    protected abstract void assertProcessForTestDeleteReference(ITypedReferenceableInstance processInstance) throws Exception;
-
-    protected abstract void assertEntityDeleted(String id) throws Exception;
-
-    private EntityResult deleteEntities(String... id) throws Exception {
-        RequestContext.createContext();
-        return repositoryService.deleteEntities(Arrays.asList(id));
-    }
-
-    private String createInstance(Referenceable entity) throws Exception {
-        ClassType                   dataType = typeSystem.getDataType(ClassType.class, entity.getTypeName());
-        ITypedReferenceableInstance instance = dataType.convert(entity, Multiplicity.REQUIRED);
-        CreateUpdateEntitiesResult  result   = repositoryService.createEntities(instance);
-        List<String>                results  = result.getCreatedEntities();
-        return results.get(results.size() - 1);
-    }
-
-    @Test
-    public void testDeleteEntities() throws Exception {
-        // Create a table entity, with 3 composite column entities
-        Referenceable dbEntity = createDBEntity();
-        String dbGuid = createInstance(dbEntity);
-        Referenceable table1Entity = createTableEntity(dbGuid);
-        Referenceable col1 = createColumnEntity();
-        Referenceable col2 = createColumnEntity();
-        Referenceable col3 = createColumnEntity();
-        table1Entity.set(COLUMNS_ATTR_NAME, ImmutableList.of(col1, col2, col3));
-        createInstance(table1Entity);
-
-        // Retrieve the table entities from the Repository, to get their guids and the composite column guids.
-        ITypedReferenceableInstance tableInstance = repositoryService.getEntityDefinition(TestUtils.TABLE_TYPE,
-                NAME, table1Entity.get(NAME));
-        List<IReferenceableInstance> columns = (List<IReferenceableInstance>) tableInstance.get(COLUMNS_ATTR_NAME);
-
-        //Delete column
-        String colId = columns.get(0).getId()._getId();
-        String tableId = tableInstance.getId()._getId();
-
-        EntityResult entityResult = deleteEntities(colId);
-        assertEquals(entityResult.getDeletedEntities().size(), 1);
-        assertEquals(entityResult.getDeletedEntities().get(0), colId);
-        assertEquals(entityResult.getUpdateEntities().size(), 1);
-        assertEquals(entityResult.getUpdateEntities().get(0), tableId);
-        assertEntityDeleted(colId);
-
-        tableInstance = repositoryService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, table1Entity.get(NAME));
-        assertDeletedColumn(tableInstance);
-
-        //update by removing a column
-        tableInstance.set(COLUMNS_ATTR_NAME, ImmutableList.of(col3));
-        entityResult = updatePartial(tableInstance);
-        colId = columns.get(1).getId()._getId();
-        assertEquals(entityResult.getDeletedEntities().size(), 1);
-        assertEquals(entityResult.getDeletedEntities().get(0), colId);
-        assertEntityDeleted(colId);
-
-        // Delete the table entities.  The deletion should cascade to their composite columns.
-        tableInstance = repositoryService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, table1Entity.get(NAME));
-        List<String> deletedGuids = deleteEntities(tableInstance.getId()._getId()).getDeletedEntities();
-        assertEquals(deletedGuids.size(), 2);
-
-        // Verify that deleteEntities() response has guids for tables and their composite columns.
-        Assert.assertTrue(deletedGuids.contains(tableInstance.getId()._getId()));
-        Assert.assertTrue(deletedGuids.contains(columns.get(2).getId()._getId()));
-
-        // Verify that tables and their composite columns have been deleted from the graph Repository.
-        for (String guid : deletedGuids) {
-            assertEntityDeleted(guid);
-        }
-        assertTestDeleteEntities(tableInstance);
-    }
-
-    protected abstract void assertDeletedColumn(ITypedReferenceableInstance tableInstance) throws AtlasException;
-
-    protected abstract void assertTestDeleteEntities(ITypedReferenceableInstance tableInstance) throws Exception;
-
-    /**
-     * Verify deleting entities with composite references to other entities.
-     * The composite entities should also be deleted.
-     */
-    @Test
-    public void testDeleteEntitiesWithCompositeArrayReference() throws Exception {
-        String hrDeptGuid = createHrDeptGraph();
-
-        ITypedReferenceableInstance hrDept = repositoryService.getEntityDefinition(hrDeptGuid);
-        List<ITypedReferenceableInstance> employees = (List<ITypedReferenceableInstance>) hrDept.get("employees");
-        Assert.assertEquals(employees.size(), 4);
-
-        List<String> employeeGuids = new ArrayList(4);
-        for (ITypedReferenceableInstance employee : employees) {
-            employeeGuids.add(employee.getId()._getId());
-        }
-
-        // There should be 4 vertices for Address structs (one for each Person.address attribute value).
-        int vertexCount = getVertices(Constants.ENTITY_TYPE_PROPERTY_KEY, "Address").size();
-        Assert.assertEquals(vertexCount, 4);
-        vertexCount = getVertices(Constants.ENTITY_TYPE_PROPERTY_KEY, "SecurityClearance").size();
-        Assert.assertEquals(vertexCount, 1);
-
-        List<String> deletedEntities = deleteEntities(hrDeptGuid).getDeletedEntities();
-        assertTrue(deletedEntities.contains(hrDeptGuid));
-        assertEntityDeleted(hrDeptGuid);
-
-        // Verify Department entity and its contained Person entities were deleted.
-        for (String employeeGuid : employeeGuids) {
-            assertTrue(deletedEntities.contains(employeeGuid));
-            assertEntityDeleted(employeeGuid);
-        }
-
-        // Verify all Person.address struct vertices were removed.
-        assertVerticesDeleted(getVertices(Constants.ENTITY_TYPE_PROPERTY_KEY, "Address"));
-
-        // Verify all SecurityClearance trait vertices were removed.
-        assertVerticesDeleted(getVertices(Constants.ENTITY_TYPE_PROPERTY_KEY, "SecurityClearance"));
-    }
-
-    protected abstract void assertVerticesDeleted(List<AtlasVertex> vertices);
-
-    @Test
-    public void testDeleteEntitiesWithCompositeMapReference() throws Exception {
-        // Create instances of MapOwner and MapValue.
-        // Set MapOwner.map with one entry that references MapValue instance.
-        ITypedReferenceableInstance entityDefinition = createMapOwnerAndValueEntities();
-        String mapOwnerGuid = entityDefinition.getId()._getId();
-
-        // Verify MapOwner.map attribute has expected value.
-        ITypedReferenceableInstance mapOwnerInstance = repositoryService.getEntityDefinition(mapOwnerGuid);
-        Object object = mapOwnerInstance.get("map");
-        Assert.assertNotNull(object);
-        Assert.assertTrue(object instanceof Map);
-        Map<String, ITypedReferenceableInstance> map = (Map<String, ITypedReferenceableInstance>)object;
-        Assert.assertEquals(map.size(), 1);
-        ITypedReferenceableInstance mapValueInstance = map.get("value1");
-        Assert.assertNotNull(mapValueInstance);
-        String mapValueGuid = mapValueInstance.getId()._getId();
-        String edgeLabel = GraphHelper.getEdgeLabel(compositeMapOwnerType, compositeMapOwnerType.fieldMapping.fields.get("map"));
-        String mapEntryLabel = edgeLabel + "." + "value1";
-        AtlasEdgeLabel atlasEdgeLabel = new AtlasEdgeLabel(mapEntryLabel);
-        AtlasVertex mapOwnerVertex = GraphHelper.getInstance().getVertexForGUID(mapOwnerGuid);
-        object = mapOwnerVertex.getProperty(atlasEdgeLabel.getQualifiedMapKey(), Object.class);
-        Assert.assertNotNull(object);
-
-        List<String> deletedEntities = deleteEntities(mapOwnerGuid).getDeletedEntities();
-        Assert.assertEquals(deletedEntities.size(), 2);
-        Assert.assertTrue(deletedEntities.contains(mapOwnerGuid));
-        Assert.assertTrue(deletedEntities.contains(mapValueGuid));
-
-        assertEntityDeleted(mapOwnerGuid);
-        assertEntityDeleted(mapValueGuid);
-    }
-
-    private ITypedReferenceableInstance createMapOwnerAndValueEntities()
-        throws AtlasException, RepositoryException, EntityExistsException {
-
-        ITypedReferenceableInstance mapOwnerInstance = compositeMapOwnerType.createInstance();
-        mapOwnerInstance.set(NAME, TestUtils.randomString());
-        ITypedReferenceableInstance mapValueInstance = compositeMapValueType.createInstance();
-        mapValueInstance.set(NAME, TestUtils.randomString());
-        mapOwnerInstance.set("map", Collections.singletonMap("value1", mapValueInstance));
-        List<String> createEntitiesResult = repositoryService.createEntities(mapOwnerInstance, mapValueInstance).getCreatedEntities();
-        Assert.assertEquals(createEntitiesResult.size(), 2);
-        ITypedReferenceableInstance entityDefinition = repositoryService.getEntityDefinition("CompositeMapOwner",
-            NAME, mapOwnerInstance.get(NAME));
-        return entityDefinition;
-    }
-
-    private EntityResult updatePartial(ITypedReferenceableInstance entity) throws RepositoryException {
-        RequestContext.createContext();
-        return repositoryService.updatePartial(entity).getEntityResult();
-    }
-
-    @Test
-    public void testUpdateEntity_MultiplicityOneNonCompositeReference() throws Exception {
-        String hrDeptGuid = createHrDeptGraph();
-        ITypedReferenceableInstance hrDept = repositoryService.getEntityDefinition(hrDeptGuid);
-        Map<String, String> nameGuidMap = getEmployeeNameGuidMap(hrDept);
-
-        ITypedReferenceableInstance john = repositoryService.getEntityDefinition(nameGuidMap.get("John"));
-        Id johnGuid = john.getId();
-
-        ITypedReferenceableInstance max = repositoryService.getEntityDefinition(nameGuidMap.get("Max"));
-        String maxGuid = max.getId()._getId();
-        AtlasVertex vertex = GraphHelper.getInstance().getVertexForGUID(maxGuid);
-        Long creationTimestamp = GraphHelper.getSingleValuedProperty(vertex, Constants.TIMESTAMP_PROPERTY_KEY, Long.class);
-        Assert.assertNotNull(creationTimestamp);
-
-        Long modificationTimestampPreUpdate = GraphHelper.getSingleValuedProperty(vertex, Constants.MODIFICATION_TIMESTAMP_PROPERTY_KEY, Long.class);
-        Assert.assertNotNull(modificationTimestampPreUpdate);
-
-        ITypedReferenceableInstance jane = repositoryService.getEntityDefinition(nameGuidMap.get("Jane"));
-        Id janeId = jane.getId();
-
-        // Update max's mentor reference to john.
-        ClassType personType = typeSystem.getDataType(ClassType.class, "Person");
-        ITypedReferenceableInstance maxEntity = personType.createInstance(max.getId());
-        maxEntity.set("mentor", johnGuid);
-        EntityResult entityResult = updatePartial(maxEntity);
-        assertEquals(entityResult.getUpdateEntities().size(), 1);
-        assertTrue(entityResult.getUpdateEntities().contains(maxGuid));
-
-        // Verify the update was applied correctly - john should now be max's mentor.
-        max = repositoryService.getEntityDefinition(maxGuid);
-        ITypedReferenceableInstance refTarget = (ITypedReferenceableInstance) max.get("mentor");
-        Assert.assertEquals(refTarget.getId()._getId(), johnGuid._getId());
-
-        // Verify modification timestamp was updated.
-        vertex = GraphHelper.getInstance().getVertexForGUID(maxGuid);
-        Long modificationTimestampPostUpdate = GraphHelper.getSingleValuedProperty(vertex, Constants.MODIFICATION_TIMESTAMP_PROPERTY_KEY, Long.class);
-        Assert.assertNotNull(modificationTimestampPostUpdate);
-        Assert.assertTrue(creationTimestamp < modificationTimestampPostUpdate);
-
-        // Update max's mentor reference to jane.
-        maxEntity.set("mentor", janeId);
-        entityResult = updatePartial(maxEntity);
-        assertEquals(entityResult.getUpdateEntities().size(), 1);
-        assertTrue(entityResult.getUpdateEntities().contains(maxGuid));
-
-        // Verify the update was applied correctly - jane should now be max's mentor.
-        max = repositoryService.getEntityDefinition(maxGuid);
-        refTarget = (ITypedReferenceableInstance) max.get("mentor");
-        Assert.assertEquals(refTarget.getId()._getId(), janeId._getId());
-
-        // Verify modification timestamp was updated.
-        vertex = GraphHelper.getInstance().getVertexForGUID(maxGuid);
-        Long modificationTimestampPost2ndUpdate = GraphHelper.getSingleValuedProperty(vertex, Constants.MODIFICATION_TIMESTAMP_PROPERTY_KEY, Long.class);
-        Assert.assertNotNull(modificationTimestampPost2ndUpdate);
-        Assert.assertTrue(modificationTimestampPostUpdate < modificationTimestampPost2ndUpdate);
-
-        ITypedReferenceableInstance julius = repositoryService.getEntityDefinition(nameGuidMap.get("Julius"));
-        Id juliusId = julius.getId();
-        maxEntity = personType.createInstance(max.getId());
-        maxEntity.set("manager", juliusId);
-        entityResult = updatePartial(maxEntity);
-        // Verify julius' subordinates were updated.
-        assertEquals(entityResult.getUpdateEntities().size(), 3);
-        assertTrue(entityResult.getUpdateEntities().contains(maxGuid));
-        assertTrue(entityResult.getUpdateEntities().containsAll(Arrays.asList(maxGuid, janeId._getId(), juliusId._getId())));
-
-        // Verify the update was applied correctly - julius should now be max's manager.
-        max = repositoryService.getEntityDefinition(maxGuid);
-        refTarget = (ITypedReferenceableInstance) max.get("manager");
-        Assert.assertEquals(refTarget.getId()._getId(), juliusId._getId());
-        Assert.assertEquals(refTarget.getId()._getId(), juliusId._getId());
-        julius = repositoryService.getEntityDefinition(nameGuidMap.get("Julius"));
-        Object object = julius.get("subordinates");
-        Assert.assertTrue(object instanceof List);
-        List<ITypedReferenceableInstance> refValues = (List<ITypedReferenceableInstance>) object;
-        Assert.assertEquals(refValues.size(), 1);
-        Assert.assertTrue(refValues.contains(max.getId()));
-
-        assertTestUpdateEntity_MultiplicityOneNonCompositeReference(janeId._getId());
-    }
-
-    protected abstract void assertTestUpdateEntity_MultiplicityOneNonCompositeReference(String janeGuid) throws Exception;
-
-    /**
-     * Verify deleting an entity which is contained by another
-     * entity through a bi-directional composite reference.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void testDisconnectBidirectionalReferences() throws Exception {
-        String hrDeptGuid = createHrDeptGraph();
-        ITypedReferenceableInstance hrDept = repositoryService.getEntityDefinition(hrDeptGuid);
-        Map<String, String> nameGuidMap = getEmployeeNameGuidMap(hrDept);
-        String maxGuid = nameGuidMap.get("Max");
-        String janeGuid = nameGuidMap.get("Jane");
-        String johnGuid = nameGuidMap.get("John");
-
-        Assert.assertNotNull(maxGuid);
-        Assert.assertNotNull(janeGuid);
-        Assert.assertNotNull(johnGuid);
-
-        // Verify that Max is one of Jane's subordinates.
-        ITypedReferenceableInstance jane = repositoryService.getEntityDefinition(janeGuid);
-        Object refValue = jane.get("subordinates");
-        Assert.assertTrue(refValue instanceof List);
-        List<Object> subordinates = (List<Object>)refValue;
-        Assert.assertEquals(subordinates.size(), 2);
-        List<String> subordinateIds = new ArrayList<>(2);
-        for (Object listValue : subordinates) {
-            Assert.assertTrue(listValue instanceof ITypedReferenceableInstance);
-            ITypedReferenceableInstance employee = (ITypedReferenceableInstance) listValue;
-            subordinateIds.add(employee.getId()._getId());
-        }
-        Assert.assertTrue(subordinateIds.contains(maxGuid));
-
-
-        EntityResult entityResult = deleteEntities(maxGuid);
-        ITypedReferenceableInstance john = repositoryService.getEntityDefinition("Person", "name", "John");
-
-        assertEquals(entityResult.getDeletedEntities().size(), 1);
-        assertTrue(entityResult.getDeletedEntities().contains(maxGuid));
-        assertEquals(entityResult.getUpdateEntities().size(), 3);
-        assertTrue(entityResult.getUpdateEntities().containsAll(Arrays.asList(jane.getId()._getId(), hrDeptGuid,
-                john.getId()._getId())));
-        assertEntityDeleted(maxGuid);
-
-        assertMaxForTestDisconnectBidirectionalReferences(nameGuidMap);
-
-        // Now delete jane - this should disconnect the manager reference from her
-        // subordinate.
-        entityResult = deleteEntities(janeGuid);
-        assertEquals(entityResult.getDeletedEntities().size(), 1);
-        assertTrue(entityResult.getDeletedEntities().contains(janeGuid));
-        assertEquals(entityResult.getUpdateEntities().size(), 2);
-        assertTrue(entityResult.getUpdateEntities().containsAll(Arrays.asList(hrDeptGuid, john.getId()._getId())));
-
-        assertEntityDeleted(janeGuid);
-
-        john = repositoryService.getEntityDefinition("Person", "name", "John");
-        assertJohnForTestDisconnectBidirectionalReferences(john, janeGuid);
-    }
-
-    protected abstract void assertJohnForTestDisconnectBidirectionalReferences(ITypedReferenceableInstance john,
-                                                                               String janeGuid) throws Exception;
-
-    protected abstract void assertMaxForTestDisconnectBidirectionalReferences(Map<String, String> nameGuidMap)
-            throws Exception;
-
-    /**
-     * Verify deleting entity that is the target of a unidirectional class array reference
-     * from a class instance.
-     */
-    @Test
-    public void testDisconnectUnidirectionalArrayReferenceFromClassType() throws Exception {
-        createDbTableGraph(TestUtils.DATABASE_NAME, TestUtils.TABLE_NAME);
-
-        // Get the guid for one of the table's columns.
-        ITypedReferenceableInstance table = repositoryService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", TestUtils.TABLE_NAME);
-        String tableGuid = table.getId()._getId();
-        List<ITypedReferenceableInstance> columns = (List<ITypedReferenceableInstance>) table.get("columns");
-        Assert.assertEquals(columns.size(), 5);
-        String columnGuid = columns.get(0).getId()._getId();
-
-        // Delete the column.
-        EntityResult entityResult = deleteEntities(columnGuid);
-        assertEquals(entityResult.getDeletedEntities().size(), 1);
-        Assert.assertTrue(entityResult.getDeletedEntities().contains(columnGuid));
-        assertEquals(entityResult.getUpdateEntities().size(), 1);
-        Assert.assertTrue(entityResult.getUpdateEntities().contains(tableGuid));
-        assertEntityDeleted(columnGuid);
-
-        // Verify table.columns reference to the deleted column has been disconnected.
-        table = repositoryService.getEntityDefinition(tableGuid);
-        assertTestDisconnectUnidirectionalArrayReferenceFromClassType(
-                (List<ITypedReferenceableInstance>) table.get("columns"), columnGuid);
-    }
-
-    protected abstract void assertTestDisconnectUnidirectionalArrayReferenceFromClassType(
-            List<ITypedReferenceableInstance> columns, String columnGuid);
-
-    /**
-     * Verify deleting entities that are the target of a unidirectional class array reference
-     * from a struct or trait instance.
-     */
-    @Test
-    public void testDisconnectUnidirectionalArrayReferenceFromStructAndTraitTypes() throws Exception {
-        // Define class types.
-        HierarchicalTypeDefinition<ClassType> structTargetDef = TypesUtil.createClassTypeDef("StructTarget",
-            ImmutableSet.<String>of(), TypesUtil.createOptionalAttrDef("attr1", DataTypes.STRING_TYPE));
-        HierarchicalTypeDefinition<ClassType> traitTargetDef = TypesUtil.createClassTypeDef("TraitTarget",
-            ImmutableSet.<String>of(), TypesUtil.createOptionalAttrDef("attr1", DataTypes.STRING_TYPE));
-        HierarchicalTypeDefinition<ClassType> structContainerDef = TypesUtil.createClassTypeDef("StructContainer",
-            ImmutableSet.<String>of(), TypesUtil.createOptionalAttrDef("struct", "TestStruct"));
-
-        // Define struct and trait types which have a unidirectional array reference
-        // to a class type.
-        StructTypeDefinition structDef = TypesUtil.createStructTypeDef("TestStruct",
-            new AttributeDefinition("target", DataTypes.arrayTypeName("StructTarget"), Multiplicity.OPTIONAL, false, null),
-            new AttributeDefinition("nestedStructs", DataTypes.arrayTypeName("NestedStruct"), Multiplicity.OPTIONAL, false, null));
-        StructTypeDefinition nestedStructDef = TypesUtil.createStructTypeDef("NestedStruct",
-            TypesUtil.createOptionalAttrDef("attr1", DataTypes.STRING_TYPE));
-        HierarchicalTypeDefinition<TraitType> traitDef = TypesUtil.createTraitTypeDef("TestTrait", ImmutableSet.<String>of(),
-            new AttributeDefinition("target", DataTypes.arrayTypeName("TraitTarget"), Multiplicity.OPTIONAL, false, null));
-
-        TypesDef typesDef = TypesUtil.getTypesDef(ImmutableList.<EnumTypeDefinition>of(), ImmutableList.of(structDef, nestedStructDef),
-            ImmutableList.of(traitDef), ImmutableList.of(structTargetDef, traitTargetDef, structContainerDef));
-        typeSystem.defineTypes(typesDef);
-
-        // Create instances of class, struct, and trait types.
-        Referenceable structTargetEntity = new Referenceable("StructTarget");
-        Referenceable traitTargetEntity = new Referenceable("TraitTarget");
-        Referenceable structContainerEntity = new Referenceable("StructContainer");
-        Struct structInstance = new Struct("TestStruct");
-        Struct nestedStructInstance = new Struct("NestedStruct");
-        Referenceable traitInstance = new Referenceable("TestTrait");
-        structContainerEntity.set("struct", structInstance);
-        structInstance.set("target", ImmutableList.of(structTargetEntity));
-        structInstance.set("nestedStructs", ImmutableList.of(nestedStructInstance));
-
-        ClassType structTargetType = typeSystem.getDataType(ClassType.class, "StructTarget");
-        ClassType traitTargetType = typeSystem.getDataType(ClassType.class, "TraitTarget");
-        ClassType structContainerType = typeSystem.getDataType(ClassType.class, "StructContainer");
-
-        ITypedReferenceableInstance structTargetConvertedEntity =
-            structTargetType.convert(structTargetEntity, Multiplicity.REQUIRED);
-        ITypedReferenceableInstance traitTargetConvertedEntity =
-            traitTargetType.convert(traitTargetEntity, Multiplicity.REQUIRED);
-        ITypedReferenceableInstance structContainerConvertedEntity =
-            structContainerType.convert(structContainerEntity, Multiplicity.REQUIRED);
-
-        List<String> guids = repositoryService.createEntities(
-            structTargetConvertedEntity, traitTargetConvertedEntity, structContainerConvertedEntity).getCreatedEntities();
-        Assert.assertEquals(guids.size(), 3);
-
-        guids = repositoryService.getEntityList("StructTarget");
-        Assert.assertEquals(guids.size(), 1);
-        String structTargetGuid = guids.get(0);
-
-        guids = repositoryService.getEntityList("TraitTarget");
-        Assert.assertEquals(guids.size(), 1);
-        String traitTargetGuid = guids.get(0);
-
-        guids = repositoryService.getEntityList("StructContainer");
-        Assert.assertEquals(guids.size(), 1);
-        String structContainerGuid = guids.get(0);
-
-        // Add TestTrait to StructContainer instance
-        traitInstance.set("target", ImmutableList.of(new Id(traitTargetGuid, 0, "TraitTarget")));
-        TraitType traitType = typeSystem.getDataType(TraitType.class, "TestTrait");
-        ITypedStruct convertedTrait = traitType.convert(traitInstance, Multiplicity.REQUIRED);
-        repositoryService.addTrait(structContainerGuid, convertedTrait);
-
-        // Verify that the unidirectional references from the struct and trait instances
-        // are pointing at the target entities.
-        structContainerConvertedEntity = repositoryService.getEntityDefinition(structContainerGuid);
-        Object object = structContainerConvertedEntity.get("struct");
-        Assert.assertNotNull(object);
-        Assert.assertTrue(object instanceof ITypedStruct);
-        ITypedStruct struct = (ITypedStruct) object;
-        object = struct.get("target");
-        Assert.assertNotNull(object);
-        Assert.assertTrue(object instanceof List);
-        List<ITypedReferenceableInstance> refList = (List<ITypedReferenceableInstance>)object;
-        Assert.assertEquals(refList.size(), 1);
-        Assert.assertEquals(refList.get(0).getId()._getId(), structTargetGuid);
-
-        IStruct trait = structContainerConvertedEntity.getTrait("TestTrait");
-        Assert.assertNotNull(trait);
-        object = trait.get("target");
-        Assert.assertNotNull(object);
-        Assert.assertTrue(object instanceof List);
-        refList = (List<ITypedReferenceableInstance>)object;
-        Assert.assertEquals(refList.size(), 1);
-        Assert.assertEquals(refList.get(0).getId()._getId(), traitTargetGuid);
-
-        // Delete the entities that are targets of the struct and trait instances.
-        EntityResult entityResult = deleteEntities(structTargetGuid, traitTargetGuid);
-        Assert.assertEquals(entityResult.getDeletedEntities().size(), 2);
-        Assert.assertTrue(entityResult.getDeletedEntities().containsAll(Arrays.asList(structTargetGuid, traitTargetGuid)));
-        assertEntityDeleted(structTargetGuid);
-        assertEntityDeleted(traitTargetGuid);
-
-        assertTestDisconnectUnidirectionalArrayReferenceFromStructAndTraitTypes(structContainerGuid);
-
-        // Delete the entity which contains nested structs and has the TestTrait trait.
-        entityResult = deleteEntities(structContainerGuid);
-        Assert.assertEquals(entityResult.getDeletedEntities().size(), 1);
-        Assert.assertTrue(entityResult.getDeletedEntities().contains(structContainerGuid));
-        assertEntityDeleted(structContainerGuid);
-
-        // Verify all TestStruct struct vertices were removed.
-        assertVerticesDeleted(getVertices(Constants.ENTITY_TYPE_PROPERTY_KEY, "TestStruct"));
-
-        // Verify all NestedStruct struct vertices were removed.
-        assertVerticesDeleted(getVertices(Constants.ENTITY_TYPE_PROPERTY_KEY, "NestedStruct"));
-
-        // Verify all TestTrait trait vertices were removed.
-        assertVerticesDeleted(getVertices(Constants.ENTITY_TYPE_PROPERTY_KEY, "TestTrait"));
-    }
-
-    protected abstract void assertTestDisconnectUnidirectionalArrayReferenceFromStructAndTraitTypes(
-            String structContainerGuid) throws Exception;
-
-    /**
-     * Verify deleting entities that are the target of class map references.
-     */
-    @Test
-    public void testDisconnectMapReferenceFromClassType() throws Exception {
-        // Define type for map value.
-        HierarchicalTypeDefinition<ClassType> mapValueDef = TypesUtil.createClassTypeDef("MapValue",
-            ImmutableSet.<String>of(),
-            new AttributeDefinition("biMapOwner", "MapOwner", Multiplicity.OPTIONAL, false, "biMap"));
-
-        // Define type with unidirectional and bidirectional map references,
-        // where the map value is a class reference to MapValue.
-        HierarchicalTypeDefinition<ClassType> mapOwnerDef = TypesUtil.createClassTypeDef("MapOwner",
-            ImmutableSet.<String>of(),
-            new AttributeDefinition("map", DataTypes.mapTypeName(DataTypes.STRING_TYPE.getName(),
-                        "MapValue"), Multiplicity.OPTIONAL, false, null),
-            new AttributeDefinition("biMap", DataTypes.mapTypeName(DataTypes.STRING_TYPE.getName(),
-                "MapValue"), Multiplicity.OPTIONAL, false, "biMapOwner"));
-        TypesDef typesDef = TypesUtil.getTypesDef(ImmutableList.<EnumTypeDefinition>of(),
-            ImmutableList.<StructTypeDefinition>of(), ImmutableList.<HierarchicalTypeDefinition<TraitType>>of(),
-            ImmutableList.of(mapOwnerDef, mapValueDef));
-        typeSystem.defineTypes(typesDef);
-        ClassType mapOwnerType = typeSystem.getDataType(ClassType.class, "MapOwner");
-        ClassType mapValueType = typeSystem.getDataType(ClassType.class, "MapValue");
-
-        // Create instances of MapOwner and MapValue.
-        // Set MapOwner.map and MapOwner.biMap with one entry that references MapValue instance.
-        ITypedReferenceableInstance mapOwnerInstance = mapOwnerType.createInstance();
-        ITypedReferenceableInstance mapValueInstance = mapValueType.createInstance();
-        mapOwnerInstance.set("map", Collections.singletonMap("value1", mapValueInstance));
-        mapOwnerInstance.set("biMap", Collections.singletonMap("value1", mapValueInstance));
-        // Set biMapOwner reverse reference on MapValue.
-        mapValueInstance.set("biMapOwner", mapOwnerInstance);
-        List<String> createEntitiesResult = repositoryService.createEntities(mapOwnerInstance, mapValueInstance).getCreatedEntities();
-        Assert.assertEquals(createEntitiesResult.size(), 2);
-        List<String> guids = repositoryService.getEntityList("MapOwner");
-        Assert.assertEquals(guids.size(), 1);
-        String mapOwnerGuid = guids.get(0);
-
-        String edgeLabel = GraphHelper.getEdgeLabel(mapOwnerType, mapOwnerType.fieldMapping.fields.get("map"));
-        String mapEntryLabel = edgeLabel + "." + "value1";
-        AtlasEdgeLabel atlasEdgeLabel = new AtlasEdgeLabel(mapEntryLabel);
-
-        // Verify MapOwner.map attribute has expected value.
-        String mapValueGuid = null;
-        AtlasVertex mapOwnerVertex = null;
-        mapOwnerInstance = repositoryService.getEntityDefinition(mapOwnerGuid);
-        for (String mapAttrName : Arrays.asList("map", "biMap")) {
-            Object object = mapOwnerInstance.get(mapAttrName);
-            Assert.assertNotNull(object);
-            Assert.assertTrue(object instanceof Map);
-            Map<String, ITypedReferenceableInstance> map = (Map<String, ITypedReferenceableInstance>)object;
-            Assert.assertEquals(map.size(), 1);
-            mapValueInstance = map.get("value1");
-            Assert.assertNotNull(mapValueInstance);
-            mapValueGuid = mapValueInstance.getId()._getId();
-            mapOwnerVertex = GraphHelper.getInstance().getVertexForGUID(mapOwnerGuid);
-            object = mapOwnerVertex.getProperty(atlasEdgeLabel.getQualifiedMapKey(), Object.class);
-            Assert.assertNotNull(object);
-        }
-
-        // Delete the map value instance.
-        // This should disconnect the references from the map owner instance.
-        deleteEntities(mapValueGuid);
-        assertEntityDeleted(mapValueGuid);
-        assertTestDisconnectMapReferenceFromClassType(mapOwnerGuid);
-    }
-
-    protected abstract void assertTestDisconnectMapReferenceFromClassType(String mapOwnerGuid) throws Exception;
-
-    @Test
-    public void testDeleteTargetOfMultiplicityOneRequiredReference() throws Exception {
-        createDbTableGraph("db1", "table1");
-        ITypedReferenceableInstance db = repositoryService.getEntityDefinition(TestUtils.DATABASE_TYPE, "name", "db1");
-        try {
-            // table1 references db1 through the required reference hive_table.database.
-            // Attempt to delete db1 should cause a NullRequiredAttributeException,
-            // as that would violate the lower bound on table1's database attribute.
-            deleteEntities(db.getId()._getId());
-            Assert.fail("Lower bound on attribute hive_table.database was not enforced - " +
-                NullRequiredAttributeException.class.getSimpleName() + " was expected but none thrown");
-        }
-        catch (Exception e) {
-            verifyExceptionThrown(e, NullRequiredAttributeException.class);
-        }
-
-        // Delete table1.
-        ITypedReferenceableInstance table1 = repositoryService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", "table1");
-        Assert.assertNotNull(table1);
-        deleteEntities(table1.getId()._getId());
-
-        // Now delete of db1 should succeed, since it is no longer the target
-        // of the required reference from the deleted table1.
-        deleteEntities(db.getId()._getId());
-    }
-
-    @Test
-    public void testDeleteTargetOfMultiplicityManyRequiredReference() throws Exception {
-        String deptGuid = createHrDeptGraph();
-        ITypedReferenceableInstance hrDept = repositoryService.getEntityDefinition(deptGuid);
-        Map<String, String> nameGuidMap = getEmployeeNameGuidMap(hrDept);
-
-        // Delete John - this should work, as it would reduce the cardinality of Jane's subordinates reference
-        // from 2 to 1.
-        deleteEntities(nameGuidMap.get("John"));
-
-        // Attempt to delete Max - this should cause a NullRequiredAttributeException,
-        // as that would reduce the cardinality on Jane's subordinates reference from 1 to 0
-        // and violate the lower bound.
-        try {
-            deleteEntities(nameGuidMap.get("Max"));
-            assertTestDeleteTargetOfMultiplicityRequiredReference();
-        }
-        catch (Exception e) {
-            verifyExceptionThrown(e, NullRequiredAttributeException.class);
-        }
-    }
-
-    protected abstract void assertTestDeleteTargetOfMultiplicityRequiredReference() throws Exception;
-
-    @Test
-    public void testDeleteTargetOfRequiredMapReference() throws Exception {
-        // Define type for map value.
-        HierarchicalTypeDefinition<ClassType> mapValueDef = TypesUtil.createClassTypeDef("RequiredMapValue",
-            ImmutableSet.<String>of());
-
-        // Define type with required map references where the map value is a class reference to RequiredMapValue.
-        HierarchicalTypeDefinition<ClassType> mapOwnerDef = TypesUtil.createClassTypeDef("RequiredMapOwner",
-            ImmutableSet.<String>of(),
-            new AttributeDefinition("map", DataTypes.mapTypeName(DataTypes.STRING_TYPE.getName(),
-                        "RequiredMapValue"), Multiplicity.REQUIRED, false, null));
-        TypesDef typesDef = TypesUtil.getTypesDef(ImmutableList.<EnumTypeDefinition>of(),
-            ImmutableList.<StructTypeDefinition>of(), ImmutableList.<HierarchicalTypeDefinition<TraitType>>of(),
-            ImmutableList.of(mapOwnerDef, mapValueDef));
-        typeSystem.defineTypes(typesDef);
-        ClassType mapOwnerType = typeSystem.getDataType(ClassType.class, "RequiredMapOwner");
-        ClassType mapValueType = typeSystem.getDataType(ClassType.class, "RequiredMapValue");
-
-        // Create instances of RequiredMapOwner and RequiredMapValue.
-        // Set RequiredMapOwner.map with one entry that references RequiredMapValue instance.
-        ITypedReferenceableInstance mapOwnerInstance = mapOwnerType.createInstance();
-        ITypedReferenceableInstance mapValueInstance = mapValueType.createInstance();
-        mapOwnerInstance.set("map", Collections.singletonMap("value1", mapValueInstance));
-        List<String> createEntitiesResult = repositoryService.createEntities(mapOwnerInstance, mapValueInstance).getCreatedEntities();
-        Assert.assertEquals(createEntitiesResult.size(), 2);
-        List<String> guids = repositoryService.getEntityList("RequiredMapOwner");
-        Assert.assertEquals(guids.size(), 1);
-        String mapOwnerGuid = guids.get(0);
-        guids = repositoryService.getEntityList("RequiredMapValue");
-        Assert.assertEquals(guids.size(), 1);
-        String mapValueGuid = guids.get(0);
-
-        // Verify MapOwner.map attribute has expected value.
-        mapOwnerInstance = repositoryService.getEntityDefinition(mapOwnerGuid);
-        Object object = mapOwnerInstance.get("map");
-        Assert.assertNotNull(object);
-        Assert.assertTrue(object instanceof Map);
-        Map<String, ITypedReferenceableInstance> map = (Map<String, ITypedReferenceableInstance>)object;
-        Assert.assertEquals(map.size(), 1);
-        mapValueInstance = map.get("value1");
-        Assert.assertNotNull(mapValueInstance);
-        Assert.assertEquals(mapValueInstance.getId()._getId(), mapValueGuid);
-        String edgeLabel = GraphHelper.getEdgeLabel(mapOwnerType, mapOwnerType.fieldMapping.fields.get("map"));
-        String mapEntryLabel = edgeLabel + "." + "value1";
-        AtlasEdgeLabel atlasEdgeLabel = new AtlasEdgeLabel(mapEntryLabel);
-        AtlasVertex mapOwnerVertex = GraphHelper.getInstance().getVertexForGUID(mapOwnerGuid);
-        object = mapOwnerVertex.getProperty(atlasEdgeLabel.getQualifiedMapKey(), Object.class);
-        Assert.assertNotNull(object);
-
-        // Verify deleting the target of required map attribute throws a NullRequiredAttributeException.
-        try {
-            deleteEntities(mapValueGuid);
-            Assert.fail(NullRequiredAttributeException.class.getSimpleName() + " was expected but none thrown.");
-        }
-        catch (Exception e) {
-            verifyExceptionThrown(e, NullRequiredAttributeException.class);
-        }
-    }
-
-    @Test
-    public void testLowerBoundsIgnoredOnDeletedEntities() throws Exception {
-
-        String hrDeptGuid = createHrDeptGraph();
-        ITypedReferenceableInstance hrDept = repositoryService.getEntityDefinition(hrDeptGuid);
-        Map<String, String> nameGuidMap = getEmployeeNameGuidMap(hrDept);
-
-        ITypedReferenceableInstance john = repositoryService.getEntityDefinition(nameGuidMap.get("John"));
-        String johnGuid = john.getId()._getId();
-
-        ITypedReferenceableInstance max = repositoryService.getEntityDefinition(nameGuidMap.get("Max"));
-        String maxGuid = max.getId()._getId();
-
-        ITypedReferenceableInstance jane = repositoryService.getEntityDefinition(nameGuidMap.get("Jane"));
-        String janeGuid = jane.getId()._getId();
-
-        // The lower bound constraint on Manager.subordinates should not be enforced on Jane since that entity is being deleted.
-        // Prior to the fix for ATLAS-991, this call would fail with a NullRequiredAttributeException.
-        EntityResult deleteResult = deleteEntities(johnGuid, maxGuid, janeGuid);
-        Assert.assertEquals(deleteResult.getDeletedEntities().size(), 3);
-        Assert.assertTrue(deleteResult.getDeletedEntities().containsAll(Arrays.asList(johnGuid, maxGuid, janeGuid)));
-        Assert.assertEquals(deleteResult.getUpdateEntities().size(), 1);
-
-        // Verify that Department entity was updated to disconnect its references to the deleted employees.
-        Assert.assertEquals(deleteResult.getUpdateEntities().get(0), hrDeptGuid);
-        hrDept = repositoryService.getEntityDefinition(hrDeptGuid);
-        Object object = hrDept.get("employees");
-        Assert.assertTrue(object instanceof List);
-        List<ITypedReferenceableInstance> employees = (List<ITypedReferenceableInstance>) object;
-        assertTestLowerBoundsIgnoredOnDeletedEntities(employees);
-    }
-
-    protected abstract void assertTestLowerBoundsIgnoredOnDeletedEntities(List<ITypedReferenceableInstance> employees);
-
-    @Test
-    public void testLowerBoundsIgnoredOnCompositeDeletedEntities() throws Exception {
-        String hrDeptGuid = createHrDeptGraph();
-        ITypedReferenceableInstance hrDept = repositoryService.getEntityDefinition(hrDeptGuid);
-        Map<String, String> nameGuidMap = getEmployeeNameGuidMap(hrDept);
-        ITypedReferenceableInstance john = repositoryService.getEntityDefinition(nameGuidMap.get("John"));
-        String johnGuid = john.getId()._getId();
-        ITypedReferenceableInstance max = repositoryService.getEntityDefinition(nameGuidMap.get("Max"));
-        String maxGuid = max.getId()._getId();
-
-        // The lower bound constraint on Manager.subordinates should not be enforced on the composite entity
-        // for Jane owned by the Department entity, since that entity is being deleted.
-        // Prior to the fix for ATLAS-991, this call would fail with a NullRequiredAttributeException.
-        EntityResult deleteResult = deleteEntities(johnGuid, maxGuid, hrDeptGuid);
-        Assert.assertEquals(deleteResult.getDeletedEntities().size(), 5);
-        Assert.assertTrue(deleteResult.getDeletedEntities().containsAll(nameGuidMap.values()));
-        Assert.assertTrue(deleteResult.getDeletedEntities().contains(hrDeptGuid));
-        assertTestLowerBoundsIgnoredOnCompositeDeletedEntities(hrDeptGuid);
-    }
-
-
-    protected abstract void assertTestLowerBoundsIgnoredOnCompositeDeletedEntities(String hrDeptGuid) throws Exception;
-
-    @Test
-    public void testLowerBoundsIgnoredWhenDeletingCompositeEntitesOwnedByMap() throws Exception {
-        // Define MapValueReferencer type with required reference to CompositeMapValue.
-        HierarchicalTypeDefinition<ClassType> mapValueReferencerTypeDef = TypesUtil.createClassTypeDef("MapValueReferencer",
-            ImmutableSet.<String>of(),
-            new AttributeDefinition("refToMapValue", "CompositeMapValue", Multiplicity.REQUIRED, false, null));
-
-        // Define MapValueReferencerContainer type with required composite map reference to MapValueReferencer.
-        HierarchicalTypeDefinition<ClassType> mapValueReferencerContainerTypeDef =
-            TypesUtil.createClassTypeDef("MapValueReferencerContainer",
-            ImmutableSet.<String>of(),
-            new AttributeDefinition("requiredMap", DataTypes.mapTypeName(DataTypes.STRING_TYPE.getName(), "MapValueReferencer"), Multiplicity.REQUIRED, true, null));
-
-        Map<String, IDataType> definedClassTypes = typeSystem.defineClassTypes(mapValueReferencerTypeDef, mapValueReferencerContainerTypeDef);
-        ClassType mapValueReferencerClassType = (ClassType) definedClassTypes.get("MapValueReferencer");
-        ClassType mapValueReferencerContainerType = (ClassType) definedClassTypes.get("MapValueReferencerContainer");
-
-        // Create instances of CompositeMapOwner and CompositeMapValue.
-        // Set MapOwner.map with one entry that references MapValue instance.
-        ITypedReferenceableInstance entityDefinition = createMapOwnerAndValueEntities();
-        String mapOwnerGuid = entityDefinition.getId()._getId();
-
-        // Verify MapOwner.map attribute has expected value.
-        ITypedReferenceableInstance mapOwnerInstance = repositoryService.getEntityDefinition(mapOwnerGuid);
-        Object object = mapOwnerInstance.get("map");
-        Assert.assertNotNull(object);
-        Assert.assertTrue(object instanceof Map);
-        Map<String, ITypedReferenceableInstance> map = (Map<String, ITypedReferenceableInstance>)object;
-        Assert.assertEquals(map.size(), 1);
-        ITypedReferenceableInstance mapValueInstance = map.get("value1");
-        Assert.assertNotNull(mapValueInstance);
-        String mapValueGuid = mapValueInstance.getId()._getId();
-
-        // Create instance of MapValueReferencerContainer
-        RequestContext.createContext();
-        ITypedReferenceableInstance mapValueReferencerContainer = mapValueReferencerContainerType.createInstance();
-        List<String> createdEntities = repositoryService.createEntities(mapValueReferencerContainer).getCreatedEntities();
-        Assert.assertEquals(createdEntities.size(), 1);
-        String mapValueReferencerContainerGuid = createdEntities.get(0);
-        mapValueReferencerContainer = repositoryService.getEntityDefinition(createdEntities.get(0));
-
-        // Create instance of MapValueReferencer, and update mapValueReferencerContainer
-        // to reference it.
-        ITypedReferenceableInstance mapValueReferencer = mapValueReferencerClassType.createInstance();
-        mapValueReferencerContainer.set("requiredMap", Collections.singletonMap("value1", mapValueReferencer));
-        mapValueReferencer.set("refToMapValue", mapValueInstance.getId());
-
-        RequestContext.createContext();
-        EntityResult updateEntitiesResult = repositoryService.updateEntities(mapValueReferencerContainer).getEntityResult();
-        Assert.assertEquals(updateEntitiesResult.getCreatedEntities().size(), 1);
-        Assert.assertEquals(updateEntitiesResult.getUpdateEntities().size(), 1);
-        Assert.assertEquals(updateEntitiesResult.getUpdateEntities().get(0), mapValueReferencerContainerGuid);
-        String mapValueReferencerGuid = updateEntitiesResult.getCreatedEntities().get(0);
-
-        // Delete map owner and map referencer container.  A total of 4 entities should be deleted,
-        // including the composite entities.  The lower bound constraint on MapValueReferencer.refToMapValue
-        // should not be enforced on the composite MapValueReferencer since it is being deleted.
-        EntityResult deleteEntitiesResult = repositoryService.deleteEntities(Arrays.asList(mapOwnerGuid, mapValueReferencerContainerGuid));
-        Assert.assertEquals(deleteEntitiesResult.getDeletedEntities().size(), 4);
-        Assert.assertTrue(deleteEntitiesResult.getDeletedEntities().containsAll(
-            Arrays.asList(mapOwnerGuid, mapValueGuid, mapValueReferencerContainerGuid, mapValueReferencerGuid)));
-    }
-
-    @Test
-    public void testDeleteMixOfExistentAndNonExistentEntities() throws Exception {
-        ITypedReferenceableInstance entity1 = compositeMapValueType.createInstance();
-        ITypedReferenceableInstance entity2 = compositeMapValueType.createInstance();
-        List<String> createEntitiesResult = repositoryService.createEntities(entity1, entity2).getCreatedEntities();
-        Assert.assertEquals(createEntitiesResult.size(), 2);
-        List<String> guids = Arrays.asList(createEntitiesResult.get(0), "non-existent-guid1", "non-existent-guid2", createEntitiesResult.get(1));
-        EntityResult deleteEntitiesResult = repositoryService.deleteEntities(guids);
-        Assert.assertEquals(deleteEntitiesResult.getDeletedEntities().size(), 2);
-        Assert.assertTrue(deleteEntitiesResult.getDeletedEntities().containsAll(createEntitiesResult));
-    }
-
-    @Test
-    public void testDeleteMixOfNullAndNonNullGuids() throws Exception {
-        ITypedReferenceableInstance entity1 = compositeMapValueType.createInstance();
-        ITypedReferenceableInstance entity2 = compositeMapValueType.createInstance();
-        List<String> createEntitiesResult = repositoryService.createEntities(entity1, entity2).getCreatedEntities();
-        Assert.assertEquals(createEntitiesResult.size(), 2);
-        List<String> guids = Arrays.asList(createEntitiesResult.get(0), null, null, createEntitiesResult.get(1));
-        EntityResult deleteEntitiesResult = repositoryService.deleteEntities(guids);
-        Assert.assertEquals(deleteEntitiesResult.getDeletedEntities().size(), 2);
-        Assert.assertTrue(deleteEntitiesResult.getDeletedEntities().containsAll(createEntitiesResult));
-    }
-
-    @Test
-    public void testDeleteCompositeEntityAndContainer() throws Exception {
-        Referenceable db = createDBEntity();
-        String dbId = createInstance(db);
-
-        Referenceable column = createColumnEntity();
-        String colId = createInstance(column);
-
-        Referenceable table1 = createTableEntity(dbId);
-        table1.set(COLUMNS_ATTR_NAME, Arrays.asList(new Id(colId, 0, COLUMN_TYPE)));
-        String table1Id = createInstance(table1);
-        Referenceable table2 = createTableEntity(dbId);
-        String table2Id = createInstance(table2);
-
-        // Delete the tables and column
-        EntityResult entityResult = deleteEntities(table1Id, colId, table2Id);
-        Assert.assertEquals(entityResult.getDeletedEntities().size(), 3);
-        Assert.assertTrue(entityResult.getDeletedEntities().containsAll(Arrays.asList(colId, table1Id, table2Id)));
-        assertEntityDeleted(table1Id);
-        assertEntityDeleted(colId);
-        assertEntityDeleted(table2Id);
-    }
-
-    @Test
-    public void testDeleteEntityWithDuplicateReferenceListElements() throws Exception {
-        // Create a table entity, with 2 composite column entities
-        Referenceable dbEntity = createDBEntity();
-        String dbGuid = createInstance(dbEntity);
-        Referenceable table1Entity = createTableEntity(dbGuid);
-        String tableName = TestUtils.randomString();
-        table1Entity.set(NAME, tableName);
-        Referenceable col1 = createColumnEntity();
-        col1.set(NAME, TestUtils.randomString());
-        Referenceable col2 = createColumnEntity();
-        col2.set(NAME, TestUtils.randomString());
-        // Populate columns reference list with duplicates.
-        table1Entity.set(COLUMNS_ATTR_NAME, ImmutableList.of(col1, col2, col1, col2));
-        ClassType dataType = typeSystem.getDataType(ClassType.class, table1Entity.getTypeName());
-        ITypedReferenceableInstance instance = dataType.convert(table1Entity, Multiplicity.REQUIRED);
-        TestUtils.resetRequestContext();
-        List<String> result = repositoryService.createEntities(instance).getCreatedEntities();
-        Assert.assertEquals(result.size(), 3);
-        ITypedReferenceableInstance entityDefinition = repositoryService.getEntityDefinition(TABLE_TYPE, NAME, tableName);
-        String tableGuid = entityDefinition.getId()._getId();
-        Object attrValue = entityDefinition.get(COLUMNS_ATTR_NAME);
-        assertTrue(attrValue instanceof List);
-        List<ITypedReferenceableInstance> columns = (List<ITypedReferenceableInstance>) attrValue;
-        Assert.assertEquals(columns.size(), 4);
-        TestUtils.resetRequestContext();
-        String columnGuid = columns.get(0).getId()._getId();
-
-        // Delete one of the columns.
-        EntityResult deleteResult = repositoryService.deleteEntities(Collections.singletonList(columnGuid));
-        Assert.assertEquals(deleteResult.getDeletedEntities().size(), 1);
-        Assert.assertTrue(deleteResult.getDeletedEntities().contains(columnGuid));
-        Assert.assertEquals(deleteResult.getUpdateEntities().size(), 1);
-        Assert.assertTrue(deleteResult.getUpdateEntities().contains(tableGuid));
-
-        // Verify the duplicate edge IDs were all removed from reference property list.
-        AtlasVertex tableVertex = GraphHelper.getInstance().getVertexForGUID(tableGuid);
-        String columnsPropertyName = GraphHelper.getQualifiedFieldName(dataType, COLUMNS_ATTR_NAME);
-        List columnsPropertyValue = tableVertex.getProperty(columnsPropertyName, List.class);
-        verifyTestDeleteEntityWithDuplicateReferenceListElements(columnsPropertyValue);
-    }
-
-    protected abstract void verifyTestDeleteEntityWithDuplicateReferenceListElements(List columnsPropertyValue);
-
-    private String createHrDeptGraph() throws Exception {
-        ITypedReferenceableInstance hrDept = TestUtils.createDeptEg1(typeSystem);
-
-        List<String> guids = repositoryService.createEntities(hrDept).getCreatedEntities();
-        Assert.assertNotNull(guids);
-        Assert.assertEquals(guids.size(), 5);
-
-        return getDepartmentGuid(guids);
-    }
-
-    private String getDepartmentGuid(List<String> guids)
-        throws RepositoryException, EntityNotFoundException {
-
-        String hrDeptGuid = null;
-        for (String guid : guids) {
-            ITypedReferenceableInstance entityDefinition = repositoryService.getEntityDefinition(guid);
-            Id id = entityDefinition.getId();
-            if (id.getTypeName().equals("Department")) {
-                hrDeptGuid = id._getId();
-                break;
-            }
-        }
-        if (hrDeptGuid == null) {
-            Assert.fail("Entity for type Department not found");
-        }
-        return hrDeptGuid;
-    }
-
-    private void createDbTableGraph(String dbName, String tableName) throws Exception {
-        Referenceable databaseInstance = new Referenceable(TestUtils.DATABASE_TYPE);
-        databaseInstance.set("name", dbName);
-        databaseInstance.set("description", "foo database");
-
-        ClassType dbType = typeSystem.getDataType(ClassType.class, TestUtils.DATABASE_TYPE);
-        ITypedReferenceableInstance db = dbType.convert(databaseInstance, Multiplicity.REQUIRED);
-        Referenceable tableInstance = new Referenceable(TestUtils.TABLE_TYPE, TestUtils.CLASSIFICATION);
-        tableInstance.set("name", tableName);
-        tableInstance.set("description", "bar table");
-        tableInstance.set("type", "managed");
-        Struct traitInstance = (Struct) tableInstance.getTrait(TestUtils.CLASSIFICATION);
-        traitInstance.set("tag", "foundation_etl");
-        tableInstance.set("tableType", 1); // enum
-
-        tableInstance.set("database", databaseInstance);
-        ArrayList<Referenceable> columns = new ArrayList<>();
-        for (int index = 0; index < 5; index++) {
-            Referenceable columnInstance = new Referenceable("column_type");
-            final String name = "column_" + index;
-            columnInstance.set("name", name);
-            columnInstance.set("type", "string");
-            columns.add(columnInstance);
-        }
-        tableInstance.set("columns", columns);
-        ClassType tableType = typeSystem.getDataType(ClassType.class, TestUtils.TABLE_TYPE);
-        ITypedReferenceableInstance table = tableType.convert(tableInstance, Multiplicity.REQUIRED);
-        repositoryService.createEntities(db, table);
-    }
-
-    protected List<AtlasVertex> getVertices(String propertyName, Object value) {
-        AtlasGraph graph = TestUtils.getGraph();
-        Iterable<AtlasVertex> vertices = graph.getVertices(propertyName, value);
-        List<AtlasVertex> list = new ArrayList<>();
-        for (AtlasVertex vertex : vertices) {
-            list.add(vertex);
-        }
-        return list;
-    }
-
-    private Map<String, String> getEmployeeNameGuidMap(final ITypedReferenceableInstance hrDept) throws AtlasException {
-        Object refValue = hrDept.get("employees");
-        Assert.assertTrue(refValue instanceof List);
-        List<Object> employees = (List<Object>)refValue;
-        Assert.assertEquals(employees.size(), 4);
-        Map<String, String> nameGuidMap = new HashMap<String, String>() {{
-            put("hr", hrDept.getId()._getId());
-        }};
-
-        for (Object listValue : employees) {
-            Assert.assertTrue(listValue instanceof ITypedReferenceableInstance);
-            ITypedReferenceableInstance employee = (ITypedReferenceableInstance) listValue;
-            nameGuidMap.put((String)employee.get("name"), employee.getId()._getId());
-        }
-        return nameGuidMap;
-    }
-
-    /**
-     * Search exception cause chain for specified exception.
-     *
-     * @param thrown root of thrown exception chain
-     * @param expected  class of expected exception
-     */
-    private void verifyExceptionThrown(Exception thrown, Class expected) {
-
-        boolean exceptionFound = false;
-        Throwable cause = thrown;
-        while (cause != null) {
-            if (expected.isInstance(cause)) {
-                // good
-                exceptionFound = true;
-                break;
-            }
-            else {
-                cause = cause.getCause();
-            }
-        }
-        if (!exceptionFound) {
-            Assert.fail(expected.getSimpleName() + " was expected but not thrown", thrown);
-        }
-    }
-}