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/02/07 23:09:55 UTC
[2/2] incubator-atlas git commit: ATLAS-1526: removed
foreignKey/mappedFromRef constraints and brought back legacy flags
isComposite/reverseAttributeName using constraints
ownedRef/inverseRef(attribute=attr1)
ATLAS-1526: removed foreignKey/mappedFromRef constraints and brought back
legacy flags isComposite/reverseAttributeName using constraints
ownedRef/inverseRef(attribute=attr1)
Project: http://git-wip-us.apache.org/repos/asf/incubator-atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-atlas/commit/48477e20
Tree: http://git-wip-us.apache.org/repos/asf/incubator-atlas/tree/48477e20
Diff: http://git-wip-us.apache.org/repos/asf/incubator-atlas/diff/48477e20
Branch: refs/heads/master
Commit: 48477e20816b9cb890e65da0b6ed289e51f3bb69
Parents: 5f508c9
Author: Madhan Neethiraj <ma...@apache.org>
Authored: Tue Feb 7 02:10:06 2017 -0800
Committer: Madhan Neethiraj <ma...@apache.org>
Committed: Tue Feb 7 14:58:34 2017 -0800
----------------------------------------------------------------------
addons/models/0030-hive_model.json | 31 ++-
addons/models/0060-hbase_model.json | 40 ++-
addons/models/0080-storm_model.json | 2 +-
.../java/org/apache/atlas/AtlasErrorCode.java | 4 +
.../atlas/model/typedef/AtlasStructDef.java | 59 +++--
.../org/apache/atlas/type/AtlasEntityType.java | 173 ------------
.../org/apache/atlas/type/AtlasStructType.java | 263 +++++++------------
.../test/java/org/apache/atlas/TestUtilsV2.java | 20 +-
.../apache/atlas/type/TestAtlasEntityType.java | 187 +++++++++----
.../store/graph/v1/AtlasStructDefStoreV1.java | 128 +--------
.../store/graph/v1/DeleteHandlerV1.java | 4 +-
.../store/graph/v1/StructVertexMapper.java | 4 +-
.../org/apache/atlas/examples/QuickStartV2.java | 21 +-
.../java/org/apache/atlas/util/RestUtils.java | 110 ++------
.../adapters/AtlasStructFormatConverter.java | 2 +-
.../atlas/web/resources/BaseResourceIT.java | 17 +-
16 files changed, 385 insertions(+), 680 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/48477e20/addons/models/0030-hive_model.json
----------------------------------------------------------------------
diff --git a/addons/models/0030-hive_model.json b/addons/models/0030-hive_model.json
index 5ae16cf..33ba156 100644
--- a/addons/models/0030-hive_model.json
+++ b/addons/models/0030-hive_model.json
@@ -215,12 +215,9 @@
"name": "sd",
"typeName": "hive_storagedesc",
"cardinality": "SINGLE",
- "constraintDefs": [
+ "constraints": [
{
- "type": "mappedFromRef",
- "params": {
- "refAttribute": "table"
- }
+ "type": "ownedRef"
}
],
"isIndexable": false,
@@ -231,7 +228,11 @@
"name": "partitionKeys",
"typeName": "array<hive_column>",
"cardinality": "SINGLE",
- "constraintDefs": [],
+ "constraints": [
+ {
+ "type": "ownedRef"
+ }
+ ],
"isIndexable": false,
"isOptional": true,
"isUnique": false
@@ -248,7 +249,11 @@
"name": "columns",
"typeName": "array<hive_column>",
"cardinality": "SINGLE",
- "constraintDefs": [],
+ "constraints": [
+ {
+ "type": "ownedRef"
+ }
+ ],
"isIndexable": false,
"isOptional": true,
"isUnique": false
@@ -306,11 +311,11 @@
"name": "table",
"typeName": "hive_table",
"cardinality": "SINGLE",
- "constraintDefs": [
+ "constraints": [
{
- "type": "foreignKey",
+ "type": "inverseRef",
"params": {
- "onDelete": "cascade"
+ "attribute": "sd"
}
}
],
@@ -469,11 +474,11 @@
"name": "table",
"typeName": "hive_table",
"cardinality": "SINGLE",
- "constraintDefs": [
+ "constraints": [
{
- "type": "foreignKey",
+ "type": "inverseRef",
"params": {
- "onDelete": "cascade"
+ "attribute": "columns"
}
}
],
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/48477e20/addons/models/0060-hbase_model.json
----------------------------------------------------------------------
diff --git a/addons/models/0060-hbase_model.json b/addons/models/0060-hbase_model.json
index 5febbbc..1f2e57f 100644
--- a/addons/models/0060-hbase_model.json
+++ b/addons/models/0060-hbase_model.json
@@ -17,7 +17,20 @@
"isIndexable": false,
"isOptional": false,
"isUnique": false
- }
+ },
+ {
+ "name": "column_families",
+ "typeName": "array<hbase_column_family>",
+ "cardinality": "SINGLE",
+ "constraints": [
+ {
+ "type": "ownedRef"
+ }
+ ],
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
+ },
]
},
{
@@ -33,14 +46,27 @@
"isIndexable": false,
"isOptional": false,
"isUnique": false,
- "constraintDefs": [
+ "constraints": [
{
- "type": "foreignKey",
+ "type": "inverseRef",
"params": {
- "onDelete": "cascade"
+ "attribute": "column_families"
}
}
]
+ },
+ {
+ "name": "columns",
+ "typeName": "array<hbase_column>",
+ "cardinality": "SINGLE",
+ "constraints": [
+ {
+ "type": "ownedRef"
+ }
+ ],
+ "isIndexable": false,
+ "isOptional": true,
+ "isUnique": false
}
],
"typeVersion": "1.0"
@@ -58,11 +84,11 @@
"isIndexable": false,
"isOptional": false,
"isUnique": false,
- "constraintDefs": [
+ "constraints": [
{
- "type": "foreignKey",
+ "type": "inverseRef",
"params": {
- "onDelete": "cascade"
+ "attribute": "columns"
}
}
]
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/48477e20/addons/models/0080-storm_model.json
----------------------------------------------------------------------
diff --git a/addons/models/0080-storm_model.json b/addons/models/0080-storm_model.json
index 344227d..095936e 100644
--- a/addons/models/0080-storm_model.json
+++ b/addons/models/0080-storm_model.json
@@ -54,7 +54,7 @@
"name": "nodes",
"typeName": "array<storm_node>",
"cardinality": "LIST",
- "constraintDefs": [],
+ "constraints": [],
"isIndexable": false,
"isOptional": false,
"isUnique": false
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/48477e20/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 49289d8..f9895cf 100644
--- a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
+++ b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
@@ -55,6 +55,10 @@ public enum AtlasErrorCode {
TYPE_NAME_INVALID_FORMAT(400, "ATLAS40025E", "{0}: invalid name for {1}. Names must consist of a letter followed by a sequence of letter, number, or '_' characters"),
INVALID_PARAMETERS(400, "ATLAS40025E", "invalid parameters: {0}"),
CLASSIFICATION_ALREADY_ASSOCIATED(400, "ATLAS40026E", "instance {0} already is associated with classification {1}"),
+ CONSTRAINT_INVERSE_REF_ATTRIBUTE_INVALID_TYPE(400, "ATLAS40027E", "{0}.{1}: invalid {2} constraint. Attribute {3} is not an entity type"),
+ CONSTRAINT_INVERSE_REF_INVERSE_ATTRIBUTE_NON_EXISTING(400, "ATLAS40028E", "{0}.{1}: invalid {2} constraint. Inverse attribute {3}.{4} does not exist"),
+ CONSTRAINT_INVERSE_REF_INVERSE_ATTRIBUTE_INVALID_TYPE(400, "ATLAS40029E", "{0}.{1}: invalid {2} constraint. Inverse attribute {3}.{4} is not an entity type"),
+ CONSTRAINT_OWNED_REF_ATTRIBUTE_INVALID_TYPE(400, "ATLAS40030E", "{0}.{1}: invalid {2} constraint. Attribute {3} is not an entity type"),
// All Not found enums go here
TYPE_NAME_NOT_FOUND(404, "ATLAS4041E", "Given typename {0} was invalid"),
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/48477e20/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 2c00f54..2abc30b 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
@@ -42,6 +42,8 @@ import org.apache.hadoop.util.StringUtils;
import org.codehaus.jackson.annotate.JsonAutoDetect;
import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.PUBLIC_ONLY;
import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.map.annotate.JsonSerialize;
@@ -269,7 +271,7 @@ public class AtlasStructDef extends AtlasBaseTypeDef implements Serializable {
private int valuesMaxCount;
private boolean isUnique;
private boolean isIndexable;
- private List<AtlasConstraintDef> constraintDefs;
+ private List<AtlasConstraintDef> constraints;
public AtlasAttributeDef() { this(null, null); }
@@ -279,7 +281,7 @@ public class AtlasStructDef extends AtlasBaseTypeDef implements Serializable {
public AtlasAttributeDef(String name, String typeName, boolean isOptional, Cardinality cardinality,
int valuesMinCount, int valuesMaxCount, boolean isUnique, boolean isIndexable,
- List<AtlasConstraintDef> constraintDefs) {
+ List<AtlasConstraintDef> constraints) {
setName(name);
setTypeName(typeName);
setIsOptional(isOptional);
@@ -288,7 +290,7 @@ public class AtlasStructDef extends AtlasBaseTypeDef implements Serializable {
setValuesMaxCount(valuesMaxCount);
setIsUnique(isUnique);
setIsIndexable(isIndexable);
- setConstraintDefs(constraintDefs);
+ setConstraints(constraints);
}
public AtlasAttributeDef(AtlasAttributeDef other) {
@@ -301,7 +303,7 @@ public class AtlasStructDef extends AtlasBaseTypeDef implements Serializable {
setValuesMaxCount(other.getValuesMaxCount());
setIsUnique(other.getIsUnique());
setIsIndexable(other.getIsIndexable());
- setConstraintDefs(other.getConstraintDefs());
+ setConstraints(other.getConstraints());
}
}
@@ -367,33 +369,34 @@ public class AtlasStructDef extends AtlasBaseTypeDef implements Serializable {
isIndexable = idexable;
}
- public List<AtlasConstraintDef> getConstraintDefs() { return constraintDefs; }
+ public List<AtlasConstraintDef> getConstraints() { return constraints; }
- public void setConstraintDefs(List<AtlasConstraintDef> constraintDefs) {
- if (this.constraintDefs != null && this.constraintDefs == constraintDefs) {
+ public void setConstraints(List<AtlasConstraintDef> constraints) {
+ if (this.constraints != null && this.constraints == constraints) {
return;
}
- if (CollectionUtils.isEmpty(constraintDefs)) {
- this.constraintDefs = null;
+ if (CollectionUtils.isEmpty(constraints)) {
+ this.constraints = null;
} else {
- this.constraintDefs = new ArrayList<>(constraintDefs);
+ this.constraints = new ArrayList<>(constraints);
}
}
public void addConstraint(AtlasConstraintDef constraintDef) {
- List<AtlasConstraintDef> cDefs = constraintDefs;
+ List<AtlasConstraintDef> cDefs = constraints;
if (cDefs == null) {
cDefs = new ArrayList<>();
+
+ this.constraints = cDefs;
} else {
cDefs = new ArrayList<>(cDefs);
}
cDefs.add(constraintDef);
-
- this.constraintDefs = cDefs;
}
+
public StringBuilder toString(StringBuilder sb) {
if (sb == null) {
sb = new StringBuilder();
@@ -408,10 +411,10 @@ public class AtlasStructDef extends AtlasBaseTypeDef implements Serializable {
sb.append(", valuesMaxCount=").append(valuesMaxCount);
sb.append(", isUnique=").append(isUnique);
sb.append(", isIndexable=").append(isIndexable);
- sb.append(", constraintDefs=[");
- if (CollectionUtils.isNotEmpty(constraintDefs)) {
+ sb.append(", constraints=[");
+ if (CollectionUtils.isNotEmpty(constraints)) {
int i = 0;
- for (AtlasConstraintDef constraintDef : constraintDefs) {
+ for (AtlasConstraintDef constraintDef : constraints) {
constraintDef.toString(sb);
if (i > 0) {
sb.append(", ");
@@ -438,12 +441,12 @@ public class AtlasStructDef extends AtlasBaseTypeDef implements Serializable {
Objects.equals(name, that.name) &&
Objects.equals(typeName, that.typeName) &&
cardinality == that.cardinality &&
- Objects.equals(constraintDefs, that.constraintDefs);
+ Objects.equals(constraints, that.constraints);
}
@Override
public int hashCode() {
- return Objects.hash(name, typeName, isOptional, cardinality, valuesMinCount, valuesMaxCount, isUnique, isIndexable, constraintDefs);
+ return Objects.hash(name, typeName, isOptional, cardinality, valuesMinCount, valuesMaxCount, isUnique, isIndexable, constraints);
}
@Override
@@ -465,11 +468,9 @@ public class AtlasStructDef extends AtlasBaseTypeDef implements Serializable {
public static class AtlasConstraintDef implements Serializable {
private static final long serialVersionUID = 1L;
- public static final String CONSTRAINT_TYPE_FOREIGN_KEY = "foreignKey";
- public static final String CONSTRAINT_TYPE_MAPPED_FROM_REF = "mappedFromRef";
- public static final String CONSTRAINT_PARAM_REF_ATTRIBUTE = "refAttribute";
- public static final String CONSTRAINT_PARAM_ON_DELETE = "onDelete";
- public static final String CONSTRAINT_PARAM_VAL_CASCADE = "cascade";
+ public static final String CONSTRAINT_TYPE_OWNED_REF = "ownedRef";
+ public static final String CONSTRAINT_TYPE_INVERSE_REF = "inverseRef";
+ public static final String CONSTRAINT_PARAM_ATTRIBUTE = "attribute";
private String type; // foreignKey/mappedFromRef/valueInRange
private Map<String, Object> params; // onDelete=cascade/refAttribute=attr2/min=0,max=23
@@ -515,6 +516,18 @@ public class AtlasStructDef extends AtlasBaseTypeDef implements Serializable {
this.params = params;
}
+ @JsonIgnore
+ public boolean isConstraintType(String name) {
+ return StringUtils.equalsIgnoreCase(name, this.type);
+ }
+
+ @JsonIgnore
+ public Object getParam(String name) {
+ Map<String, Object> params = this.params;
+
+ return params != null ? params.get(name) : null;
+ }
+
public StringBuilder toString(StringBuilder sb) {
if (sb == null) {
sb = new StringBuilder();
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/48477e20/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java b/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java
index 761eef5..7615057 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasEntityType.java
@@ -24,15 +24,12 @@ import org.apache.atlas.model.instance.AtlasEntity;
import org.apache.atlas.model.instance.AtlasObjectId;
import org.apache.atlas.model.typedef.AtlasEntityDef;
import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
-import org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef;
import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -40,7 +37,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.*;
/**
* class that implements behaviour of an entity-type.
@@ -53,8 +49,6 @@ public class AtlasEntityType extends AtlasStructType {
private List<AtlasEntityType> superTypes = Collections.emptyList();
private Set<String> allSuperTypes = Collections.emptySet();
private Set<String> allSubTypes = Collections.emptySet();
- private Map<String, AtlasAttribute> mappedFromRefAttributes = new HashMap<>();
- private List<ForeignKeyReference> foreignKeyReferences = Collections.emptyList();
public AtlasEntityType(AtlasEntityDef entityDef) {
super(entityDef);
@@ -96,15 +90,12 @@ public class AtlasEntityType extends AtlasStructType {
this.allSuperTypes = Collections.unmodifiableSet(allS);
this.allAttributes = Collections.unmodifiableMap(allA);
this.allSubTypes = new HashSet<>(); // this will be populated in resolveReferencesPhase2()
- this.foreignKeyReferences = new ArrayList<>(); // this will be populated in resolveReferencesPhase2()
}
@Override
public void resolveReferencesPhase2(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
super.resolveReferencesPhase2(typeRegistry);
- mappedFromRefAttributes = Collections.unmodifiableMap(resolveMappedFromRefConstraint(allAttributes.values()));
-
for (String superTypeName : allSuperTypes) {
AtlasEntityType superType = typeRegistry.getEntityTypeByName(superTypeName);
superType.addSubType(this);
@@ -121,47 +112,6 @@ public class AtlasEntityType extends AtlasStructType {
public Set<String> getAllSubTypes() { return Collections.unmodifiableSet(allSubTypes); }
- public Collection<String> getMappedFromRefAttributes() { return mappedFromRefAttributes.keySet(); }
-
- public boolean isMappedFromRefAttribute(String attributeName) {
- return mappedFromRefAttributes.containsKey(attributeName);
- }
-
- public String getMappedFromRefAttribute(String typeName, String attribName) {
- String ret = null;
-
- for (Map.Entry<String, AtlasAttribute> e : mappedFromRefAttributes.entrySet()) {
- AtlasAttribute attribute = e.getValue();
-
- if(StringUtils.equals(attribute.getDefinedInType().getTypeName(), typeName) && StringUtils.equals(attribute.getName(), attribName)) {
- ret = e.getKey();
-
- break;
- }
- }
-
- return ret;
- }
-
- public List<ForeignKeyReference> getForeignKeyReferences() {
- return Collections.unmodifiableList(foreignKeyReferences);
- }
-
- public ForeignKeyReference getForeignKeyReference(String fromTypeName, String fromAttributeName) {
- ForeignKeyReference ret = null;
-
- for (ForeignKeyReference fkRef : foreignKeyReferences) {
- if (StringUtils.equals(fkRef.fromTypeName(), fromTypeName) &&
- StringUtils.equals(fkRef.fromAttributeName(), fromAttributeName)) {
- ret = fkRef;
-
- break;
- }
- }
-
- return ret;
- }
-
public boolean isSuperTypeOf(AtlasEntityType entityType) {
return entityType != null && allSubTypes.contains(entityType.getTypeName());
}
@@ -283,10 +233,6 @@ public class AtlasEntityType extends AtlasStructType {
}
}
- void addForeignKeyReference(AtlasAttribute attribute, AtlasConstraintDef refConstraint) {
- foreignKeyReferences.add(new ForeignKeyReference(attribute, refConstraint));
- }
-
private void addSubType(AtlasEntityType subType) {
allSubTypes.add(subType.getTypeName());
}
@@ -334,128 +280,9 @@ public class AtlasEntityType extends AtlasStructType {
}
}
- /*
- * valid conditions for mapped-from-ref constraint:
- * - supported only in entity-type
- * - attribute should be an entity-type or an array of entity-type
- * - attribute's entity-type should have a foreign-key constraint to this type
- */
- private Map<String, AtlasAttribute> resolveMappedFromRefConstraint(Collection<AtlasAttribute> attributes) throws AtlasBaseException {
- Map<String, AtlasAttribute> ret = null;
-
- for (AtlasAttribute attribute : attributes) {
- AtlasAttributeDef attribDef = attribute.getAttributeDef();
-
- if (CollectionUtils.isEmpty(attribDef.getConstraintDefs())) {
- continue;
- }
-
- for (AtlasConstraintDef constraintDef : attribDef.getConstraintDefs()) {
- if (!StringUtils.equals(constraintDef.getType(), CONSTRAINT_TYPE_MAPPED_FROM_REF)) {
- continue;
- }
-
- AtlasType attribType = attribute.getAttributeType();
-
- if (attribType instanceof AtlasArrayType) {
- attribType = ((AtlasArrayType)attribType).getElementType();
- }
-
- if (!(attribType instanceof AtlasEntityType)) {
- throw new AtlasBaseException(AtlasErrorCode.CONSTRAINT_NOT_SATISFIED, getTypeName(),
- attribDef.getName(), CONSTRAINT_TYPE_MAPPED_FROM_REF,
- attribDef.getTypeName());
- }
-
- String refAttribName = AtlasTypeUtil.getStringValue(constraintDef.getParams(), CONSTRAINT_PARAM_REF_ATTRIBUTE);
-
- if (StringUtils.isBlank(refAttribName)) {
- throw new AtlasBaseException(AtlasErrorCode.CONSTRAINT_MISSING_PARAMS,
- getTypeName(), attribDef.getName(),
- CONSTRAINT_PARAM_REF_ATTRIBUTE, CONSTRAINT_TYPE_MAPPED_FROM_REF,
- String.valueOf(constraintDef.getParams()));
- }
-
- AtlasEntityType entityType = (AtlasEntityType) attribType;
- AtlasAttribute refAttrib = entityType.getAttribute(refAttribName);
-
- if (refAttrib == null) {
- throw new AtlasBaseException(AtlasErrorCode.CONSTRAINT_NOT_EXIST,
- getTypeName(), attribDef.getName(), CONSTRAINT_PARAM_REF_ATTRIBUTE,
- entityType.getTypeName(), refAttribName);
- }
-
- if (!StringUtils.equals(getTypeName(), refAttrib.getTypeName())) {
- throw new AtlasBaseException(AtlasErrorCode.CONSTRAINT_NOT_MATCHED,
- getTypeName(), attribDef.getName(), CONSTRAINT_PARAM_REF_ATTRIBUTE,
- entityType.getTypeName(), refAttribName, getTypeName(),
- refAttrib.getTypeName());
- }
-
- if (ret == null) {
- ret = new HashMap<>();
- }
-
- ret.put(attribDef.getName(), refAttrib);
-
- break;
- }
- }
-
- return ret == null ? Collections.<String, AtlasAttribute>emptyMap() : ret;
- }
-
boolean isAssignableFrom(AtlasObjectId objId) {
boolean ret = objId.isValid() && (StringUtils.equals(objId.getTypeName(), getTypeName()) || isSuperTypeOf(objId.getTypeName()));
return ret;
}
-
- public static class ForeignKeyReference {
- private final AtlasAttribute fromAttribute;
- private final AtlasConstraintDef refConstraint;
-
- public ForeignKeyReference(AtlasAttribute fromAttribute, AtlasConstraintDef refConstraint) {
- this.fromAttribute = fromAttribute;
- this.refConstraint = refConstraint;
- }
-
- public String fromTypeName() { return fromType().getTypeName(); }
-
- public String fromAttributeName() { return fromAttribute.getName(); }
-
- public String toTypeName() { return fromAttribute.getTypeName(); }
-
- public AtlasStructType fromType() { return fromAttribute.getDefinedInType(); }
-
- public AtlasAttribute fromAttribute() { return fromAttribute; }
-
- public AtlasEntityType toType() {
- AtlasType attrType = fromAttribute.getAttributeType();
-
- if (attrType instanceof AtlasArrayType) {
- attrType = ((AtlasArrayType)attrType).getElementType();
- }
-
- if (attrType instanceof AtlasEntityType) {
- return (AtlasEntityType)attrType;
- }
-
- return null;
- }
-
- public AtlasConstraintDef getConstraint() { return refConstraint; }
-
- public boolean isOnDeleteCascade() {
- return StringUtils.equals(getOnDeleteAction(), CONSTRAINT_PARAM_VAL_CASCADE);
- }
-
- private String getOnDeleteAction() {
- Map<String, Object> params = refConstraint.getParams();
-
- Object action = MapUtils.isNotEmpty(params) ? params.get(AtlasConstraintDef.CONSTRAINT_PARAM_ON_DELETE) : null;
-
- return (action != null) ? action.toString() : null;
- }
- }
}
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/48477e20/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 f444e93..4b23ecf 100644
--- a/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java
+++ b/intg/src/main/java/org/apache/atlas/type/AtlasStructType.java
@@ -17,26 +17,26 @@
*/
package org.apache.atlas.type;
+import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_TYPE_OWNED_REF;
+import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_TYPE_INVERSE_REF;
+import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_PARAM_ATTRIBUTE;
+
import org.apache.atlas.AtlasErrorCode;
import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.model.instance.AtlasStruct;
import org.apache.atlas.model.typedef.AtlasStructDef;
+import org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef;
import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef.Cardinality;
-import org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef;
-import org.apache.atlas.type.AtlasEntityType.ForeignKeyReference;
import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Set;
/**
* class that implements behaviour of a struct-type.
@@ -46,8 +46,7 @@ public class AtlasStructType extends AtlasType {
private final AtlasStructDef structDef;
- private Map<String, AtlasConstraintDef> foreignKeyAttributes = Collections.emptyMap();
- protected Map<String, AtlasAttribute> allAttributes = Collections.emptyMap();
+ protected Map<String, AtlasAttribute> allAttributes = Collections.emptyMap();
public AtlasStructType(AtlasStructDef structDef) {
super(structDef);
@@ -77,37 +76,6 @@ public class AtlasStructType extends AtlasType {
return attribute != null ? attribute.getAttributeDef() : null;
}
- public Set<String> getForeignKeyAttributes() { return foreignKeyAttributes.keySet(); }
-
- public boolean isForeignKeyAttribute(String attributeName) {
- return foreignKeyAttributes.containsKey(attributeName);
- }
-
- public AtlasConstraintDef getForeignKeyConstraint(String attributeName) {
- return foreignKeyAttributes.get(attributeName);
- }
-
- public String getForeignKeyOnDeleteAction(String attributeName) {
- String ret = null;
-
- AtlasConstraintDef fkConstraint = getForeignKeyConstraint(attributeName);
-
- if (fkConstraint != null && MapUtils.isNotEmpty(fkConstraint.getParams())) {
- Object onDeleteAction = fkConstraint.getParams().get(AtlasConstraintDef.CONSTRAINT_PARAM_ON_DELETE);
-
- if (onDeleteAction != null) {
- ret = onDeleteAction.toString();
- }
- }
-
- return ret;
- }
-
- public boolean isForeignKeyOnDeleteActionCascade(String attributeName) {
- return StringUtils.equals(getForeignKeyOnDeleteAction(attributeName),
- AtlasConstraintDef.CONSTRAINT_PARAM_VAL_CASCADE);
- }
-
@Override
public void resolveReferences(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
Map<String, AtlasAttribute> a = new HashMap<>();
@@ -133,33 +101,69 @@ public class AtlasStructType extends AtlasType {
a.put(attributeDef.getName(), attribute);
}
- this.allAttributes = Collections.unmodifiableMap(a);
+ resolveConstraints(typeRegistry);
- foreignKeyAttributes = Collections.unmodifiableMap(resolveForeignKeyConstraints(allAttributes.values()));
+ this.allAttributes = Collections.unmodifiableMap(a);
}
- @Override
- public void resolveReferencesPhase2(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
- super.resolveReferencesPhase2(typeRegistry);
+ private void resolveConstraints(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
+ for (AtlasAttributeDef attributeDef : getStructDef().getAttributeDefs()) {
+ if (CollectionUtils.isEmpty(attributeDef.getConstraints())) {
+ continue;
+ }
- for (Map.Entry<String, AtlasConstraintDef> e : foreignKeyAttributes.entrySet()) {
- String attributeName = e.getKey();
- AtlasAttribute attribute = getAttribute(attributeName);
- AtlasConstraintDef constraint = e.getValue();
+ for (AtlasConstraintDef constraint : attributeDef.getConstraints()) {
+ if (constraint.isConstraintType(CONSTRAINT_TYPE_OWNED_REF)) {
+ AtlasEntityType attrType = getReferencedEntityType(typeRegistry.getType(attributeDef.getTypeName()));
- AtlasType attrType = attribute.getAttributeType();
+ if (attrType == null) {
+ throw new AtlasBaseException(AtlasErrorCode.CONSTRAINT_OWNED_REF_ATTRIBUTE_INVALID_TYPE,
+ getTypeName(), attributeDef.getName(), CONSTRAINT_TYPE_OWNED_REF, attributeDef.getTypeName());
+ }
+ } else if (constraint.isConstraintType(CONSTRAINT_TYPE_INVERSE_REF)) {
+ AtlasEntityType attrType = getReferencedEntityType(typeRegistry.getType(attributeDef.getTypeName()));
- if (attrType instanceof AtlasArrayType) {
- attrType = ((AtlasArrayType)attrType).getElementType();
- }
+ if (attrType == null) {
+ throw new AtlasBaseException(AtlasErrorCode.CONSTRAINT_INVERSE_REF_ATTRIBUTE_INVALID_TYPE,
+ getTypeName(), attributeDef.getName(), CONSTRAINT_TYPE_INVERSE_REF,
+ attributeDef.getTypeName());
+ }
+
+ String inverseRefAttrName = AtlasTypeUtil.getStringValue(constraint.getParams(), CONSTRAINT_PARAM_ATTRIBUTE);
+
+ if (StringUtils.isBlank(inverseRefAttrName)) {
+ throw new AtlasBaseException(AtlasErrorCode.CONSTRAINT_MISSING_PARAMS,
+ getTypeName(), attributeDef.getName(),
+ CONSTRAINT_PARAM_ATTRIBUTE, CONSTRAINT_TYPE_INVERSE_REF,
+ String.valueOf(constraint.getParams()));
+ }
+
+ AtlasAttributeDef inverseRefAttrDef = attrType.getStructDef().getAttribute(inverseRefAttrName);
- if (attrType instanceof AtlasEntityType) {
- ((AtlasEntityType)attrType).addForeignKeyReference(attribute, constraint);
+ if (inverseRefAttrDef == null) {
+ throw new AtlasBaseException(AtlasErrorCode.CONSTRAINT_INVERSE_REF_INVERSE_ATTRIBUTE_NON_EXISTING,
+ getTypeName(), attributeDef.getName(),
+ CONSTRAINT_TYPE_INVERSE_REF, attrType.getTypeName(), inverseRefAttrName);
+ }
+
+ AtlasEntityType inverseRefAttrType = getReferencedEntityType(typeRegistry.getType(inverseRefAttrDef.getTypeName()));
+
+ if (inverseRefAttrType == null) {
+ throw new AtlasBaseException(AtlasErrorCode.CONSTRAINT_INVERSE_REF_INVERSE_ATTRIBUTE_INVALID_TYPE,
+ getTypeName(), attributeDef.getName(),
+ CONSTRAINT_TYPE_INVERSE_REF, attrType.getTypeName(), inverseRefAttrName);
+ }
+ }
}
}
}
@Override
+ public void resolveReferencesPhase2(AtlasTypeRegistry typeRegistry) throws AtlasBaseException {
+ super.resolveReferencesPhase2(typeRegistry);
+ }
+
+ @Override
public AtlasStruct createDefaultValue() {
AtlasStruct ret = new AtlasStruct(structDef.getName());
@@ -383,57 +387,6 @@ public class AtlasStructType extends AtlasType {
return null;
}
- /*
- * valid conditions for foreign-key constraint:
- * - supported only in entity-type
- * - attribute should be an entity-type or an array of entity-type
- */
- private Map<String, AtlasConstraintDef> resolveForeignKeyConstraints(Collection<AtlasAttribute> attributes)
- throws AtlasBaseException {
- Map<String, AtlasConstraintDef> ret = null;
-
- for (AtlasAttribute attribute : attributes) {
- AtlasAttributeDef attribDef = attribute.getAttributeDef();
-
- if (CollectionUtils.isEmpty(attribDef.getConstraintDefs())) {
- continue;
- }
-
- for (AtlasConstraintDef constraintDef : attribDef.getConstraintDefs()) {
- if (!StringUtils.equals(constraintDef.getType(), AtlasConstraintDef.CONSTRAINT_TYPE_FOREIGN_KEY)) {
- continue;
- }
-
- if (!(this instanceof AtlasEntityType)) {
- throw new AtlasBaseException(AtlasErrorCode.UNSUPPORTED_CONSTRAINT,
- AtlasConstraintDef.CONSTRAINT_TYPE_FOREIGN_KEY, getTypeName(), attribute.getName());
- }
-
- AtlasType attrType = attribute.getAttributeType();
-
- if (attrType instanceof AtlasArrayType) {
- attrType = ((AtlasArrayType) attrType).getElementType();
- }
-
- if (!(attrType instanceof AtlasEntityType)) {
- throw new AtlasBaseException(AtlasErrorCode.CONSTRAINT_NOT_SATISFIED,
- getTypeName(), attribute.getName(), AtlasConstraintDef.CONSTRAINT_TYPE_FOREIGN_KEY,
- attrType.getTypeName());
- }
-
- if (ret == null) {
- ret = new HashMap<>();
- }
-
- ret.put(attribute.getName(), constraintDef);
-
- break;
- }
- }
-
- return ret == null ? Collections.<String, AtlasConstraintDef>emptyMap() : ret;
- }
-
public String getQualifiedAttributeName(String attrName) throws AtlasBaseException {
if ( allAttributes.containsKey(attrName)) {
return allAttributes.get(attrName).getQualifiedName();
@@ -442,18 +395,49 @@ public class AtlasStructType extends AtlasType {
throw new AtlasBaseException(AtlasErrorCode.UNKNOWN_ATTRIBUTE, attrName, structDef.getName());
}
- public static class AtlasAttribute {
+ private AtlasEntityType getReferencedEntityType(AtlasType type) {
+ if (type instanceof AtlasArrayType) {
+ type = ((AtlasArrayType)type).getElementType();
+ }
+ return type instanceof AtlasEntityType ? (AtlasEntityType)type : null;
+ }
+
+ public static class AtlasAttribute {
private final AtlasStructType definedInType;
private final AtlasType attributeType;
private final AtlasAttributeDef attributeDef;
private final String qualifiedName;
+ private final boolean isOwnedRef;
+ private final String inverseRefAttribute;
public AtlasAttribute(AtlasStructType definedInType, AtlasAttributeDef attrDef, AtlasType attributeType) {
this.definedInType = definedInType;
this.attributeDef = attrDef;
this.attributeType = attributeType;
this.qualifiedName = getQualifiedAttributeName(definedInType.getStructDef(), attributeDef.getName());
+
+ boolean isOwnedRef = false;
+ String inverseRefAttribute = null;
+
+ if (CollectionUtils.isNotEmpty(attributeDef.getConstraints())) {
+ for (AtlasConstraintDef constraint : attributeDef.getConstraints()) {
+ if (constraint.isConstraintType(CONSTRAINT_TYPE_OWNED_REF)) {
+ isOwnedRef = true;
+ }
+
+ if (constraint.isConstraintType(CONSTRAINT_TYPE_INVERSE_REF)) {
+ Object val = constraint.getParam(CONSTRAINT_PARAM_ATTRIBUTE);
+
+ if (val != null) {
+ inverseRefAttribute = val.toString();
+ }
+ }
+ }
+ }
+
+ this.isOwnedRef = isOwnedRef;
+ this.inverseRefAttribute = inverseRefAttribute;
}
public AtlasStructType getDefinedInType() { return definedInType; }
@@ -478,74 +462,9 @@ public class AtlasStructType extends AtlasType {
return qualifiedName;
}
- public boolean isForeignKeyWithOnDeleteCascade() {
- return definedInType.isForeignKeyOnDeleteActionCascade(getName());
- }
-
- /*
- * true - if attribute-type has foreign-key(onDelete=cascade) reference to this type
- * false - in all cases
- *
- * "legacyIsComposite" can not be computed and cached in the constructor - as definedInType is not fully
- * populated at the time AtlasAttribute object is constructed.
- */
- public boolean legacyIsComposite() {
- boolean ret = false;
-
- if (definedInType instanceof AtlasEntityType) {
- AtlasEntityType entityType = (AtlasEntityType) definedInType;
- AtlasType attrType = attributeType;
-
- if (attrType instanceof AtlasArrayType) {
- attrType = ((AtlasArrayType)attrType).getElementType();
- }
-
- if (attrType instanceof AtlasEntityType) {
- for (ForeignKeyReference fkRef : entityType.getForeignKeyReferences()) {
- if (fkRef.isOnDeleteCascade() && StringUtils.equals(fkRef.fromTypeName(), attrType.getTypeName())) {
- ret = true;
- break;
- }
- }
- }
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("*** {}.{}: isComposite={} ***", definedInType.getTypeName(), getName(), ret);
- }
-
- return ret;
- }
-
- /*
- * return the name of the attribute in attribute-type that has mappedFromRef constraint on this attribute
- *
- * "legacyReverseAttribute" can not be computed and cached in the constructor - as definedInType is not fully
- * populated at the time AtlasAttribute object is constructed.
- */
- public String legacyReverseAttribute() {
- String ret = null;
-
- if (definedInType instanceof AtlasEntityType) {
- AtlasType attrType = attributeType;
-
- if (attrType instanceof AtlasArrayType) {
- attrType = ((AtlasArrayType)attrType).getElementType();
- }
-
- if (attrType instanceof AtlasEntityType) {
- AtlasEntityType attribEntityType = (AtlasEntityType) attrType;
+ public boolean isOwnedRef() { return isOwnedRef; }
- ret = attribEntityType.getMappedFromRefAttribute(definedInType.getTypeName(), getName());
- }
- }
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("*** {}.{}: reverseAttribute={} ***", definedInType.getTypeName(), getName(), ret);
- }
-
- return ret;
- }
+ public String getInverseRefAttribute() { return inverseRefAttribute; }
public static String getQualifiedAttributeName(AtlasStructDef structDef, String attrName) {
final String typeName = structDef.getName();
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/48477e20/intg/src/test/java/org/apache/atlas/TestUtilsV2.java
----------------------------------------------------------------------
diff --git a/intg/src/test/java/org/apache/atlas/TestUtilsV2.java b/intg/src/test/java/org/apache/atlas/TestUtilsV2.java
index b4aa8aa..f09a4b9 100755
--- a/intg/src/test/java/org/apache/atlas/TestUtilsV2.java
+++ b/intg/src/test/java/org/apache/atlas/TestUtilsV2.java
@@ -87,12 +87,6 @@ public final class TestUtilsV2 {
AtlasAttributeDef.Cardinality.SINGLE, 0, 1, false, false,
new ArrayList<AtlasConstraintDef>()));
- deptTypeDef.getAttribute("employees").addConstraint(
- new AtlasConstraintDef(
- AtlasConstraintDef.CONSTRAINT_TYPE_MAPPED_FROM_REF, new HashMap<String, Object>() {{
- put(AtlasConstraintDef.CONSTRAINT_PARAM_REF_ATTRIBUTE, "department");
- }}));
-
AtlasEntityDef personTypeDef = AtlasTypeUtil.createClassTypeDef("Person", "Person"+_description, ImmutableSet.<String>of(),
AtlasTypeUtil.createUniqueRequiredAttrDef("name", "string"),
AtlasTypeUtil.createOptionalAttrDef("address", "Address"),
@@ -126,8 +120,8 @@ public final class TestUtilsV2 {
employeeTypeDef.getAttribute("department").addConstraint(
new AtlasConstraintDef(
- AtlasConstraintDef.CONSTRAINT_TYPE_FOREIGN_KEY, new HashMap<String, Object>() {{
- put(AtlasConstraintDef.CONSTRAINT_PARAM_ON_DELETE, AtlasConstraintDef.CONSTRAINT_PARAM_VAL_CASCADE);
+ AtlasConstraintDef.CONSTRAINT_TYPE_INVERSE_REF, new HashMap<String, Object>() {{
+ put(AtlasConstraintDef.CONSTRAINT_PARAM_ATTRIBUTE, "employees");
}}));
AtlasEntityDef managerTypeDef = AtlasTypeUtil.createClassTypeDef("Manager", "Manager"+_description, ImmutableSet.of("Employee"),
@@ -480,8 +474,8 @@ public final class TestUtilsV2 {
false, false,
new ArrayList<AtlasStructDef.AtlasConstraintDef>() {{
add(new AtlasStructDef.AtlasConstraintDef(
- AtlasStructDef.AtlasConstraintDef.CONSTRAINT_TYPE_FOREIGN_KEY, new HashMap<String, Object>() {{
- put(AtlasStructDef.AtlasConstraintDef.CONSTRAINT_PARAM_ON_DELETE, AtlasStructDef.AtlasConstraintDef.CONSTRAINT_PARAM_VAL_CASCADE);
+ AtlasConstraintDef.CONSTRAINT_TYPE_INVERSE_REF, new HashMap<String, Object>() {{
+ put(AtlasConstraintDef.CONSTRAINT_PARAM_ATTRIBUTE, "columns");
}}));
}})
);
@@ -583,11 +577,7 @@ public final class TestUtilsV2 {
AtlasAttributeDef.Cardinality.SINGLE, 0, 1,
false, false,
new ArrayList<AtlasStructDef.AtlasConstraintDef>() {{
- add(new AtlasStructDef.AtlasConstraintDef(
- AtlasStructDef.AtlasConstraintDef.CONSTRAINT_TYPE_MAPPED_FROM_REF,
- new HashMap<String, Object>() {{
- put(AtlasStructDef.AtlasConstraintDef.CONSTRAINT_PARAM_REF_ATTRIBUTE, "table");
- }}));
+ add(new AtlasStructDef.AtlasConstraintDef(AtlasConstraintDef.CONSTRAINT_TYPE_OWNED_REF));
}}),
// array of structs
new AtlasAttributeDef("partitions", String.format("array<%s>", "partition_struct_type"),
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/48477e20/intg/src/test/java/org/apache/atlas/type/TestAtlasEntityType.java
----------------------------------------------------------------------
diff --git a/intg/src/test/java/org/apache/atlas/type/TestAtlasEntityType.java b/intg/src/test/java/org/apache/atlas/type/TestAtlasEntityType.java
index 032dce0..2d71d41 100644
--- a/intg/src/test/java/org/apache/atlas/type/TestAtlasEntityType.java
+++ b/intg/src/test/java/org/apache/atlas/type/TestAtlasEntityType.java
@@ -23,6 +23,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import org.apache.atlas.AtlasErrorCode;
import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.model.ModelTestUtil;
import org.apache.atlas.model.instance.AtlasEntity;
@@ -31,7 +32,6 @@ import org.apache.atlas.model.typedef.AtlasEntityDef;
import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
import org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef;
import org.apache.atlas.type.AtlasTypeRegistry.AtlasTransientTypeRegistry;
-import org.apache.atlas.type.AtlasEntityType.ForeignKeyReference;
import org.testng.annotations.Test;
import static org.testng.Assert.*;
@@ -42,6 +42,7 @@ public class TestAtlasEntityType {
private static final String TYPE_COLUMN = "my_column";
private static final String ATTR_TABLE = "table";
private static final String ATTR_COLUMNS = "columns";
+ private static final String ATTR_NAME = "name";
private final AtlasEntityType entityType;
private final List<Object> validValues = new ArrayList<>();
@@ -129,7 +130,7 @@ public class TestAtlasEntityType {
}
@Test
- public void testForeignKeyConstraintValid() {
+ public void testValidConstraints() {
AtlasTypeRegistry typeRegistry = new AtlasTypeRegistry();
AtlasTransientTypeRegistry ttr = null;
boolean commit = false;
@@ -147,42 +148,81 @@ public class TestAtlasEntityType {
AtlasEntityType typeTable = ttr.getEntityTypeByName(TYPE_TABLE);
AtlasEntityType typeColumn = ttr.getEntityTypeByName(TYPE_COLUMN);
- assertEquals(typeTable.getForeignKeyReferences().size(), 1);
+ assertTrue(typeTable.getAttribute(ATTR_COLUMNS).isOwnedRef());
+ assertNull(typeTable.getAttribute(ATTR_COLUMNS).getInverseRefAttribute());
+ assertFalse(typeColumn.getAttribute(ATTR_TABLE).isOwnedRef());
+ assertEquals(typeColumn.getAttribute(ATTR_TABLE).getInverseRefAttribute(), ATTR_COLUMNS);
- ForeignKeyReference fkRef = typeTable.getForeignKeyReferences().get(0);
- assertEquals(fkRef.fromTypeName(), TYPE_COLUMN);
- assertEquals(fkRef.fromAttributeName(), ATTR_TABLE);
- assertEquals(fkRef.toTypeName(), TYPE_TABLE);
- assertTrue(fkRef.isOnDeleteCascade());
+ commit = true;
+ } catch (AtlasBaseException excp) {
+ failureMsg = excp.getMessage();
+ } finally {
+ typeRegistry.releaseTypeRegistryForUpdate(ttr, commit);
+ }
+ assertNull(failureMsg, "failed to create types " + TYPE_TABLE + " and " + TYPE_COLUMN);
+ }
+
+ @Test
+ public void testConstraintInvalidOwnedRef_InvalidAttributeType() {
+ AtlasTypeRegistry typeRegistry = new AtlasTypeRegistry();
+ AtlasTransientTypeRegistry ttr = null;
+ boolean commit = false;
+ List<AtlasEntityDef> entityDefs = new ArrayList<>();
+ AtlasErrorCode errorCode = null;
+
+ entityDefs.add(createTableEntityDefWithOwnedRefOnInvalidType());
- assertEquals(typeTable.getForeignKeyAttributes().size(), 0);
- assertEquals(typeTable.getMappedFromRefAttributes().size(), 1);
- assertTrue(typeTable.getMappedFromRefAttributes().contains(ATTR_COLUMNS));
+ try {
+ ttr = typeRegistry.lockTypeRegistryForUpdate();
- assertEquals(typeColumn.getForeignKeyReferences().size(), 0);
- assertEquals(typeColumn.getForeignKeyAttributes().size(), 1);
- assertTrue(typeColumn.getForeignKeyAttributes().contains(ATTR_TABLE));
- assertEquals(typeColumn.getMappedFromRefAttributes().size(), 0);
+ ttr.addTypes(entityDefs);
commit = true;
} catch (AtlasBaseException excp) {
- failureMsg = excp.getMessage();
+ errorCode = excp.getAtlasErrorCode();
} finally {
typeRegistry.releaseTypeRegistryForUpdate(ttr, commit);
}
- assertNull(failureMsg, "failed to create types " + TYPE_TABLE + " and " + TYPE_COLUMN);
+ assertEquals(errorCode, AtlasErrorCode.CONSTRAINT_OWNED_REF_ATTRIBUTE_INVALID_TYPE,
+ "expected invalid constraint failure - missing refAttribute");
}
@Test
- public void testForeignKeyConstraintInValidMappedFromRef() {
- AtlasTypeRegistry typeRegistry = new AtlasTypeRegistry();
- List<AtlasEntityDef> entityDefs = new ArrayList<>();
- String failureMsg = null;
+ public void testConstraintInValidInverseRef_MissingParams() {
+ AtlasTypeRegistry typeRegistry = new AtlasTypeRegistry();
+ AtlasTransientTypeRegistry ttr = null;
+ boolean commit = false;
+ List<AtlasEntityDef> entityDefs = new ArrayList<>();
+ AtlasErrorCode errorCode = null;
entityDefs.add(createTableEntityDef());
+ entityDefs.add(createColumnEntityDefWithMissingInverseAttribute());
- AtlasTransientTypeRegistry ttr = null;
- boolean commit = false;
+ try {
+ ttr = typeRegistry.lockTypeRegistryForUpdate();
+
+ ttr.addTypes(entityDefs);
+
+ commit = true;
+ } catch (AtlasBaseException excp) {
+ errorCode = excp.getAtlasErrorCode();
+ } finally {
+ typeRegistry.releaseTypeRegistryForUpdate(ttr, commit);
+ }
+ assertEquals(errorCode, AtlasErrorCode.CONSTRAINT_MISSING_PARAMS,
+ "expected invalid constraint failure - missing refAttribute");
+ }
+
+ @Test
+ public void testConstraintInValidInverseRef_InvalidAttributeTypeForInverseAttribute() {
+ AtlasTypeRegistry typeRegistry = new AtlasTypeRegistry();
+ AtlasTransientTypeRegistry ttr = null;
+ boolean commit = false;
+ List<AtlasEntityDef> entityDefs = new ArrayList<>();
+ AtlasErrorCode errorCode = null;
+
+ entityDefs.add(createTableEntityDef());
+ entityDefs.add(createColumnEntityDefWithInvaidAttributeTypeForInverseAttribute());
try {
ttr = typeRegistry.lockTypeRegistryForUpdate();
@@ -191,23 +231,24 @@ public class TestAtlasEntityType {
commit = true;
} catch (AtlasBaseException excp) {
- failureMsg = excp.getMessage();
+ errorCode = excp.getAtlasErrorCode();
} finally {
typeRegistry.releaseTypeRegistryForUpdate(ttr, commit);
}
- assertNotNull(failureMsg, "expected invalid constraint failure - unknown attribute in mappedFromRef");
+ assertEquals(errorCode, AtlasErrorCode.CONSTRAINT_INVERSE_REF_ATTRIBUTE_INVALID_TYPE,
+ "expected invalid constraint failure - missing refAttribute");
}
@Test
- public void testForeignKeyConstraintInValidMappedFromRef2() {
+ public void testConstraintInValidInverseRef_InvalidAttributeType() {
AtlasTypeRegistry typeRegistry = new AtlasTypeRegistry();
AtlasTransientTypeRegistry ttr = null;
boolean commit = false;
List<AtlasEntityDef> entityDefs = new ArrayList<>();
- String failureMsg = null;
+ AtlasErrorCode errorCode = null;
- entityDefs.add(createTableEntityDefWithMissingRefAttribute());
- entityDefs.add(createColumnEntityDef());
+ entityDefs.add(createTableEntityDef());
+ entityDefs.add(createColumnEntityDefWithInvalidInverseAttributeType());
try {
ttr = typeRegistry.lockTypeRegistryForUpdate();
@@ -216,22 +257,24 @@ public class TestAtlasEntityType {
commit = true;
} catch (AtlasBaseException excp) {
- failureMsg = excp.getMessage();
+ errorCode = excp.getAtlasErrorCode();
} finally {
typeRegistry.releaseTypeRegistryForUpdate(ttr, commit);
}
- assertNotNull(failureMsg, "expected invalid constraint failure - missing refAttribute in mappedFromRef");
+ assertEquals(errorCode, AtlasErrorCode.CONSTRAINT_INVERSE_REF_INVERSE_ATTRIBUTE_INVALID_TYPE,
+ "expected invalid constraint failure - invalid refAttribute type");
}
@Test
- public void testForeignKeyConstraintInValidForeignKey() {
+ public void testConstraintInValidInverseRef_NonExistingAttribute() {
AtlasTypeRegistry typeRegistry = new AtlasTypeRegistry();
AtlasTransientTypeRegistry ttr = null;
boolean commit = false;
List<AtlasEntityDef> entityDefs = new ArrayList<>();
- String failureMsg = null;
+ AtlasErrorCode errorCode = null;
- entityDefs.add(createColumnEntityDef());
+ entityDefs.add(createTableEntityDef());
+ entityDefs.add(createColumnEntityDefWithNonExistingInverseAttribute());
try {
ttr = typeRegistry.lockTypeRegistryForUpdate();
@@ -240,11 +283,12 @@ public class TestAtlasEntityType {
commit = true;
} catch (AtlasBaseException excp) {
- failureMsg = excp.getMessage();
+ errorCode = excp.getAtlasErrorCode();
} finally {
typeRegistry.releaseTypeRegistryForUpdate(ttr, commit);
}
- assertNotNull(failureMsg, "expected invalid constraint failure - unknown attribute in foreignKey");
+ assertEquals(errorCode, AtlasErrorCode.CONSTRAINT_INVERSE_REF_INVERSE_ATTRIBUTE_NON_EXISTING,
+ "expected invalid constraint failure - non-existing refAttribute");
}
private static AtlasEntityType getEntityType(AtlasEntityDef entityDef) {
@@ -257,37 +301,86 @@ public class TestAtlasEntityType {
private AtlasEntityDef createTableEntityDef() {
AtlasEntityDef table = new AtlasEntityDef(TYPE_TABLE);
+ AtlasAttributeDef attrName = new AtlasAttributeDef(ATTR_NAME, AtlasBaseTypeDef.ATLAS_TYPE_STRING);
AtlasAttributeDef attrColumns = new AtlasAttributeDef(ATTR_COLUMNS,
AtlasBaseTypeDef.getArrayTypeName(TYPE_COLUMN));
- Map<String, Object> params = new HashMap<>();
- params.put(AtlasConstraintDef.CONSTRAINT_PARAM_REF_ATTRIBUTE, ATTR_TABLE);
+ attrColumns.addConstraint(new AtlasConstraintDef(AtlasConstraintDef.CONSTRAINT_TYPE_OWNED_REF));
- attrColumns.addConstraint(new AtlasConstraintDef(AtlasConstraintDef.CONSTRAINT_TYPE_MAPPED_FROM_REF, params));
+ table.addAttribute(attrName);
table.addAttribute(attrColumns);
return table;
}
- private AtlasEntityDef createTableEntityDefWithMissingRefAttribute() {
- AtlasEntityDef table = new AtlasEntityDef(TYPE_TABLE);
- AtlasAttributeDef attrColumns = new AtlasAttributeDef(ATTR_COLUMNS,
- AtlasBaseTypeDef.getArrayTypeName(TYPE_COLUMN));
+ private AtlasEntityDef createTableEntityDefWithOwnedRefOnInvalidType() {
+ AtlasEntityDef table = new AtlasEntityDef(TYPE_TABLE);
+ AtlasAttributeDef attrName = new AtlasAttributeDef(ATTR_NAME, AtlasBaseTypeDef.ATLAS_TYPE_STRING);
- attrColumns.addConstraint(new AtlasConstraintDef(AtlasConstraintDef.CONSTRAINT_TYPE_MAPPED_FROM_REF, null));
- table.addAttribute(attrColumns);
+ attrName.addConstraint(new AtlasConstraintDef(AtlasConstraintDef.CONSTRAINT_TYPE_OWNED_REF));
+
+ table.addAttribute(attrName);
return table;
}
+ private AtlasEntityDef createColumnEntityDefWithMissingInverseAttribute() {
+ AtlasEntityDef column = new AtlasEntityDef(TYPE_COLUMN);
+ AtlasAttributeDef attrTable = new AtlasAttributeDef(ATTR_TABLE, TYPE_TABLE);
+
+ attrTable.addConstraint(new AtlasConstraintDef(AtlasConstraintDef.CONSTRAINT_TYPE_INVERSE_REF));
+ column.addAttribute(attrTable);
+
+ return column;
+ }
+
+ private AtlasEntityDef createColumnEntityDefWithInvaidAttributeTypeForInverseAttribute() {
+ AtlasEntityDef column = new AtlasEntityDef(TYPE_COLUMN);
+ AtlasAttributeDef attrTable = new AtlasAttributeDef(ATTR_NAME, AtlasBaseTypeDef.ATLAS_TYPE_STRING);
+
+ Map<String, Object> params = new HashMap<>();
+ params.put(AtlasConstraintDef.CONSTRAINT_PARAM_ATTRIBUTE, ATTR_NAME);
+
+ attrTable.addConstraint(new AtlasConstraintDef(AtlasConstraintDef.CONSTRAINT_TYPE_INVERSE_REF, params));
+ column.addAttribute(attrTable);
+
+ return column;
+ }
+
+ private AtlasEntityDef createColumnEntityDefWithNonExistingInverseAttribute() {
+ AtlasEntityDef column = new AtlasEntityDef(TYPE_COLUMN);
+ AtlasAttributeDef attrTable = new AtlasAttributeDef(ATTR_TABLE, TYPE_TABLE);
+
+ Map<String, Object> params = new HashMap<>();
+ params.put(AtlasConstraintDef.CONSTRAINT_PARAM_ATTRIBUTE, "non-existing:" + ATTR_COLUMNS);
+
+ attrTable.addConstraint(new AtlasConstraintDef(AtlasConstraintDef.CONSTRAINT_TYPE_INVERSE_REF, params));
+ column.addAttribute(attrTable);
+
+ return column;
+ }
+
+ private AtlasEntityDef createColumnEntityDefWithInvalidInverseAttributeType() {
+ AtlasEntityDef column = new AtlasEntityDef(TYPE_COLUMN);
+ AtlasAttributeDef attrTable = new AtlasAttributeDef(ATTR_TABLE, TYPE_TABLE);
+
+ Map<String, Object> params = new HashMap<>();
+ params.put(AtlasConstraintDef.CONSTRAINT_PARAM_ATTRIBUTE, ATTR_NAME);
+
+ attrTable.addConstraint(new AtlasConstraintDef(AtlasConstraintDef.CONSTRAINT_TYPE_INVERSE_REF, params));
+ column.addAttribute(attrTable);
+
+ return column;
+ }
+
private AtlasEntityDef createColumnEntityDef() {
AtlasEntityDef column = new AtlasEntityDef(TYPE_COLUMN);
AtlasAttributeDef attrTable = new AtlasAttributeDef(ATTR_TABLE, TYPE_TABLE);
Map<String, Object> params = new HashMap<>();
- params.put(AtlasConstraintDef.CONSTRAINT_PARAM_ON_DELETE, AtlasConstraintDef.CONSTRAINT_PARAM_VAL_CASCADE);
+ params.put(AtlasConstraintDef.CONSTRAINT_PARAM_ATTRIBUTE, ATTR_COLUMNS);
- attrTable.addConstraint(new AtlasConstraintDef(AtlasConstraintDef.CONSTRAINT_TYPE_FOREIGN_KEY, params));
+ attrTable.addConstraint(new AtlasConstraintDef(AtlasConstraintDef.CONSTRAINT_TYPE_INVERSE_REF, params));
column.addAttribute(attrTable);
return column;
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/48477e20/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasStructDefStoreV1.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasStructDefStoreV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasStructDefStoreV1.java
index 69cf60a..61314a6 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasStructDefStoreV1.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/AtlasStructDefStoreV1.java
@@ -52,11 +52,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_PARAM_ON_DELETE;
-import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_PARAM_VAL_CASCADE;
-import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_TYPE_FOREIGN_KEY;
-import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_TYPE_MAPPED_FROM_REF;
-
/**
* StructDef store in v1 format.
*/
@@ -502,19 +497,15 @@ public class AtlasStructDefStoreV1 extends AtlasAbstractDefStoreV1 implements At
@VisibleForTesting
public static String toJsonFromAttribute(AtlasAttribute attribute) {
- AtlasAttributeDef attributeDef = attribute.getAttributeDef();
- boolean isComposite = attribute.legacyIsComposite();
- String reverseAttribName = attribute.legacyReverseAttribute();
-
- Map<String, Object> attribInfo = new HashMap<>();
+ AtlasAttributeDef attributeDef = attribute.getAttributeDef();
+ Map<String, Object> attribInfo = new HashMap<>();
attribInfo.put("name", attributeDef.getName());
attribInfo.put("dataType", attributeDef.getTypeName());
attribInfo.put("isUnique", attributeDef.getIsUnique());
attribInfo.put("isIndexable", attributeDef.getIsIndexable());
- attribInfo.put("isComposite", isComposite);
- attribInfo.put("reverseAttributeName", reverseAttribName);
- attribInfo.put("isForeignKeyWithOnDeleteCascade", attribute.isForeignKeyWithOnDeleteCascade());
+ attribInfo.put("isComposite", attribute.isOwnedRef());
+ attribInfo.put("reverseAttributeName", attribute.getInverseRefAttribute());
final int lower;
final int upper;
@@ -554,111 +545,16 @@ public class AtlasStructDefStoreV1 extends AtlasAbstractDefStoreV1 implements At
ret.setIsUnique((Boolean) attribInfo.get("isUnique"));
ret.setIsIndexable((Boolean) attribInfo.get("isIndexable"));
- String attrTypeName = ret.getTypeName();
-
- if (AtlasTypeUtil.isArrayType(attrTypeName)) {
- Set<String> typeNames = AtlasTypeUtil.getReferencedTypeNames(attrTypeName);
-
- if (typeNames.size() > 0) {
- attrTypeName = typeNames.iterator().next();
- }
+ if ((Boolean)attribInfo.get("isComposite")) {
+ ret.addConstraint(new AtlasConstraintDef(AtlasConstraintDef.CONSTRAINT_TYPE_OWNED_REF));
}
- if (!AtlasTypeUtil.isBuiltInType(attrTypeName)) {
- AtlasVertex attributeType = typeDefStore.findTypeVertexByName(attrTypeName);
-
- /* determine constraints to add to this attribute
- - add mappedFromRef if attribute-type has an attribute that refers to this attribute via reverseAttributeName
- example: hive_table.sd referenced from hive_storagedesc.table with reverseAttributeName=sd
- - add foreignKey(onDelete=cascade) if attribute-type has an attribute that refers to this struct with isComposite=true
- example: hive_storagedesc referenced from hive_table.sd with isComposite=true
- example: hive_column referenced from hive_table.columns with isComposite=true
- */
- if (attributeType != null && typeDefStore.isTypeVertex(attributeType, TypeCategory.CLASS)) {
- boolean attributeTypeHasIsCompositeRef = false;
- String attributeTypeRevAttribRefFrom = null;
-
- List<String> attrNames = attributeType.getProperty(AtlasGraphUtilsV1.getTypeDefPropertyKey(attrTypeName), List.class);
-
- if (CollectionUtils.isNotEmpty(attrNames)) {
- for (String attrName : attrNames) {
- String attribJson = attributeType.getProperty(
- AtlasGraphUtilsV1.getTypeDefPropertyKey(attrTypeName, attrName), String.class);
-
- if (StringUtils.isBlank(attribJson)) {
- continue;
- }
-
- Map refAttrInfo = AtlasType.fromJson(attribJson, Map.class);
-
- if (refAttrInfo == null) {
- continue;
- }
-
- String refAttribType = (String) refAttrInfo.get("dataType");
-
- if (AtlasTypeUtil.isArrayType(refAttribType)) {
- Set<String> typeNames = AtlasTypeUtil.getReferencedTypeNames(refAttribType);
-
- if (typeNames.size() > 0) {
- refAttribType = typeNames.iterator().next();
- }
- }
-
- if (!StringUtils.equals(refAttribType, structDef.getName())) {
- continue;
- }
-
- if (StringUtils.isBlank(attributeTypeRevAttribRefFrom)) {
- String refAttribRevAttribName = (String) refAttrInfo.get("reverseAttributeName");
-
- if (StringUtils.equals(refAttribRevAttribName, ret.getName())) {
- attributeTypeRevAttribRefFrom = (String) refAttrInfo.get("name");
- }
- }
-
- if (!attributeTypeHasIsCompositeRef) {
- Object val = refAttrInfo.get("isComposite");
-
- if (val instanceof Boolean) {
- attributeTypeHasIsCompositeRef = (Boolean) val;
- } if (val != null) {
- attributeTypeHasIsCompositeRef = Boolean.parseBoolean(val.toString());
- }
- }
-
- if (StringUtils.isNotBlank(attributeTypeRevAttribRefFrom) && attributeTypeHasIsCompositeRef) {
- break;
- }
- }
- }
-
- boolean isForeignKeyWithOnDeleteCascade = attributeTypeHasIsCompositeRef;
-
- if (!isForeignKeyWithOnDeleteCascade) {
- Object val = attribInfo.get("isForeignKeyWithOnDeleteCascade");
-
- if (val instanceof Boolean) {
- isForeignKeyWithOnDeleteCascade = (Boolean) val;
- } else if (val != null) {
- isForeignKeyWithOnDeleteCascade = Boolean.parseBoolean(val.toString());
- }
- }
-
- if (StringUtils.isNotBlank(attributeTypeRevAttribRefFrom)) {
- Map<String, Object> params = new HashMap<>();
- params.put(AtlasConstraintDef.CONSTRAINT_PARAM_REF_ATTRIBUTE, attributeTypeRevAttribRefFrom);
-
- ret.addConstraint(new AtlasConstraintDef(CONSTRAINT_TYPE_MAPPED_FROM_REF, params));
- }
-
- if (isForeignKeyWithOnDeleteCascade) { // ex: hive_column.table
- Map<String, Object> params = new HashMap<>();
- params.put(CONSTRAINT_PARAM_ON_DELETE, CONSTRAINT_PARAM_VAL_CASCADE);
-
- ret.addConstraint(new AtlasConstraintDef(CONSTRAINT_TYPE_FOREIGN_KEY, params));
- }
- }
+ final String reverseAttributeName = (String) attribInfo.get("reverseAttributeName");
+ if (StringUtils.isNotBlank(reverseAttributeName)) {
+ ret.addConstraint(new AtlasConstraintDef(AtlasConstraintDef.CONSTRAINT_TYPE_INVERSE_REF,
+ new HashMap<String, Object>() {{
+ put(AtlasConstraintDef.CONSTRAINT_PARAM_ATTRIBUTE, reverseAttributeName);
+ }}));
}
Map multiplicity = AtlasType.fromJson((String) attribInfo.get("multiplicity"), Map.class);
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/48477e20/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerV1.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerV1.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerV1.java
index f507ae0..14013fb 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerV1.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/DeleteHandlerV1.java
@@ -139,7 +139,7 @@ public abstract class DeleteHandlerV1 {
}
for (AtlasStructType.AtlasAttribute attributeInfo : entityType.getAllAttributes().values()) {
- if (!entityType.isMappedFromRefAttribute(attributeInfo.getName())) {
+ if (! attributeInfo.isOwnedRef()) {
continue;
}
String edgeLabel = AtlasGraphUtilsV1.getAttributeEdgeLabel(entityType, attributeInfo.getName());
@@ -284,7 +284,7 @@ public abstract class DeleteHandlerV1 {
for (AtlasStructType.AtlasAttribute attributeInfo : getAttributes(structType)) {
LOG.debug("Deleting attribute {} for {}", attributeInfo.getName(), string(instanceVertex));
- boolean isComposite = isEntityType && ((AtlasEntityType)structType).isMappedFromRefAttribute(attributeInfo.getName());
+ boolean isComposite = isEntityType && attributeInfo.isOwnedRef();
AtlasType attrType = typeRegistry.getType(attributeInfo.getTypeName());
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/48477e20/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/StructVertexMapper.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/StructVertexMapper.java b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/StructVertexMapper.java
index 2e9e5e4..edcc12d 100644
--- a/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/StructVertexMapper.java
+++ b/repository/src/main/java/org/apache/atlas/repository/store/graph/v1/StructVertexMapper.java
@@ -88,7 +88,9 @@ public class StructVertexMapper implements InstanceGraphMapper<AtlasEdge> {
}
public static boolean shouldManageChildReferences(AtlasStructType type, String attributeName) {
- return (type instanceof AtlasEntityType) && ((AtlasEntityType)type).isMappedFromRefAttribute(attributeName);
+ AtlasStructType.AtlasAttribute attribute = type.getAttribute(attributeName);
+
+ return attribute != null ? attribute.isOwnedRef() : false;
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/48477e20/webapp/src/main/java/org/apache/atlas/examples/QuickStartV2.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/examples/QuickStartV2.java b/webapp/src/main/java/org/apache/atlas/examples/QuickStartV2.java
index d8202a5..0459061 100755
--- a/webapp/src/main/java/org/apache/atlas/examples/QuickStartV2.java
+++ b/webapp/src/main/java/org/apache/atlas/examples/QuickStartV2.java
@@ -63,11 +63,9 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_PARAM_ON_DELETE;
-import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_PARAM_REF_ATTRIBUTE;
-import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_PARAM_VAL_CASCADE;
-import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_TYPE_FOREIGN_KEY;
-import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_TYPE_MAPPED_FROM_REF;
+import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_TYPE_INVERSE_REF;
+import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_TYPE_OWNED_REF;
+import static org.apache.atlas.model.typedef.AtlasStructDef.AtlasConstraintDef.CONSTRAINT_PARAM_ATTRIBUTE;
/**
* A driver that sets up sample types and entities using v2 types and entity model for testing purposes.
@@ -217,8 +215,8 @@ public class QuickStartV2 {
AtlasTypeUtil.createOptionalAttrDef("createTime", "long"));
AtlasEntityDef sdType = AtlasTypeUtil.createClassTypeDef(STORAGE_DESC_TYPE, STORAGE_DESC_TYPE, "1.0", null,
- AtlasTypeUtil.createOptionalAttrDefWithConstraint("table", TABLE_TYPE, CONSTRAINT_TYPE_FOREIGN_KEY,
- new HashMap<String, Object>() {{ put(CONSTRAINT_PARAM_ON_DELETE, CONSTRAINT_PARAM_VAL_CASCADE); }}),
+ AtlasTypeUtil.createOptionalAttrDefWithConstraint("table", TABLE_TYPE, CONSTRAINT_TYPE_INVERSE_REF,
+ new HashMap<String, Object>() {{ put(CONSTRAINT_PARAM_ATTRIBUTE, "sd"); }}),
AtlasTypeUtil.createOptionalAttrDef("location", "string"),
AtlasTypeUtil.createOptionalAttrDef("inputFormat", "string"),
AtlasTypeUtil.createOptionalAttrDef("outputFormat", "string"),
@@ -228,15 +226,14 @@ public class QuickStartV2 {
AtlasTypeUtil.createOptionalAttrDef("name", "string"),
AtlasTypeUtil.createOptionalAttrDef("dataType", "string"),
AtlasTypeUtil.createOptionalAttrDef("comment", "string"),
- AtlasTypeUtil.createOptionalAttrDefWithConstraint("table", TABLE_TYPE, CONSTRAINT_TYPE_FOREIGN_KEY,
- new HashMap<String, Object>() {{ put(CONSTRAINT_PARAM_ON_DELETE, CONSTRAINT_PARAM_VAL_CASCADE); }}));
+ AtlasTypeUtil.createOptionalAttrDefWithConstraint("table", TABLE_TYPE, CONSTRAINT_TYPE_INVERSE_REF,
+ new HashMap<String, Object>() {{ put(CONSTRAINT_PARAM_ATTRIBUTE, "table"); }}));
colType.setOptions(new HashMap<String, String>() {{ put("schemaAttributes", "[\"name\", \"description\", \"owner\", \"type\", \"comment\", \"position\"]"); }});
AtlasEntityDef tblType = AtlasTypeUtil.createClassTypeDef(TABLE_TYPE, TABLE_TYPE, "1.0", ImmutableSet.of("DataSet"),
AtlasTypeUtil.createRequiredAttrDef("db", DATABASE_TYPE),
- AtlasTypeUtil.createRequiredAttrDefWithConstraint("sd", STORAGE_DESC_TYPE, CONSTRAINT_TYPE_MAPPED_FROM_REF,
- new HashMap<String, Object>() {{ put(CONSTRAINT_PARAM_REF_ATTRIBUTE, "table"); }}),
+ AtlasTypeUtil.createRequiredAttrDefWithConstraint("sd", STORAGE_DESC_TYPE, CONSTRAINT_TYPE_OWNED_REF, null),
AtlasTypeUtil.createOptionalAttrDef("owner", "string"),
AtlasTypeUtil.createOptionalAttrDef("createTime", "long"),
AtlasTypeUtil.createOptionalAttrDef("lastAccessTime", "long"),
@@ -246,7 +243,7 @@ public class QuickStartV2 {
AtlasTypeUtil.createOptionalAttrDef("tableType", "string"),
AtlasTypeUtil.createOptionalAttrDef("temporary", "boolean"),
AtlasTypeUtil.createRequiredListAttrDefWithConstraint("columns", AtlasBaseTypeDef.getArrayTypeName(COLUMN_TYPE),
- CONSTRAINT_TYPE_MAPPED_FROM_REF, new HashMap<String, Object>() {{ put(CONSTRAINT_PARAM_REF_ATTRIBUTE, "table"); }}));
+ CONSTRAINT_TYPE_OWNED_REF, null));
tblType.setOptions(new HashMap<String, String>() {{ put("schemaElementsAttribute", "columns"); }});