Search in sources :

Example 26 with ITypedReferenceableInstance

use of org.apache.atlas.typesystem.ITypedReferenceableInstance in project incubator-atlas by apache.

the class GraphBackedMetadataRepositoryDeleteTestBase method testDisconnectMapReferenceFromClassType.

/**
 * 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);
}
Also used : ITypedReferenceableInstance(org.apache.atlas.typesystem.ITypedReferenceableInstance) TypesDef(org.apache.atlas.typesystem.TypesDef) AtlasVertex(org.apache.atlas.repository.graphdb.AtlasVertex) HashMap(java.util.HashMap) Map(java.util.Map) Test(org.testng.annotations.Test)

Example 27 with ITypedReferenceableInstance

use of org.apache.atlas.typesystem.ITypedReferenceableInstance in project incubator-atlas by apache.

the class GraphBackedMetadataRepositoryDeleteTestBase method testUpdateEntity_MultiplicityOneNonCompositeReference.

@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());
}
Also used : AtlasVertex(org.apache.atlas.repository.graphdb.AtlasVertex) ITypedReferenceableInstance(org.apache.atlas.typesystem.ITypedReferenceableInstance) ArrayList(java.util.ArrayList) ImmutableList(com.google.common.collect.ImmutableList) List(java.util.List) Id(org.apache.atlas.typesystem.persistence.Id) EntityResult(org.apache.atlas.model.legacy.EntityResult) Test(org.testng.annotations.Test)

Example 28 with ITypedReferenceableInstance

use of org.apache.atlas.typesystem.ITypedReferenceableInstance in project incubator-atlas by apache.

the class GraphBackedMetadataRepositoryDeleteTestBase method testLowerBoundsIgnoredOnDeletedEntities.

@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);
}
Also used : ITypedReferenceableInstance(org.apache.atlas.typesystem.ITypedReferenceableInstance) ArrayList(java.util.ArrayList) ImmutableList(com.google.common.collect.ImmutableList) List(java.util.List) EntityResult(org.apache.atlas.model.legacy.EntityResult) Test(org.testng.annotations.Test)

Example 29 with ITypedReferenceableInstance

use of org.apache.atlas.typesystem.ITypedReferenceableInstance in project incubator-atlas by apache.

the class GraphBackedMetadataRepositoryDeleteTestBase method testDeleteMixOfExistentAndNonExistentEntities.

@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));
}
Also used : ITypedReferenceableInstance(org.apache.atlas.typesystem.ITypedReferenceableInstance) EntityResult(org.apache.atlas.model.legacy.EntityResult) Test(org.testng.annotations.Test)

Example 30 with ITypedReferenceableInstance

use of org.apache.atlas.typesystem.ITypedReferenceableInstance in project incubator-atlas by apache.

the class GraphBackedMetadataRepositoryDeleteTestBase method createMapOwnerAndValueEntities.

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;
}
Also used : ITypedReferenceableInstance(org.apache.atlas.typesystem.ITypedReferenceableInstance)

Aggregations

ITypedReferenceableInstance (org.apache.atlas.typesystem.ITypedReferenceableInstance)142 Test (org.testng.annotations.Test)54 List (java.util.List)34 ArrayList (java.util.ArrayList)30 Id (org.apache.atlas.typesystem.persistence.Id)28 Referenceable (org.apache.atlas.typesystem.Referenceable)22 AtlasVertex (org.apache.atlas.repository.graphdb.AtlasVertex)21 ImmutableList (com.google.common.collect.ImmutableList)20 ClassType (org.apache.atlas.typesystem.types.ClassType)19 HashMap (java.util.HashMap)16 AtlasException (org.apache.atlas.AtlasException)16 IReferenceableInstance (org.apache.atlas.typesystem.IReferenceableInstance)16 ITypedStruct (org.apache.atlas.typesystem.ITypedStruct)14 EntityResult (org.apache.atlas.model.legacy.EntityResult)12 IStruct (org.apache.atlas.typesystem.IStruct)10 Map (java.util.Map)9 CreateUpdateEntitiesResult (org.apache.atlas.CreateUpdateEntitiesResult)9 AtlasEntity (org.apache.atlas.model.instance.AtlasEntity)9 RepositoryException (org.apache.atlas.repository.RepositoryException)9 BeforeTest (org.testng.annotations.BeforeTest)9