expose attribute to type association in HierarchyTypes
Project: http://git-wip-us.apache.org/repos/asf/incubator-atlas/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-atlas/commit/5fda7b70 Tree: http://git-wip-us.apache.org/repos/asf/incubator-atlas/tree/5fda7b70 Diff: http://git-wip-us.apache.org/repos/asf/incubator-atlas/diff/5fda7b70 Branch: refs/remotes/origin/master Commit: 5fda7b705872b86190916ad158fbb8c27ff4b4ce Parents: e79fed4 Author: Harish Butani <[email protected]> Authored: Fri May 1 08:47:53 2015 -0700 Committer: Harish Butani <[email protected]> Committed: Fri May 1 08:48:05 2015 -0700 ---------------------------------------------------------------------- .../typesystem/types/HierarchicalType.java | 33 ++++++++++++++++++-- .../metadata/typesystem/types/TypeUtils.java | 10 ++++++ .../metadata/typesystem/types/TraitTest.java | 22 +++++++++++++ 3 files changed, 62 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/5fda7b70/typesystem/src/main/java/org/apache/hadoop/metadata/typesystem/types/HierarchicalType.java ---------------------------------------------------------------------- diff --git a/typesystem/src/main/java/org/apache/hadoop/metadata/typesystem/types/HierarchicalType.java b/typesystem/src/main/java/org/apache/hadoop/metadata/typesystem/types/HierarchicalType.java index 9fba084..6f9e61e 100755 --- a/typesystem/src/main/java/org/apache/hadoop/metadata/typesystem/types/HierarchicalType.java +++ b/typesystem/src/main/java/org/apache/hadoop/metadata/typesystem/types/HierarchicalType.java @@ -35,6 +35,8 @@ import java.util.Map; import java.util.Queue; import java.util.Set; +import org.apache.hadoop.metadata.typesystem.types.TypeUtils.Pair; + /** * Represents a Type that can have SuperTypes. An Instance of the HierarchicalType can be * downcast to a SuperType. @@ -53,6 +55,7 @@ public abstract class HierarchicalType<ST extends HierarchicalType, T> extends A public final int numFields; public final ImmutableList<String> superTypes; public final ImmutableList<AttributeInfo> immediateAttrs; + public final ImmutableMap<String, String> attributeNameToType; protected ImmutableMap<String, List<Path>> superTypePaths; protected ImmutableMap<String, Path> pathNameToPathMap; @@ -68,6 +71,7 @@ public abstract class HierarchicalType<ST extends HierarchicalType, T> extends A this.numFields = numFields; this.superTypes = superTypes; this.immediateAttrs = null; + this.attributeNameToType = null; } HierarchicalType(TypeSystem typeSystem, Class<ST> superTypeClass, @@ -76,8 +80,10 @@ public abstract class HierarchicalType<ST extends HierarchicalType, T> extends A this.typeSystem = typeSystem; this.superTypeClass = superTypeClass; this.name = name; - this.fieldMapping = constructFieldMapping(superTypes, + Pair<FieldMapping, ImmutableMap<String, String>> p = constructFieldMapping(superTypes, fields); + this.fieldMapping = p.left; + this.attributeNameToType = p.right; this.numFields = this.fieldMapping.fields.size(); this.superTypes = superTypes == null ? ImmutableList.<String>of() : superTypes; this.immediateAttrs = ImmutableList.<AttributeInfo>copyOf(fields); @@ -143,13 +149,15 @@ public abstract class HierarchicalType<ST extends HierarchicalType, T> extends A } - protected FieldMapping constructFieldMapping(ImmutableList<String> superTypes, + protected Pair<FieldMapping, ImmutableMap<String, String>> constructFieldMapping(ImmutableList<String> superTypes, AttributeInfo... fields) throws MetadataException { Map<String, AttributeInfo> fieldsMap = new LinkedHashMap<String, AttributeInfo>(); Map<String, Integer> fieldPos = new HashMap<String, Integer>(); Map<String, Integer> fieldNullPos = new HashMap<String, Integer>(); + Map<String, String> attributeNameToType = new HashMap<>(); + int numBools = 0; int numBytes = 0; int numShorts = 0; @@ -196,6 +204,7 @@ public abstract class HierarchicalType<ST extends HierarchicalType, T> extends A if (fieldsMap.containsKey(attrName)) { attrName = currentPath.addOverrideAttr(attrName); } + attributeNameToType.put(attrName, superType.getName()); fieldsMap.put(attrName, i); fieldNullPos.put(attrName, fieldNullPos.size()); @@ -257,7 +266,7 @@ public abstract class HierarchicalType<ST extends HierarchicalType, T> extends A this.superTypePaths = ImmutableMap.copyOf(superTypePaths); this.pathNameToPathMap = ImmutableMap.copyOf(pathNameToPathMap); - return new FieldMapping(fieldsMap, + FieldMapping fm = new FieldMapping(fieldsMap, fieldPos, fieldNullPos, numBools, @@ -275,6 +284,8 @@ public abstract class HierarchicalType<ST extends HierarchicalType, T> extends A numMaps, numStructs, numReferenceables); + + return new Pair(fm, ImmutableMap.copyOf(attributeNameToType)); } public IStruct castAs(IStruct s, String superTypeName) throws MetadataException { @@ -311,6 +322,22 @@ public abstract class HierarchicalType<ST extends HierarchicalType, T> extends A return null; } + public ST getDefinedType(String attrName) throws MetadataException { + if (!attributeNameToType.containsKey(attrName)) { + throw new MetadataException(String.format("Unknown attribute %s in type %s", attrName, getName())); + } + return typeSystem.getDataType(superTypeClass, attributeNameToType.get(attrName)); + } + + public String getDefinedTypeName(String attrName) throws MetadataException { + return getDefinedType(attrName).getName(); + } + + public String getQualifiedName(String attrName) throws MetadataException { + String attrTypeName = getDefinedTypeName(attrName); + return attrName.contains(".") ? attrName : String.format("%s.%s", attrTypeName, attrName); + } + protected Map<String, String> constructDowncastFieldMap(ST subType, Path pathToSubType) { String pathToSubTypeName = pathToSubType.pathAfterThis; http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/5fda7b70/typesystem/src/main/java/org/apache/hadoop/metadata/typesystem/types/TypeUtils.java ---------------------------------------------------------------------- diff --git a/typesystem/src/main/java/org/apache/hadoop/metadata/typesystem/types/TypeUtils.java b/typesystem/src/main/java/org/apache/hadoop/metadata/typesystem/types/TypeUtils.java index 658868c..3ff0be5 100755 --- a/typesystem/src/main/java/org/apache/hadoop/metadata/typesystem/types/TypeUtils.java +++ b/typesystem/src/main/java/org/apache/hadoop/metadata/typesystem/types/TypeUtils.java @@ -86,4 +86,14 @@ public class TypeUtils { return new TypesDef(JavaConversions.asScalaBuffer(enums), JavaConversions.asScalaBuffer(structs), JavaConversions.asScalaBuffer(traits), JavaConversions.asScalaBuffer(classes)); } + + protected static class Pair<L,R> { + protected L left; + protected R right; + + public Pair(L left, R right) { + this.left = left; + this.right = right; + } + } } http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/5fda7b70/typesystem/src/test/java/org/apache/hadoop/metadata/typesystem/types/TraitTest.java ---------------------------------------------------------------------- diff --git a/typesystem/src/test/java/org/apache/hadoop/metadata/typesystem/types/TraitTest.java b/typesystem/src/test/java/org/apache/hadoop/metadata/typesystem/types/TraitTest.java index 1a6277f..e08ed05 100755 --- a/typesystem/src/test/java/org/apache/hadoop/metadata/typesystem/types/TraitTest.java +++ b/typesystem/src/test/java/org/apache/hadoop/metadata/typesystem/types/TraitTest.java @@ -27,6 +27,9 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import java.util.HashMap; +import java.util.Map; + import static org.apache.hadoop.metadata.typesystem.types.utils.TypesUtil.createOptionalAttrDef; import static org.apache.hadoop.metadata.typesystem.types.utils.TypesUtil.createRequiredAttrDef; import static org.apache.hadoop.metadata.typesystem.types.utils.TypesUtil.createTraitTypeDef; @@ -76,6 +79,25 @@ public class TraitTest extends BaseTest { TraitType DType = (TraitType) getTypeSystem().getDataType(TraitType.class, "D"); +// for(String aName : DType.fieldMapping().fields.keySet()) { +// System.out.println(String.format("nameToQualifiedName.put(\"%s\", \"%s\");", aName, DType.getQualifiedName(aName))); +// } + + Map<String,String> nameToQualifiedName = new HashMap(); + { + nameToQualifiedName.put("d", "D.d"); + nameToQualifiedName.put("b", "B.b"); + nameToQualifiedName.put("c", "C.c"); + nameToQualifiedName.put("a", "A.a"); + nameToQualifiedName.put("A.B.D.b", "A.B.D.b"); + nameToQualifiedName.put("A.B.D.c", "A.B.D.c"); + nameToQualifiedName.put("A.B.D.d", "A.B.D.d"); + nameToQualifiedName.put("A.C.D.a", "A.C.D.a"); + nameToQualifiedName.put("A.C.D.b", "A.C.D.b"); + nameToQualifiedName.put("A.C.D.c", "A.C.D.c"); + nameToQualifiedName.put("A.C.D.d", "A.C.D.d"); + } + Struct s1 = new Struct("D"); s1.set("d", 1); s1.set("c", 1);
