Repository: incubator-atlas Updated Branches: refs/heads/master 5d8c80a75 -> 20aa6cf25
ATLAS-1335: multi-value attribute handling in AtlasStructType to be consistent with TypeSystem for backward compatibility Project: http://git-wip-us.apache.org/repos/asf/incubator-atlas/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-atlas/commit/20aa6cf2 Tree: http://git-wip-us.apache.org/repos/asf/incubator-atlas/tree/20aa6cf2 Diff: http://git-wip-us.apache.org/repos/asf/incubator-atlas/diff/20aa6cf2 Branch: refs/heads/master Commit: 20aa6cf2536b4ca7c8fbf3fde285bb545898659c Parents: 5d8c80a Author: Madhan Neethiraj <[email protected]> Authored: Fri Nov 25 20:15:13 2016 -0800 Committer: Madhan Neethiraj <[email protected]> Committed: Mon Nov 28 10:00:27 2016 -0800 ---------------------------------------------------------------------- .../java/org/apache/atlas/AtlasErrorCode.java | 1 + .../atlas/model/typedef/AtlasStructDef.java | 2 +- .../org/apache/atlas/type/AtlasArrayType.java | 8 +++-- .../org/apache/atlas/type/AtlasStructType.java | 12 +++++-- .../apache/atlas/type/TestAtlasStructType.java | 35 +++++++++++++++++--- 5 files changed, 47 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/20aa6cf2/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java ---------------------------------------------------------------------- diff --git a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java index 65726c3..84d8173 100644 --- a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java +++ b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java @@ -56,6 +56,7 @@ public enum AtlasErrorCode { TYPE_HAS_REFERENCES(409, "ATLAS4092E", "Given type {0} has references"), TYPE_MATCH_FAILED(409, "ATLAS4093E", "Given type {0} doesn't match {1}"), INVALID_TYPE_DEFINITION(409, "ATLAS4094E", "Invalid type definition {0}"), + INVALID_ATTRIBUTE_TYPE_FOR_CARDINALITY(409, "ATLAS4095E", "Cardinality of attribute {0}.{1} requires a list or set type"), INTERNAL_ERROR(500, "ATLAS5001E", "Internal server error {0}"), INDEX_CREATION_FAILED(500, "ATLAS5002E", "Index creation failed for {0}"), http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/20aa6cf2/intg/src/main/java/org/apache/atlas/model/typedef/AtlasStructDef.java ---------------------------------------------------------------------- diff --git a/intg/src/main/java/org/apache/atlas/model/typedef/AtlasStructDef.java b/intg/src/main/java/org/apache/atlas/model/typedef/AtlasStructDef.java index ef12896..16e0344 100644 --- a/intg/src/main/java/org/apache/atlas/model/typedef/AtlasStructDef.java +++ b/intg/src/main/java/org/apache/atlas/model/typedef/AtlasStructDef.java @@ -280,7 +280,7 @@ public class AtlasStructDef extends AtlasBaseTypeDef implements Serializable { public AtlasAttributeDef() { this(null, null); } public AtlasAttributeDef(String name, String typeName) { - this(name, typeName, false, Cardinality.SINGLE, 1, 1, false, false, null); + this(name, typeName, false, Cardinality.SINGLE, COUNT_NOT_SET, COUNT_NOT_SET, false, false, null); } public AtlasAttributeDef(String name, String typeName, boolean isOptional, Cardinality cardinality, http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/20aa6cf2/intg/src/main/java/org/apache/atlas/type/AtlasArrayType.java ---------------------------------------------------------------------- diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasArrayType.java b/intg/src/main/java/org/apache/atlas/type/AtlasArrayType.java index 156ed43..48d0a27 100644 --- a/intg/src/main/java/org/apache/atlas/type/AtlasArrayType.java +++ b/intg/src/main/java/org/apache/atlas/type/AtlasArrayType.java @@ -39,8 +39,8 @@ public class AtlasArrayType extends AtlasType { private static final Logger LOG = LoggerFactory.getLogger(AtlasArrayType.class); private final String elementTypeName; - private final int minCount; - private final int maxCount; + private int minCount; + private int maxCount; private AtlasType elementType; @@ -89,10 +89,14 @@ public class AtlasArrayType extends AtlasType { return elementTypeName; } + public void setMinCount(int minCount) { this.minCount = minCount; } + public int getMinCount() { return minCount; } + public void setMaxCount(int maxCount) { this.maxCount = maxCount; } + public int getMaxCount() { return maxCount; } http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/20aa6cf2/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java ---------------------------------------------------------------------- diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java b/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java index 534f2a9..ef5f736 100644 --- a/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java +++ b/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java @@ -111,9 +111,15 @@ public class AtlasStructType extends AtlasType { Cardinality cardinality = attributeDef.getCardinality(); if (cardinality == Cardinality.LIST || cardinality == Cardinality.SET) { - attrType = new AtlasArrayType(attrType, - attributeDef.getValuesMinCount(), - attributeDef.getValuesMaxCount()); + if (!(attrType instanceof AtlasArrayType)) { + throw new AtlasBaseException(AtlasErrorCode.INVALID_ATTRIBUTE_TYPE_FOR_CARDINALITY, + getTypeName(), attributeDef.getName()); + } + + AtlasArrayType arrayType = (AtlasArrayType)attrType; + + arrayType.setMinCount(attributeDef.getValuesMinCount()); + arrayType.setMaxCount(attributeDef.getValuesMaxCount()); } a.put(attributeDef.getName(), attrType); http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/20aa6cf2/intg/src/test/java/org/apache/atlas/type/TestAtlasStructType.java ---------------------------------------------------------------------- diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasStructType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasStructType.java index 1a15232..ee05ba3 100644 --- a/intg/src/test/java/org/apache/atlas/type/TestAtlasStructType.java +++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasStructType.java @@ -22,6 +22,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; +import org.apache.atlas.AtlasErrorCode; import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.model.ModelTestUtil; import org.apache.atlas.model.instance.AtlasStruct; @@ -29,6 +30,7 @@ import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_INT; import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_DATE; import static org.apache.atlas.model.typedef.AtlasBaseTypeDef.ATLAS_TYPE_BIGINTEGER; +import org.apache.atlas.model.typedef.AtlasBaseTypeDef; import org.apache.atlas.model.typedef.AtlasStructDef; import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef; import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef.Cardinality; @@ -49,18 +51,24 @@ public class TestAtlasStructType { private final List<Object> invalidValues; { - AtlasAttributeDef multiValuedAttribMinMax = new AtlasAttributeDef(MULTI_VAL_ATTR_NAME_MIN_MAX, ATLAS_TYPE_INT); - AtlasAttributeDef multiValuedAttribMin = new AtlasAttributeDef(MULTI_VAL_ATTR_NAME_MIN, ATLAS_TYPE_INT); - AtlasAttributeDef multiValuedAttribMax = new AtlasAttributeDef(MULTI_VAL_ATTR_NAME_MAX, ATLAS_TYPE_INT); + AtlasAttributeDef multiValuedAttribMinMax = new AtlasAttributeDef(); + AtlasAttributeDef multiValuedAttribMin = new AtlasAttributeDef(); + AtlasAttributeDef multiValuedAttribMax = new AtlasAttributeDef(); + multiValuedAttribMinMax.setName(MULTI_VAL_ATTR_NAME_MIN_MAX); + multiValuedAttribMinMax.setTypeName(AtlasBaseTypeDef.getArrayTypeName(ATLAS_TYPE_INT)); multiValuedAttribMinMax.setCardinality(Cardinality.LIST); multiValuedAttribMinMax.setValuesMinCount(MULTI_VAL_ATTR_MIN_COUNT); multiValuedAttribMinMax.setValuesMaxCount(MULTI_VAL_ATTR_MAX_COUNT); - multiValuedAttribMinMax.setCardinality(Cardinality.SET); + multiValuedAttribMin.setName(MULTI_VAL_ATTR_NAME_MIN); + multiValuedAttribMin.setTypeName(AtlasBaseTypeDef.getArrayTypeName(ATLAS_TYPE_INT)); + multiValuedAttribMin.setCardinality(Cardinality.SET); multiValuedAttribMin.setValuesMinCount(MULTI_VAL_ATTR_MIN_COUNT); - multiValuedAttribMinMax.setCardinality(Cardinality.LIST); + multiValuedAttribMax.setName(MULTI_VAL_ATTR_NAME_MAX); + multiValuedAttribMax.setTypeName(AtlasBaseTypeDef.getArrayTypeName(ATLAS_TYPE_INT)); + multiValuedAttribMax.setCardinality(Cardinality.LIST); multiValuedAttribMax.setValuesMaxCount(MULTI_VAL_ATTR_MAX_COUNT); AtlasStructDef structDef = ModelTestUtil.newStructDef(); @@ -173,6 +181,23 @@ public class TestAtlasStructType { } } + @Test + public void testInvalidStructDef_MultiValuedAttributeNotArray() { + AtlasAttributeDef invalidMultiValuedAttrib = new AtlasAttributeDef("invalidAttributeDef", ATLAS_TYPE_INT); + invalidMultiValuedAttrib.setCardinality(Cardinality.LIST); + + AtlasStructDef invalidStructDef = ModelTestUtil.newStructDef(); + invalidStructDef.addAttribute(invalidMultiValuedAttrib); + + try { + AtlasStructType invalidStructType = new AtlasStructType(invalidStructDef, ModelTestUtil.getTypesRegistry()); + + fail("invalidStructDef not detected: structDef=" + invalidStructDef + "; structType=" + invalidStructType); + } catch (AtlasBaseException excp) { + assertTrue(excp.getAtlasErrorCode() == AtlasErrorCode.INVALID_ATTRIBUTE_TYPE_FOR_CARDINALITY); + } + } + private static AtlasStructType getStructType(AtlasStructDef structDef) { try { return new AtlasStructType(structDef, ModelTestUtil.getTypesRegistry());
