Repository: incubator-atlas Updated Branches: refs/heads/master 0fc207196 -> 6b0f7d82d
ATLAS-553 Entity mutation - Fix issue with reordering of elements in array<class> with composite references ( sumasai via shwethags) Project: http://git-wip-us.apache.org/repos/asf/incubator-atlas/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-atlas/commit/6b0f7d82 Tree: http://git-wip-us.apache.org/repos/asf/incubator-atlas/tree/6b0f7d82 Diff: http://git-wip-us.apache.org/repos/asf/incubator-atlas/diff/6b0f7d82 Branch: refs/heads/master Commit: 6b0f7d82db762858249e276bf9fd6d06e869f949 Parents: 0fc2071 Author: Suma Shivaprasad <[email protected]> Authored: Fri Apr 1 11:37:49 2016 -0700 Committer: Suma Shivaprasad <[email protected]> Committed: Fri Apr 1 11:37:49 2016 -0700 ---------------------------------------------------------------------- .../org/apache/atlas/hive/hook/HiveHookIT.java | 40 ++- release-log.txt | 1 + .../graph/TypedInstanceToGraphMapper.java | 121 +++++---- .../test/java/org/apache/atlas/TestUtils.java | 3 +- .../service/DefaultMetadataServiceTest.java | 270 ++++++++++++------- 5 files changed, 285 insertions(+), 150 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6b0f7d82/addons/hive-bridge/src/test/java/org/apache/atlas/hive/hook/HiveHookIT.java ---------------------------------------------------------------------- diff --git a/addons/hive-bridge/src/test/java/org/apache/atlas/hive/hook/HiveHookIT.java b/addons/hive-bridge/src/test/java/org/apache/atlas/hive/hook/HiveHookIT.java index 07ee139..baa427b 100755 --- a/addons/hive-bridge/src/test/java/org/apache/atlas/hive/hook/HiveHookIT.java +++ b/addons/hive-bridge/src/test/java/org/apache/atlas/hive/hook/HiveHookIT.java @@ -22,7 +22,6 @@ import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import org.apache.atlas.ApplicationProperties; import org.apache.atlas.AtlasClient; -import org.apache.atlas.AtlasServiceException; import org.apache.atlas.hive.bridge.HiveMetaStoreBridge; import org.apache.atlas.hive.model.HiveDataModelGenerator; import org.apache.atlas.hive.model.HiveDataTypes; @@ -365,14 +364,16 @@ public class HiveHookIT { @Test public void testAlterTableDropColumn() throws Exception { String tableName = createTable(); - final String colDropped = "name"; - String query = "alter table " + tableName + " replace columns (id int)"; + final String colDropped = "id"; + String query = "alter table " + tableName + " replace columns (name string)"; runCommand(query); assertColumnIsNotRegistered(HiveMetaStoreBridge.getColumnQualifiedName(HiveMetaStoreBridge.getTableQualifiedName(CLUSTER_NAME, DEFAULT_DB, tableName), colDropped)); //Verify the number of columns present in the table final List<Referenceable> columns = getColumns(DEFAULT_DB, tableName); Assert.assertEquals(columns.size(), 1); + + Assert.assertEquals(columns.get(0).get(HiveDataModelGenerator.NAME), "name"); } @Test @@ -420,6 +421,39 @@ public class HiveHookIT { assertColumnIsRegistered(newColQualifiedName); Assert.assertEquals(columns.get(1).get(HiveDataModelGenerator.COMMENT), comment); + + //Change column position + oldColName = "name3"; + newColName = "name4"; + query = String.format("alter table %s change column %s %s %s first", tableName, oldColName, newColName, newColType); + runCommand(query); + + columns = getColumns(DEFAULT_DB, tableName); + Assert.assertEquals(columns.size(), 2); + + assertColumnIsNotRegistered(HiveMetaStoreBridge.getColumnQualifiedName(HiveMetaStoreBridge.getTableQualifiedName(CLUSTER_NAME, DEFAULT_DB, tableName), oldColName)); + newColQualifiedName = HiveMetaStoreBridge.getColumnQualifiedName(HiveMetaStoreBridge.getTableQualifiedName(CLUSTER_NAME, DEFAULT_DB, tableName), newColName); + assertColumnIsRegistered(newColQualifiedName); + + //Change col position again + Assert.assertEquals(columns.get(0).get(HiveDataModelGenerator.NAME), newColName); + Assert.assertEquals(columns.get(1).get(HiveDataModelGenerator.NAME), "id"); + + oldColName = "name4"; + newColName = "name5"; + query = String.format("alter table %s change column %s %s %s after id", tableName, oldColName, newColName, newColType); + runCommand(query); + + columns = getColumns(DEFAULT_DB, tableName); + Assert.assertEquals(columns.size(), 2); + + assertColumnIsNotRegistered(HiveMetaStoreBridge.getColumnQualifiedName(HiveMetaStoreBridge.getTableQualifiedName(CLUSTER_NAME, DEFAULT_DB, tableName), oldColName)); + newColQualifiedName = HiveMetaStoreBridge.getColumnQualifiedName(HiveMetaStoreBridge.getTableQualifiedName(CLUSTER_NAME, DEFAULT_DB, tableName), newColName); + assertColumnIsRegistered(newColQualifiedName); + + //Check col position + Assert.assertEquals(columns.get(1).get(HiveDataModelGenerator.NAME), newColName); + Assert.assertEquals(columns.get(0).get(HiveDataModelGenerator.NAME), "id"); } @Test http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6b0f7d82/release-log.txt ---------------------------------------------------------------------- diff --git a/release-log.txt b/release-log.txt index 5d3bea0..63a0315 100644 --- a/release-log.txt +++ b/release-log.txt @@ -13,6 +13,7 @@ ATLAS-409 Atlas will not import avro tables with schema read from a file (dosset ATLAS-379 Create sqoop and falcon metadata addons (venkatnrangan,bvellanki,sowmyaramesh via shwethags) ALL CHANGES: +ATLAS-553 Entity mutation - Fix issue with reordering of elements in array<class> with composite references (sumasai via shwethags) ATLAS-513 Admin support for HA (yhemanth via sumasai) ATLAS-511 Ability to run multiple instances of Atlas Server with automatic failover to one active server (yhemanth via shwethags) ATLAS-577 Integrate entity audit with DefaultMetadataService (shwethags) http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6b0f7d82/repository/src/main/java/org/apache/atlas/repository/graph/TypedInstanceToGraphMapper.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/graph/TypedInstanceToGraphMapper.java b/repository/src/main/java/org/apache/atlas/repository/graph/TypedInstanceToGraphMapper.java index ed403e7..7011fdf 100644 --- a/repository/src/main/java/org/apache/atlas/repository/graph/TypedInstanceToGraphMapper.java +++ b/repository/src/main/java/org/apache/atlas/repository/graph/TypedInstanceToGraphMapper.java @@ -57,14 +57,18 @@ import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; public final class TypedInstanceToGraphMapper { private static final Logger LOG = LoggerFactory.getLogger(TypedInstanceToGraphMapper.class); private final Map<Id, Vertex> idToVertexMap = new HashMap<>(); + //Maintains a set of Guid based Ids that are referenced/created during graph walk + private final Set<Id> referencedIds = new HashSet<>(); private final TypeSystem typeSystem = TypeSystem.getInstance(); private final List<String> deletedEntityGuids = new ArrayList<>(); private final List<ITypedReferenceableInstance> deletedEntities = new ArrayList<>(); @@ -301,10 +305,13 @@ public final class TypedInstanceToGraphMapper { newInstance = (ITypedReferenceableInstance) instance; instancesToUpdate.add(newInstance); } + } //Set the id in the new instance idToVertexMap.put(id, instanceVertex); + referencedIds.add(GraphHelper.getIdFromVertex(instance.getTypeName(), instanceVertex)); + } } return TypeUtils.Pair.of(instancesToCreate, instancesToUpdate); @@ -395,7 +402,14 @@ public final class TypedInstanceToGraphMapper { if (currentEntries != null) { if (index < currentEntries.size()) { for (; index < currentEntries.size(); index++) { - removeUnusedReference(currentEntries.get(index), attributeInfo, elementType); + if (elementType.getTypeCategory() == TypeCategory.CLASS) { + final String edgeId = currentEntries.get(index); + final Pair<Edge, Vertex> edgeAndTargetVertex = GraphHelper.getInstance().getEdgeAndTargetVertex(edgeId); + Id guid = GraphHelper.getIdFromVertex(elementType.getName(), edgeAndTargetVertex.right); + removeUnusedClassReference(edgeId, attributeInfo, elementType, !referencedIds.contains(guid)); + } else if (elementType.getTypeCategory() == TypeCategory.STRUCT) { + removeUnusedStructReference(currentEntries.get(index), attributeInfo, elementType); + } } } } @@ -403,8 +417,12 @@ public final class TypedInstanceToGraphMapper { else if (operation == Operation.UPDATE_FULL || operation == Operation.DELETE) { // Clear all existing entries if (currentEntries != null) { - for (String edgeId : currentEntries) { - removeUnusedReference(edgeId, attributeInfo, elementType); + for (String entry : currentEntries) { + if (elementType.getTypeCategory() == TypeCategory.CLASS) { + removeUnusedClassReference(entry, attributeInfo, elementType, true); + } else if(elementType.getTypeCategory() == TypeCategory.STRUCT) { + removeUnusedStructReference(entry, attributeInfo, elementType); + } } } } @@ -451,8 +469,13 @@ public final class TypedInstanceToGraphMapper { String edgeLabel = GraphHelper.getEdgeLabel(typedInstance, attributeInfo) + "." + unusedKey; if (instanceVertex.getEdges(Direction.OUT, edgeLabel).iterator().hasNext()) { Edge edge = instanceVertex.getEdges(Direction.OUT, edgeLabel).iterator().next(); - removeUnusedReference(edge.getId().toString(), attributeInfo, - ((DataTypes.MapType) attributeInfo.dataType()).getValueType()); + if (TypeCategory.STRUCT.equals(((DataTypes.MapType) attributeInfo.dataType()).getValueType().getTypeCategory())) { + removeUnusedStructReference(edge.getId().toString(), attributeInfo, + ((DataTypes.MapType) attributeInfo.dataType()).getValueType()); + } else if(TypeCategory.CLASS.equals(((DataTypes.MapType) attributeInfo.dataType()).getValueType().getTypeCategory())){ + final Vertex targetVertex = edge.getVertex(Direction.OUT); + Id guid = GraphHelper.getIdFromVertex(elementType.getName(), targetVertex); + removeUnusedClassReference(edge.getId().toString(), attributeInfo, elementType, !referencedIds.contains(guid)); } } } } @@ -499,7 +522,7 @@ public final class TypedInstanceToGraphMapper { TypeUtils.Pair<Vertex, Edge> vertexEdgePair = null; if (curVal != null && structAttr == null) { //remove edge - removeUnusedReference(curVal, attributeInfo, elementType); + removeUnusedStructReference(curVal, attributeInfo, elementType); } else if (curVal != null && structAttr != null) { //update Edge edge = graphHelper.getOutGoingEdgeById(curVal); @@ -524,7 +547,7 @@ public final class TypedInstanceToGraphMapper { TypeUtils.Pair<Vertex, Edge> vertexEdgePair = null; if (curVal != null && newVal == null) { //remove edge - removeUnusedReference(curVal, attributeInfo, elementType); + removeUnusedClassReference(curVal, attributeInfo, elementType, true); } else if (curVal != null && newVal != null) { Edge edge = graphHelper.getOutGoingEdgeById(curVal); Id classRefId = getId(newVal); @@ -586,14 +609,17 @@ public final class TypedInstanceToGraphMapper { String currentGUID = invertex.getProperty(Constants.GUID_PROPERTY_KEY); Id currentId = new Id(currentGUID, 0, (String) invertex.getProperty(Constants.ENTITY_TYPE_PROPERTY_KEY)); if (!currentId.equals(id)) { - // add an edge to the class vertex from the instance - if(toVertex != null) { + // add an edge to the class vertex from the instance + if (toVertex != null) { newEdge = graphHelper.addEdge(instanceVertex, toVertex, edgeLabel); result = TypeUtils.Pair.of(toVertex, newEdge); } - removeUnusedReference(edge.getId().toString(), attributeInfo, dataType); + + //Delete vertex only if the IdtoVertex map doesnt have it in future references + removeUnusedClassReference(edge.getId().toString(), attributeInfo, dataType, !referencedIds.contains(currentId)); } + if (attributeInfo.isComposite) { //Update the attributes also if composite if (typedInstance.fieldMapping() != null) { @@ -670,59 +696,62 @@ public final class TypedInstanceToGraphMapper { GraphHelper.setProperty(instanceVertex, vertexPropertyName, propertyValue); } - private Edge removeUnusedReference(String edgeId, AttributeInfo attributeInfo, IDataType<?> elementType) throws AtlasException { - TypeCategory typeCategory = elementType.getTypeCategory(); - if (typeCategory != TypeCategory.STRUCT && elementType.getTypeCategory() != TypeCategory.CLASS) { - // Only class and struct references have edges. - return null; - } - + private Edge removeUnusedClassReference(String edgeId, AttributeInfo attributeInfo, IDataType<?> elementType, boolean deleteReferredVertex) throws AtlasException { // Remove edge to disconnect struct or class reference. // For struct or composite class reference, also delete the target instance. Edge removedRelation = null; TypeUtils.Pair<Edge, Vertex> edgeAndVertex = graphHelper.getEdgeAndTargetVertex(edgeId); - if (typeCategory == TypeCategory.STRUCT) { - graphHelper.removeEdge(edgeAndVertex.left); - removedRelation = edgeAndVertex.left; + if (attributeInfo.isComposite) { + // For uni-directional reference, remove the edge. + // For bi-directional reference, the edges are removed + // when the composite entity is deleted. + if (attributeInfo.reverseAttributeName == null) { + graphHelper.removeEdge(edgeAndVertex.left); + removedRelation = edgeAndVertex.left; + } - // Create an empty instance to use for clearing all struct attributes. - StructType structType = (StructType) elementType; - ITypedStruct typedInstance = structType.createInstance(); - - // Delete target vertex and any underlying structs and composite entities owned by this struct. - mapInstanceToVertex(typedInstance, edgeAndVertex.right, structType.fieldMapping().fields, false, Operation.DELETE); - } - else { - // Class reference - if (attributeInfo.isComposite) { - // For uni-directional reference, remove the edge. - // For bi-directional reference, the edges are removed - // when the composite entity is deleted. - if (attributeInfo.reverseAttributeName == null) { - graphHelper.removeEdge(edgeAndVertex.left); - removedRelation = edgeAndVertex.left; - } - // Delete the contained entity. + // Delete the contained entity. + if (deleteReferredVertex) { if (LOG.isDebugEnabled()) { Vertex sourceVertex = edgeAndVertex.left.getVertex(Direction.OUT); String sourceTypeName = GraphHelper.getTypeName(sourceVertex); - LOG.debug("Deleting composite entity {}:{} contained by {}:{} through reference {}", + LOG.debug("Deleting composite entity {}:{} contained by {}:{} through reference {}", elementType.getName(), GraphHelper.getIdFromVertex(elementType.getName(), edgeAndVertex.right)._getId(), sourceTypeName, GraphHelper.getIdFromVertex(sourceTypeName, sourceVertex)._getId(), attributeInfo.name); } deleteEntity(elementType.getName(), edgeAndVertex.right); } - else { - if (attributeInfo.reverseAttributeName != null) { - // Disconnect both ends of the bi-directional reference - removeReverseReference(edgeAndVertex, attributeInfo); - } - graphHelper.removeEdge(edgeAndVertex.left); - removedRelation = edgeAndVertex.left; + } + else { + if (attributeInfo.reverseAttributeName != null) { + // Disconnect both ends of the bi-directional reference + removeReverseReference(edgeAndVertex, attributeInfo); } + graphHelper.removeEdge(edgeAndVertex.left); + removedRelation = edgeAndVertex.left; + + return removedRelation; } return removedRelation; + + } + + private Edge removeUnusedStructReference(String edgeId, AttributeInfo attributeInfo, IDataType<?> elementType) throws AtlasException { + // Remove edge to disconnect struct or class reference. + // For struct or composite class reference, also delete the target instance. + Edge removedRelation = null; + TypeUtils.Pair<Edge, Vertex> edgeAndVertex = graphHelper.getEdgeAndTargetVertex(edgeId); + graphHelper.removeEdge(edgeAndVertex.left); + removedRelation = edgeAndVertex.left; + + // Create an empty instance to use for clearing all struct attributes. + StructType structType = (StructType) elementType; + ITypedStruct typedInstance = structType.createInstance(); + + // Delete target vertex and any underlying structs and composite entities owned by this struct. + mapInstanceToVertex(typedInstance, edgeAndVertex.right, structType.fieldMapping().fields, false, Operation.DELETE); + return removedRelation; } /** http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6b0f7d82/repository/src/test/java/org/apache/atlas/TestUtils.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/TestUtils.java b/repository/src/test/java/org/apache/atlas/TestUtils.java index 7ca4c07..a3cf929 100755 --- a/repository/src/test/java/org/apache/atlas/TestUtils.java +++ b/repository/src/test/java/org/apache/atlas/TestUtils.java @@ -199,6 +199,7 @@ public final class TestUtils { public static final String PARTITION_STRUCT_TYPE = "partition_struct_type"; public static final String PARTITION_CLASS_TYPE = "partition_class_type"; public static final String SERDE_TYPE = "serdeType"; + public static final String COLUMNS_MAP = "columnsMap"; public static TypesDef defineHiveTypes() { String _description = "_description"; @@ -290,7 +291,7 @@ public final class TestUtils { DataTypes.mapTypeName(DataTypes.STRING_TYPE.getName(), DataTypes.STRING_TYPE.getName()), Multiplicity.OPTIONAL, true, null), //map of classes - - new AttributeDefinition("columnsMap", + new AttributeDefinition(COLUMNS_MAP, DataTypes.mapTypeName(DataTypes.STRING_TYPE.getName(), COLUMN_TYPE), Multiplicity.OPTIONAL, true, null), http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/6b0f7d82/repository/src/test/java/org/apache/atlas/service/DefaultMetadataServiceTest.java ---------------------------------------------------------------------- diff --git a/repository/src/test/java/org/apache/atlas/service/DefaultMetadataServiceTest.java b/repository/src/test/java/org/apache/atlas/service/DefaultMetadataServiceTest.java index 5ac0e43..baf89fc 100644 --- a/repository/src/test/java/org/apache/atlas/service/DefaultMetadataServiceTest.java +++ b/repository/src/test/java/org/apache/atlas/service/DefaultMetadataServiceTest.java @@ -94,6 +94,9 @@ public class DefaultMetadataServiceTest { private Referenceable table; private Id tableId; + + private final String NAME = "name"; + private final String COLUMNS_ATTR_NAME = "columns"; @BeforeTest @@ -116,7 +119,7 @@ public class DefaultMetadataServiceTest { table = createTableEntity(dbId); String tableGuid = createInstance(table); String tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); table = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); tableId = new Id(tableGuid, 0, TestUtils.TABLE_TYPE); } @@ -167,7 +170,7 @@ public class DefaultMetadataServiceTest { private Referenceable createDBEntity() { Referenceable entity = new Referenceable(TestUtils.DATABASE_TYPE); String dbName = RandomStringUtils.randomAlphanumeric(10); - entity.set("name", dbName); + entity.set(NAME, dbName); entity.set("description", "us db"); return entity; } @@ -175,7 +178,7 @@ public class DefaultMetadataServiceTest { private Referenceable createTableEntity(Id dbId) { Referenceable entity = new Referenceable(TestUtils.TABLE_TYPE); String tableName = RandomStringUtils.randomAlphanumeric(10); - entity.set("name", tableName); + entity.set(NAME, tableName); entity.set("description", "random table"); entity.set("type", "type"); entity.set("tableType", "MANAGED"); @@ -186,7 +189,7 @@ public class DefaultMetadataServiceTest { private Referenceable createColumnEntity() { Referenceable entity = new Referenceable(TestUtils.COLUMN_TYPE); - entity.set("name", RandomStringUtils.randomAlphanumeric(10)); + entity.set(NAME, RandomStringUtils.randomAlphanumeric(10)); entity.set("type", "VARCHAR(32)"); return entity; } @@ -195,7 +198,7 @@ public class DefaultMetadataServiceTest { public void testCreateEntityWithUnknownDatatype() throws Exception { Referenceable entity = new Referenceable("Unknown datatype"); String dbName = RandomStringUtils.randomAlphanumeric(10); - entity.set("name", dbName); + entity.set(NAME, dbName); entity.set("description", "us db"); createInstance(entity); Assert.fail(TypeNotFoundException.class.getSimpleName() + " was expected but none thrown."); @@ -213,7 +216,7 @@ public class DefaultMetadataServiceTest { assertNull(newId); //Same entity, but different qualified name should succeed - entity.set("name", TestUtils.randomString()); + entity.set(NAME, TestUtils.randomString()); newId = createInstance(entity); Assert.assertNotEquals(newId, id); } @@ -253,7 +256,7 @@ public class DefaultMetadataServiceTest { String dbId = createInstance(db); Referenceable table = new Referenceable(TestUtils.TABLE_TYPE); - table.set("name", TestUtils.randomString()); + table.set(NAME, TestUtils.randomString()); table.set("description", "random table"); table.set("type", "type"); table.set("tableType", "MANAGED"); @@ -263,7 +266,7 @@ public class DefaultMetadataServiceTest { //table create should re-use the db instance created earlier String tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); Referenceable tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); Referenceable actualDb = (Referenceable) tableDefinition.get("databaseComposite"); Assert.assertEquals(actualDb.getId().id, dbId); @@ -275,10 +278,10 @@ public class DefaultMetadataServiceTest { Referenceable tableUpdated = new Referenceable(TestUtils.TABLE_TYPE, new HashMap<String, Object>() {{ put("columnNames", colNameList); }}); - metadataService.updateEntityByUniqueAttribute(table.getTypeName(), "name", (String) table.get("name"), tableUpdated); + metadataService.updateEntityByUniqueAttribute(table.getTypeName(), NAME, (String) table.get(NAME), tableUpdated); String tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); Referenceable tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); List<String> actualColumns = (List) tableDefinition.get("columnNames"); Assert.assertEquals(actualColumns, colNameList); @@ -290,14 +293,14 @@ public class DefaultMetadataServiceTest { final Map<String, Struct> partsMap = new HashMap<>(); partsMap.put("part0", new Struct(TestUtils.PARTITION_STRUCT_TYPE, new HashMap<String, Object>() {{ - put("name", "test"); + put(NAME, "test"); }})); table.set("partitionsMap", partsMap); updateInstance(table); String tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); Referenceable tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); Assert.assertTrue(partsMap.get("part0").equalsContents(((Map<String, Struct>)tableDefinition.get("partitionsMap")).get("part0"))); @@ -305,13 +308,13 @@ public class DefaultMetadataServiceTest { //update map - add a map key partsMap.put("part1", new Struct(TestUtils.PARTITION_STRUCT_TYPE, new HashMap<String, Object>() {{ - put("name", "test1"); + put(NAME, "test1"); }})); table.set("partitionsMap", partsMap); updateInstance(table); tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); Assert.assertEquals(((Map<String, Struct>)tableDefinition.get("partitionsMap")).size(), 2); @@ -321,31 +324,88 @@ public class DefaultMetadataServiceTest { partsMap.remove("part0"); partsMap.put("part2", new Struct(TestUtils.PARTITION_STRUCT_TYPE, new HashMap<String, Object>() {{ - put("name", "test2"); + put(NAME, "test2"); }})); table.set("partitionsMap", partsMap); updateInstance(table); tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); Assert.assertEquals(((Map<String, Struct>)tableDefinition.get("partitionsMap")).size(), 2); Assert.assertNull(((Map<String, Struct>)tableDefinition.get("partitionsMap")).get("part0")); Assert.assertTrue(partsMap.get("part2").equalsContents(((Map<String, Struct>)tableDefinition.get("partitionsMap")).get("part2"))); - //update struct value for existing map key Struct partition2 = (Struct)partsMap.get("part2"); - partition2.set("name", "test2Updated"); + partition2.set(NAME, "test2Updated"); updateInstance(table); tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); Assert.assertEquals(((Map<String, Struct>)tableDefinition.get("partitionsMap")).size(), 2); Assert.assertNull(((Map<String, Struct>)tableDefinition.get("partitionsMap")).get("part0")); Assert.assertTrue(partsMap.get("part2").equalsContents(((Map<String, Struct>)tableDefinition.get("partitionsMap")).get("part2"))); + + //Test map pointing to a class + final Map<String, Struct> columnsMap = new HashMap<>(); + Referenceable col0Type = new Referenceable(TestUtils.COLUMN_TYPE, + new HashMap<String, Object>() {{ + put(NAME, "test1"); + put("type", "string"); + }}); + + columnsMap.put("col0", col0Type); + + Referenceable col1Type = new Referenceable(TestUtils.COLUMN_TYPE, + new HashMap<String, Object>() {{ + put(NAME, "test2"); + put("type", "string"); + }}); + + columnsMap.put("col1", col1Type); + table.set(TestUtils.COLUMNS_MAP, columnsMap); + updateInstance(table); + verifyMapUpdates(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME), columnsMap, TestUtils.COLUMNS_MAP); + + //Swap elements + columnsMap.clear(); + columnsMap.put("col0", col1Type); + columnsMap.put("col1", col0Type); + + table.set(TestUtils.COLUMNS_MAP, columnsMap); + updateInstance(table); + verifyMapUpdates(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME), columnsMap, TestUtils.COLUMNS_MAP); + + //Drop the first key and change the class type as well to col0 + columnsMap.clear(); + columnsMap.put("col0", col0Type); + + table.set(TestUtils.COLUMNS_MAP, columnsMap); + updateInstance(table); + verifyMapUpdates(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME), columnsMap, TestUtils.COLUMNS_MAP); + + //Clear state + table.setNull(TestUtils.COLUMNS_MAP); + updateInstance(table); + verifyMapUpdates(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME), null, TestUtils.COLUMNS_MAP); + } + + private void verifyMapUpdates(String typeName, String uniqAttrName, String uniqAttrValue, Map<String, Struct> expectedMap, String mapAttrName) throws AtlasException { + String json = + metadataService.getEntityDefinition(typeName, uniqAttrName, uniqAttrValue); + Referenceable tableDefinition = InstanceSerialization.fromJsonReferenceable(json, true); + + if(expectedMap == null) { + Assert.assertNull(tableDefinition.get(TestUtils.COLUMNS_MAP)); + } else { + Assert.assertEquals(((Map<String, Referenceable>)tableDefinition.get(mapAttrName)).size(), expectedMap.size()); + for (String key : expectedMap.keySet()) { + Assert.assertTrue(((Map<String, Referenceable>) tableDefinition.get(mapAttrName)).get(key).equalsContents(expectedMap.get(key))); + } + } } @Test @@ -359,7 +419,7 @@ public class DefaultMetadataServiceTest { metadataService.updateEntityPartialByGuid(tableId._getId(), tableUpdated); String tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); Referenceable tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); List<String> actualColumns = (List) tableDefinition.get("columnNames"); Assert.assertEquals(actualColumns, colNameList); @@ -372,7 +432,7 @@ public class DefaultMetadataServiceTest { metadataService.updateEntityPartialByGuid(tableId.getId()._getId(), tableUpdated); tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); actualColumns = (List) tableDefinition.get("columnNames"); Assert.assertEquals(actualColumns, updatedColNameList); @@ -380,29 +440,26 @@ public class DefaultMetadataServiceTest { @Test public void testUpdateEntityArrayOfClass() throws Exception { + //test array of class with id final List<Referenceable> columns = new ArrayList<>(); Map<String, Object> values = new HashMap<>(); - values.put("name", "col1"); + values.put(NAME, "col1"); values.put("type", "type"); - Referenceable col1 = new Referenceable("column_type", values); + Referenceable col1 = new Referenceable(TestUtils.COLUMN_TYPE, values); columns.add(col1); Referenceable tableUpdated = new Referenceable(TestUtils.TABLE_TYPE, new HashMap<String, Object>() {{ - put("columns", columns); + put(COLUMNS_ATTR_NAME, columns); }}); metadataService.updateEntityPartialByGuid(tableId._getId(), tableUpdated); - String tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); - Referenceable tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); - final List<Referenceable> arrClsColumns = (List) tableDefinition.get("columns"); - assertReferenceables(arrClsColumns.get(0), columns.get(0)); + verifyArrayUpdates(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME), columns, COLUMNS_ATTR_NAME); //Partial update. Add col5 But also update col1 Map<String, Object> valuesCol5 = new HashMap<>(); - valuesCol5.put("name", "col5"); + valuesCol5.put(NAME, "col5"); valuesCol5.put("type", "type"); - Referenceable col2 = new Referenceable("column_type", valuesCol5); + Referenceable col2 = new Referenceable(TestUtils.COLUMN_TYPE, valuesCol5); //update col1 col1.set("type", "type1"); @@ -410,70 +467,84 @@ public class DefaultMetadataServiceTest { final List<Referenceable> updateColumns = Arrays.asList(col1, col2); tableUpdated = new Referenceable(TestUtils.TABLE_TYPE, new HashMap<String, Object>() {{ - put("columns", updateColumns); + put(COLUMNS_ATTR_NAME, updateColumns); }}); metadataService.updateEntityPartialByGuid(tableId._getId(), tableUpdated); - tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); - tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); - List<Referenceable> arrColumnsList = (List) tableDefinition.get("columns"); - Assert.assertEquals(arrColumnsList.size(), 2); - assertReferenceables(arrColumnsList.get(0), updateColumns.get(0)); - assertReferenceables(arrColumnsList.get(1), updateColumns.get(1)); + verifyArrayUpdates(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME), updateColumns, COLUMNS_ATTR_NAME); //Complete update. Add array elements - col3,4 Map<String, Object> values1 = new HashMap<>(); - values1.put("name", "col3"); + values1.put(NAME, "col3"); values1.put("type", "type"); - Referenceable ref1 = new Referenceable("column_type", values1); + Referenceable ref1 = new Referenceable(TestUtils.COLUMN_TYPE, values1); columns.add(ref1); Map<String, Object> values2 = new HashMap<>(); - values2.put("name", "col4"); + values2.put(NAME, "col4"); values2.put("type", "type"); - Referenceable ref2 = new Referenceable("column_type", values2); + Referenceable ref2 = new Referenceable(TestUtils.COLUMN_TYPE, values2); columns.add(ref2); - table.set("columns", columns); + table.set(COLUMNS_ATTR_NAME, columns); updateInstance(table); - tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); - tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); - arrColumnsList = (List) tableDefinition.get("columns"); - Assert.assertEquals(arrColumnsList.size(), columns.size()); - assertReferenceables(arrColumnsList.get(1), columns.get(1)); - assertReferenceables(arrColumnsList.get(2), columns.get(2)); - + verifyArrayUpdates(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME), columns, COLUMNS_ATTR_NAME); + + //Swap elements + columns.clear(); + columns.add(ref2); + columns.add(ref1); + + table.set(COLUMNS_ATTR_NAME, columns); + updateInstance(table); + + verifyArrayUpdates(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME), columns, COLUMNS_ATTR_NAME); + + //drop a single column + columns.clear(); + columns.add(ref1); + + table.set(COLUMNS_ATTR_NAME, columns); + updateInstance(table); + + verifyArrayUpdates(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME), columns, COLUMNS_ATTR_NAME); + //Remove a class reference/Id and insert another reference //Also covers isComposite case since columns is a composite values.clear(); columns.clear(); - values.put("name", "col2"); + values.put(NAME, "col2"); values.put("type", "type"); - col1 = new Referenceable("column_type", values); + col1 = new Referenceable(TestUtils.COLUMN_TYPE, values); columns.add(col1); - table.set("columns", columns); + table.set(COLUMNS_ATTR_NAME, columns); updateInstance(table); - tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); - tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); - arrColumnsList = (List) tableDefinition.get("columns"); - Assert.assertEquals(arrColumnsList.size(), columns.size()); - assertReferenceables(arrColumnsList.get(0), columns.get(0)); + verifyArrayUpdates(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME), columns, COLUMNS_ATTR_NAME); //Update array column to null - table.setNull("columns"); + table.setNull(COLUMNS_ATTR_NAME); String newtableId = updateInstance(table); Assert.assertEquals(newtableId, tableId._getId()); - tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); - tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); - Assert.assertNull(tableDefinition.get("columns")); + verifyArrayUpdates(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME), null, COLUMNS_ATTR_NAME); + } + + private void verifyArrayUpdates(String typeName, String uniqAttrName, String uniqAttrValue, List<? extends Struct> expectedArray, String arrAttrName) throws AtlasException { + String json = + metadataService.getEntityDefinition(typeName, uniqAttrName, uniqAttrValue); + Referenceable entityDefinition = InstanceSerialization.fromJsonReferenceable(json, true); + + if (expectedArray == null) { + Assert.assertNull(entityDefinition.get(arrAttrName)); + } else { + Assert.assertEquals(((List<Referenceable>)entityDefinition.get(arrAttrName)).size(), expectedArray.size()); + for (int index = 0; index < expectedArray.size(); index++) { + Assert.assertTrue(((List<Referenceable>) entityDefinition.get(arrAttrName)).get(index).equalsContents(expectedArray.get(index))); + } + } } private void assertReferenceables(Referenceable r1, Referenceable r2) { @@ -488,7 +559,7 @@ public class DefaultMetadataServiceTest { @Test public void testStructs() throws Exception { Struct serdeInstance = new Struct(TestUtils.SERDE_TYPE); - serdeInstance.set("name", "serde1Name"); + serdeInstance.set(NAME, "serde1Name"); serdeInstance.set("serde", "test"); serdeInstance.set("description", "testDesc"); table.set("serde1", serdeInstance); @@ -497,7 +568,7 @@ public class DefaultMetadataServiceTest { Assert.assertEquals(newtableId, tableId._getId()); String tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); Referenceable tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); Assert.assertNotNull(tableDefinition.get("serde1")); Assert.assertTrue(serdeInstance.equalsContents(tableDefinition.get("serde1"))); @@ -506,7 +577,7 @@ public class DefaultMetadataServiceTest { serdeInstance.set("serde", "testUpdated"); updateInstance(table); tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); Assert.assertTrue(serdeInstance.equalsContents(tableDefinition.get("serde1"))); @@ -523,7 +594,6 @@ public class DefaultMetadataServiceTest { @Test public void testCreateEntityWithReferenceableHavingIdNoValue() throws Exception { - //ATLAS-383 Test Referenceable sdReferenceable = new Referenceable(TestUtils.STORAGE_DESC_TYPE); sdReferenceable.set(AtlasClient.REFERENCEABLE_ATTRIBUTE_NAME, TestUtils.randomString()); @@ -547,7 +617,7 @@ public class DefaultMetadataServiceTest { public void testClassUpdate() throws Exception { //Create new db instance final Referenceable databaseInstance = new Referenceable(TestUtils.DATABASE_TYPE); - databaseInstance.set("name", TestUtils.randomString()); + databaseInstance.set(NAME, TestUtils.randomString()); databaseInstance.set("description", "new database"); String dbId = createInstance(databaseInstance); @@ -564,7 +634,7 @@ public class DefaultMetadataServiceTest { /* Update with referenceable - TODO - Fails . Need to fix this */ /*final String dbName = TestUtils.randomString(); final Referenceable databaseInstance2 = new Referenceable(TestUtils.DATABASE_TYPE); - databaseInstance2.set("name", dbName); + databaseInstance2.set(NAME, dbName); databaseInstance2.set("description", "new database 2"); Referenceable updateTable = new Referenceable(TestUtils.TABLE_TYPE, new HashMap<String, Object>() {{ @@ -576,7 +646,7 @@ public class DefaultMetadataServiceTest { metadataService.getEntityDefinition(tableId._getId()); Referenceable tableDefinitionActual = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); - String dbDefJson = metadataService.getEntityDefinition(TestUtils.DATABASE_TYPE, "name", dbName); + String dbDefJson = metadataService.getEntityDefinition(TestUtils.DATABASE_TYPE, NAME, dbName); Referenceable dbDef = InstanceSerialization.fromJsonReferenceable(dbDefJson, true); Assert.assertNotEquals(dbId, (((Id) tableDefinitionActual.get("database"))._getId())); @@ -590,10 +660,10 @@ public class DefaultMetadataServiceTest { TestUtils.dumpGraph(graphProvider.get()); final Struct partition1 = new Struct(TestUtils.PARTITION_STRUCT_TYPE); - partition1.set("name", "part1"); + partition1.set(NAME, "part1"); final Struct partition2 = new Struct(TestUtils.PARTITION_STRUCT_TYPE); - partition2.set("name", "part2"); + partition2.set(NAME, "part2"); List<Struct> partitions = new ArrayList<Struct>(){{ add(partition1); add(partition2); }}; table.set("partitions", partitions); @@ -602,7 +672,7 @@ public class DefaultMetadataServiceTest { Assert.assertEquals(newtableId, tableId._getId()); String tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); Referenceable tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); Assert.assertNotNull(tableDefinition.get("partitions")); @@ -612,14 +682,14 @@ public class DefaultMetadataServiceTest { //add a new element to array of struct final Struct partition3 = new Struct(TestUtils.PARTITION_STRUCT_TYPE); - partition3.set("name", "part3"); + partition3.set(NAME, "part3"); partitions.add(partition3); table.set("partitions", partitions); newtableId = updateInstance(table); Assert.assertEquals(newtableId, tableId._getId()); tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); Assert.assertNotNull(tableDefinition.get("partitions")); @@ -634,7 +704,7 @@ public class DefaultMetadataServiceTest { Assert.assertEquals(newtableId, tableId._getId()); tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); Assert.assertNotNull(tableDefinition.get("partitions")); @@ -644,12 +714,12 @@ public class DefaultMetadataServiceTest { Assert.assertTrue(partitions.get(1).equalsContents(partitionsActual.get(1))); //Update struct value within array of struct - partition1.set("name", "part4"); + partition1.set(NAME, "part4"); newtableId = updateInstance(table); Assert.assertEquals(newtableId, tableId._getId()); tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); Assert.assertNotNull(tableDefinition.get("partitions")); @@ -659,21 +729,21 @@ public class DefaultMetadataServiceTest { //add a repeated element to array of struct final Struct partition4 = new Struct(TestUtils.PARTITION_STRUCT_TYPE); - partition4.set("name", "part4"); + partition4.set(NAME, "part4"); partitions.add(partition4); table.set("partitions", partitions); newtableId = updateInstance(table); Assert.assertEquals(newtableId, tableId._getId()); tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); Assert.assertNotNull(tableDefinition.get("partitions")); partitionsActual = (List<Struct>) tableDefinition.get("partitions"); Assert.assertEquals(partitionsActual.size(), 3); - Assert.assertEquals(partitionsActual.get(2).get("name"), "part4"); - Assert.assertEquals(partitionsActual.get(0).get("name"), "part4"); + Assert.assertEquals(partitionsActual.get(2).get(NAME), "part4"); + Assert.assertEquals(partitionsActual.get(0).get(NAME), "part4"); Assert.assertTrue(partitions.get(2).equalsContents(partitionsActual.get(2))); @@ -683,7 +753,7 @@ public class DefaultMetadataServiceTest { Assert.assertEquals(newtableId, tableId._getId()); tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); Assert.assertNull(tableDefinition.get("partitions")); @@ -694,7 +764,7 @@ public class DefaultMetadataServiceTest { public void testUpdateRequiredAttrToNull() throws Exception { //Update required attribute String tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); Referenceable tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); Assert.assertEquals(tableDefinition.get("description"), "random table"); @@ -708,7 +778,7 @@ public class DefaultMetadataServiceTest { public void testUpdateOptionalAttrToNull() throws Exception { String tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); Referenceable tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); //Update optional Attribute @@ -720,7 +790,7 @@ public class DefaultMetadataServiceTest { Assert.assertEquals(newtableId, tableId._getId()); tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); Assert.assertNull(tableDefinition.get("created")); } @@ -728,7 +798,7 @@ public class DefaultMetadataServiceTest { @Test public void testCreateEntityWithEnum() throws Exception { String tableDefinitionJson = - metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, "name", (String) table.get("name")); + metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, NAME, (String) table.get(NAME)); Referenceable tableDefinition = InstanceSerialization.fromJsonReferenceable(tableDefinitionJson, true); EnumValue tableType = (EnumValue) tableDefinition.get("tableType"); @@ -741,15 +811,15 @@ public class DefaultMetadataServiceTest { createInstance(entity); //get entity by valid qualified name - String entityJson = metadataService.getEntityDefinition(TestUtils.DATABASE_TYPE, "name", - (String) entity.get("name")); + String entityJson = metadataService.getEntityDefinition(TestUtils.DATABASE_TYPE, NAME, + (String) entity.get(NAME)); Assert.assertNotNull(entityJson); Referenceable referenceable = InstanceSerialization.fromJsonReferenceable(entityJson, true); - Assert.assertEquals(referenceable.get("name"), entity.get("name")); + Assert.assertEquals(referenceable.get(NAME), entity.get(NAME)); //get entity by invalid qualified name try { - metadataService.getEntityDefinition(TestUtils.DATABASE_TYPE, "name", "random"); + metadataService.getEntityDefinition(TestUtils.DATABASE_TYPE, NAME, "random"); Assert.fail("Expected EntityNotFoundException"); } catch (EntityNotFoundException e) { //expected @@ -776,25 +846,25 @@ public class DefaultMetadataServiceTest { Referenceable col1 = createColumnEntity(); Referenceable col2 = createColumnEntity(); Referenceable col3 = createColumnEntity(); - table1Entity.set("columns", ImmutableList.of(col1, col2, col3)); - table2Entity.set("columns", ImmutableList.of(col1, col2, col3)); + table1Entity.set(COLUMNS_ATTR_NAME, ImmutableList.of(col1, col2, col3)); + table2Entity.set(COLUMNS_ATTR_NAME, ImmutableList.of(col1, col2, col3)); createInstance(table1Entity); createInstance(table2Entity); // Retrieve the table entities from the repository, // to get their guids and the composite column guids. String entityJson = metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, - "name", (String)table1Entity.get("name")); + NAME, (String)table1Entity.get(NAME)); Assert.assertNotNull(entityJson); table1Entity = InstanceSerialization.fromJsonReferenceable(entityJson, true); - Object val = table1Entity.get("columns"); + Object val = table1Entity.get(COLUMNS_ATTR_NAME); Assert.assertTrue(val instanceof List); List<IReferenceableInstance> table1Columns = (List<IReferenceableInstance>) val; entityJson = metadataService.getEntityDefinition(TestUtils.TABLE_TYPE, - "name", (String)table2Entity.get("name")); + NAME, (String)table2Entity.get(NAME)); Assert.assertNotNull(entityJson); table2Entity = InstanceSerialization.fromJsonReferenceable(entityJson, true); - val = table2Entity.get("columns"); + val = table2Entity.get(COLUMNS_ATTR_NAME); Assert.assertTrue(val instanceof List); List<IReferenceableInstance> table2Columns = (List<IReferenceableInstance>) val;
