This is an automated email from the ASF dual-hosted git repository.

madhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/atlas.git


The following commit(s) were added to refs/heads/master by this push:
     new 5d99c40  ATLAS-3056: updated rdbms types to remove use of 
ownedRef/inverseRef - #2
5d99c40 is described below

commit 5d99c40a51d910d3858d4d25e321afad5f12996d
Author: Madhan Neethiraj <mad...@apache.org>
AuthorDate: Wed Mar 6 08:04:05 2019 -0800

    ATLAS-3056: updated rdbms types to remove use of ownedRef/inverseRef - #2
---
 addons/models/2000-RDBMS/2010-rdbms_model.json     | 167 +++++++++++++++++++--
 .../003-remove-rdbms-legacy-attributes.json        |  90 +++++++++++
 .../apache/atlas/model/instance/AtlasStruct.java   |   6 +-
 .../bootstrap/AtlasTypeDefStoreInitializer.java    |  25 ++-
 .../graph/v2/AtlasRelationshipDefStoreV2.java      |  11 +-
 .../notification/NotificationHookConsumer.java     |   2 +-
 .../preprocessor/PreprocessorContext.java          |  86 ++++++++---
 .../preprocessor/RdbmsPreprocessor.java            |  28 ++--
 8 files changed, 350 insertions(+), 65 deletions(-)

diff --git a/addons/models/2000-RDBMS/2010-rdbms_model.json 
b/addons/models/2000-RDBMS/2010-rdbms_model.json
index d4e1805..e72e13a 100644
--- a/addons/models/2000-RDBMS/2010-rdbms_model.json
+++ b/addons/models/2000-RDBMS/2010-rdbms_model.json
@@ -73,6 +73,19 @@
                     "cardinality": "SINGLE",
                     "isUnique": false,
                     "isIndexable": false
+                },
+                {
+                    "name": "databases",
+                    "typeName": "array<rdbms_db>",
+                    "isOptional": true,
+                    "cardinality": "SET",
+                    "isUnique": false,
+                    "isIndexable": false,
+                    "constraints": [
+                       {
+                          "type": "ownedRef"
+                       }
+                    ]
                 }
             ]
         },
@@ -92,12 +105,41 @@
                     "isIndexable": true
                 },
                 {
+                    "name": "instance",
+                    "typeName": "rdbms_instance",
+                    "isOptional": true,
+                    "cardinality": "SINGLE",
+                    "isUnique": false,
+                    "isIndexable": false,
+                    "constraints": [
+                       {
+                           "type": "inverseRef",
+                           "params": {
+                               "attribute": "databases"
+                           }
+                       }
+                    ]
+                },
+                {
                     "name": "contact_info",
                     "typeName": "string",
                     "isOptional": true,
                     "cardinality": "SINGLE",
                     "isUnique": false,
                     "isIndexable": false
+                },
+                {
+                    "name": "tables",
+                    "typeName": "array<rdbms_table>",
+                    "isOptional": true,
+                    "cardinality": "SET",
+                    "isUnique": false,
+                    "isIndexable": false,
+                    "constraints": [
+                       {
+                           "type": "ownedRef"
+                       }
+                    ]
                 }
             ]
         },
@@ -109,6 +151,22 @@
             "typeVersion": "1.1",
             "attributeDefs": [
                 {
+                    "name": "db",
+                    "typeName": "rdbms_db",
+                    "isOptional": true,
+                    "cardinality": "SINGLE",
+                    "isUnique": false,
+                    "isIndexable": false,
+                    "constraints": [
+                       {
+                           "type": "inverseRef",
+                           "params": {
+                               "attribute": "tables"
+                           }
+                       }
+                    ]
+                },
+                {
                     "name": "name_path",
                     "typeName": "string",
                     "isOptional": true,
@@ -149,6 +207,45 @@
                     "valuesMaxCount": 1,
                     "isUnique": false,
                     "isIndexable": false
+                },
+                {
+                    "name": "columns",
+                    "typeName": "array<rdbms_column>",
+                    "isOptional": true,
+                    "cardinality": "SET",
+                    "isUnique": false,
+                    "isIndexable": false,
+                    "constraints": [
+                        {
+                            "type": "ownedRef"
+                        }
+                    ]
+                },
+                {
+                    "name": "indexes",
+                    "typeName": "array<rdbms_index>",
+                    "isOptional": true,
+                    "cardinality": "SET",
+                    "isUnique": false,
+                    "isIndexable": false,
+                    "constraints": [
+                        {
+                            "type": "ownedRef"
+                        }
+                    ]
+                },
+                {
+                    "name": "foreign_keys",
+                    "typeName": "array<rdbms_foreign_key>",
+                    "isOptional": true,
+                    "cardinality": "SET",
+                    "isUnique": false,
+                    "isIndexable": false,
+                    "constraints": [
+                        {
+                            "type": "ownedRef"
+                        }
+                    ]
                 }
             ]
         },
@@ -192,6 +289,22 @@
                     "isIndexable": false
                 },
                 {
+                    "name": "table",
+                    "typeName": "rdbms_table",
+                    "isOptional": true,
+                    "cardinality": "SINGLE",
+                    "isUnique": false,
+                    "isIndexable": false,
+                    "constraints": [
+                       {
+                        "type": "inverseRef",
+                        "params": {
+                            "attribute": "columns"
+                        }
+                    }
+                    ]
+                },
+                {
                     "name": "isNullable",
                     "typeName": "boolean",
                     "isOptional": true,
@@ -217,6 +330,22 @@
             "typeVersion": "1.1",
             "attributeDefs": [
                 {
+                    "name": "table",
+                    "typeName": "rdbms_table",
+                    "isOptional": true,
+                    "cardinality": "SINGLE",
+                    "isUnique": false,
+                    "isIndexable": false,
+                    "constraints": [
+                        {
+                            "type": "inverseRef",
+                            "params": {
+                                "attribute": "indexes"
+                            }
+                        }
+                    ]
+                },
+                {
                     "name": "index_type",
                     "typeName": "string",
                     "isOptional": true,
@@ -258,6 +387,14 @@
             "typeVersion": "1.1",
             "attributeDefs": [
                 {
+                    "name": "table",
+                    "typeName": "rdbms_table",
+                    "isOptional": true,
+                    "cardinality": "SINGLE",
+                    "isUnique": false,
+                    "isIndexable": false
+                },
+                {
                     "name": "key_columns",
                     "typeName": "array<rdbms_column>",
                     "isOptional": true,
@@ -289,20 +426,20 @@
             "name": "rdbms_instance_databases",
             "serviceType": "rdbms",
             "typeVersion": "1.0",
-            "relationshipCategory": "COMPOSITION",
+            "relationshipCategory": "AGGREGATION",
             "endDef1": {
                 "type": "rdbms_instance",
                 "name": "databases",
                 "isContainer": true,
                 "cardinality": "SET",
-                "isLegacyAttribute": false
+                "isLegacyAttribute": true
             },
             "endDef2": {
                 "type": "rdbms_db",
                 "name": "instance",
                 "isContainer": false,
                 "cardinality": "SINGLE",
-                "isLegacyAttribute": false
+                "isLegacyAttribute": true
             },
             "propagateTags": "NONE"
         },
@@ -310,20 +447,20 @@
             "name": "rdbms_db_tables",
             "serviceType": "rdbms",
             "typeVersion": "1.0",
-            "relationshipCategory": "COMPOSITION",
+            "relationshipCategory": "AGGREGATION",
             "endDef1": {
                 "type": "rdbms_db",
                 "name": "tables",
                 "isContainer": true,
                 "cardinality": "SET",
-                "isLegacyAttribute": false
+                "isLegacyAttribute": true
             },
             "endDef2": {
                 "type": "rdbms_table",
                 "name": "db",
                 "isContainer": false,
                 "cardinality": "SINGLE",
-                "isLegacyAttribute": false
+                "isLegacyAttribute": true
             },
             "propagateTags": "NONE"
         },
@@ -331,20 +468,20 @@
             "name": "rdbms_table_columns",
             "serviceType": "rdbms",
             "typeVersion": "1.0",
-            "relationshipCategory": "COMPOSITION",
+            "relationshipCategory": "AGGREGATION",
             "endDef1": {
                 "type": "rdbms_table",
                 "name": "columns",
                 "isContainer": true,
                 "cardinality": "SET",
-                "isLegacyAttribute": false
+                "isLegacyAttribute": true
             },
             "endDef2": {
                 "type": "rdbms_column",
                 "name": "table",
                 "isContainer": false,
                 "cardinality": "SINGLE",
-                "isLegacyAttribute": false
+                "isLegacyAttribute": true
             },
             "propagateTags": "NONE"
         },
@@ -352,20 +489,20 @@
             "name": "rdbms_table_indexes",
             "serviceType": "rdbms",
             "typeVersion": "1.0",
-            "relationshipCategory": "COMPOSITION",
+            "relationshipCategory": "AGGREGATION",
             "endDef1": {
                 "type": "rdbms_table",
                 "name": "indexes",
                 "isContainer": true,
                 "cardinality": "SET",
-                "isLegacyAttribute": false
+                "isLegacyAttribute": true
             },
             "endDef2": {
                 "type": "rdbms_index",
                 "name": "table",
                 "isContainer": false,
                 "cardinality": "SINGLE",
-                "isLegacyAttribute": false
+                "isLegacyAttribute": true
             },
             "propagateTags": "NONE"
         },
@@ -394,20 +531,20 @@
             "name": "rdbms_table_foreign_key",
             "serviceType": "rdbms",
             "typeVersion": "1.0",
-            "relationshipCategory": "COMPOSITION",
+            "relationshipCategory": "AGGREGATION",
             "endDef1": {
                 "type": "rdbms_table",
                 "name": "foreign_keys",
                 "isContainer": true,
                 "cardinality": "SET",
-                "isLegacyAttribute": false
+                "isLegacyAttribute": true
             },
             "endDef2": {
                 "type": "rdbms_foreign_key",
                 "name": "table",
                 "isContainer": false,
                 "cardinality": "SINGLE",
-                "isLegacyAttribute": false
+                "isLegacyAttribute": true
             },
             "propagateTags": "NONE"
         },
diff --git 
a/addons/models/2000-RDBMS/patches/003-remove-rdbms-legacy-attributes.json 
b/addons/models/2000-RDBMS/patches/003-remove-rdbms-legacy-attributes.json
new file mode 100644
index 0000000..d087c66
--- /dev/null
+++ b/addons/models/2000-RDBMS/patches/003-remove-rdbms-legacy-attributes.json
@@ -0,0 +1,90 @@
+{
+  "patches": [
+    {
+      "action":          "REMOVE_LEGACY_ATTRIBUTES",
+      "typeName":        "rdbms_instance_databases",
+      "applyToVersion":  "1.0",
+      "updateToVersion": "1.1",
+      "params": {
+        "relationshipLabel":    "__rdbms_instance.databases",
+        "relationshipCategory": "COMPOSITION"
+      }
+    },
+    {
+      "action":          "REMOVE_LEGACY_ATTRIBUTES",
+      "typeName":        "rdbms_db_tables",
+      "applyToVersion":  "1.0",
+      "updateToVersion": "1.1",
+      "params": {
+        "relationshipLabel":    "__rdbms_db.tables",
+        "relationshipCategory": "COMPOSITION"
+      }
+    },
+    {
+      "action":          "REMOVE_LEGACY_ATTRIBUTES",
+      "typeName":        "rdbms_table_columns",
+      "applyToVersion":  "1.0",
+      "updateToVersion": "1.1",
+      "params": {
+        "relationshipLabel":    "__rdbms_table.columns",
+        "relationshipCategory": "COMPOSITION"
+      }
+    },
+    {
+      "action":          "REMOVE_LEGACY_ATTRIBUTES",
+      "typeName":        "rdbms_table_indexes",
+      "applyToVersion":  "1.0",
+      "updateToVersion": "1.1",
+      "params": {
+        "relationshipLabel":    "__rdbms_table.indexes",
+        "relationshipCategory": "COMPOSITION"
+      }
+    },
+    {
+      "action":          "REMOVE_LEGACY_ATTRIBUTES",
+      "typeName":        "rdbms_table_foreign_key",
+      "applyToVersion":  "1.0",
+      "updateToVersion": "1.1",
+      "params": {
+        "relationshipLabel":    "__rdbms_table.foreign_keys",
+        "relationshipCategory": "COMPOSITION"
+      }
+    },
+    {
+      "action":          "REMOVE_LEGACY_ATTRIBUTES",
+      "typeName":        "rdbms_index_columns",
+      "applyToVersion":  "1.0",
+      "updateToVersion": "1.1",
+      "params": {
+        "relationshipLabel": "__rdbms_index.columns"
+      }
+    },
+    {
+      "action":          "REMOVE_LEGACY_ATTRIBUTES",
+      "typeName":        "rdbms_foreign_key_key_columns",
+      "applyToVersion":  "1.0",
+      "updateToVersion": "1.1",
+      "params": {
+        "relationshipLabel": "__rdbms_foreign_key.key_columns"
+      }
+    },
+    {
+      "action":          "REMOVE_LEGACY_ATTRIBUTES",
+      "typeName":        "rdbms_foreign_key_table_references",
+      "applyToVersion":  "1.0",
+      "updateToVersion": "1.1",
+      "params": {
+        "relationshipLabel": "__rdbms_foreign_key.references_table"
+      }
+    },
+    {
+      "action":          "REMOVE_LEGACY_ATTRIBUTES",
+      "typeName":        "rdbms_foreign_key_column_references",
+      "applyToVersion":  "1.0",
+      "updateToVersion": "1.1",
+      "params": {
+        "relationshipLabel": "__rdbms_foreign_key.references_columns"
+      }
+    }
+  ]
+}
diff --git 
a/intg/src/main/java/org/apache/atlas/model/instance/AtlasStruct.java 
b/intg/src/main/java/org/apache/atlas/model/instance/AtlasStruct.java
index 18e7407..027b160 100644
--- a/intg/src/main/java/org/apache/atlas/model/instance/AtlasStruct.java
+++ b/intg/src/main/java/org/apache/atlas/model/instance/AtlasStruct.java
@@ -147,12 +147,10 @@ public class AtlasStruct implements Serializable {
         }
     }
 
-    public void removeAttribute(String name) {
+    public Object removeAttribute(String name) {
         Map<String, Object> a = this.attributes;
 
-        if (a != null && a.containsKey(name)) {
-            a.remove(name);
-        }
+        return a != null ? a.remove(name) : null;
     }
 
     public StringBuilder toString(StringBuilder sb) {
diff --git 
a/repository/src/main/java/org/apache/atlas/repository/store/bootstrap/AtlasTypeDefStoreInitializer.java
 
b/repository/src/main/java/org/apache/atlas/repository/store/bootstrap/AtlasTypeDefStoreInitializer.java
index a86282e..d12284e 100644
--- 
a/repository/src/main/java/org/apache/atlas/repository/store/bootstrap/AtlasTypeDefStoreInitializer.java
+++ 
b/repository/src/main/java/org/apache/atlas/repository/store/bootstrap/AtlasTypeDefStoreInitializer.java
@@ -35,6 +35,7 @@ import org.apache.atlas.model.typedef.AtlasEntityDef;
 import org.apache.atlas.model.typedef.AtlasEnumDef;
 import org.apache.atlas.model.typedef.AtlasEnumDef.AtlasEnumElementDef;
 import org.apache.atlas.model.typedef.AtlasRelationshipDef;
+import 
org.apache.atlas.model.typedef.AtlasRelationshipDef.RelationshipCategory;
 import org.apache.atlas.model.typedef.AtlasRelationshipEndDef;
 import org.apache.atlas.model.typedef.AtlasStructDef;
 import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
@@ -77,8 +78,9 @@ import static 
com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.PUBLIC_
 @Service
 public class AtlasTypeDefStoreInitializer implements ActiveStateChangeHandler {
     private static final Logger LOG = 
LoggerFactory.getLogger(AtlasTypeDefStoreInitializer.class);
-    public static final String PATCHES_FOLDER_NAME = "patches";
-    public static final String RELATIONSHIP_LABEL  = "relationshipLabel";
+    public static final String PATCHES_FOLDER_NAME   = "patches";
+    public static final String RELATIONSHIP_LABEL    = "relationshipLabel";
+    public static final String RELATIONSHIP_CATEGORY = "relationshipCategory";
 
     private final AtlasTypeDefStore atlasTypeDefStore;
     private final AtlasTypeRegistry atlasTypeRegistry;
@@ -730,13 +732,19 @@ public class AtlasTypeDefStoreInitializer implements 
ActiveStateChangeHandler {
                     AtlasEntityType         end1Type        = 
typeRegistry.getEntityTypeByName(end1Def.getType());
                     AtlasEntityType         end2Type        = 
typeRegistry.getEntityTypeByName(end2Def.getType());
 
-                    String newRelationshipLabel = null;
+                    String               newRelationshipLabel    = null;
+                    RelationshipCategory newRelationshipCategory = null;
 
                     if (patch.getParams() != null) {
-                        Object val = patch.getParams().get(RELATIONSHIP_LABEL);
+                        Object relLabel    = 
patch.getParams().get(RELATIONSHIP_LABEL);
+                        Object relCategory = 
patch.getParams().get(RELATIONSHIP_CATEGORY);
 
-                        if (val != null) {
-                            newRelationshipLabel = val.toString();
+                        if (relLabel != null) {
+                            newRelationshipLabel = relLabel.toString();
+                        }
+
+                        if (relCategory != null) {
+                            newRelationshipCategory = 
RelationshipCategory.valueOf(relCategory.toString());
                         }
                     }
 
@@ -763,6 +771,11 @@ public class AtlasTypeDefStoreInitializer implements 
ActiveStateChangeHandler {
                     AtlasEntityDef       updatedEntityDef2 = new 
AtlasEntityDef(end2Type.getEntityDef());
 
                     updatedDef.setRelationshipLabel(newRelationshipLabel);
+
+                    if (newRelationshipCategory != null) {
+                        
updatedDef.setRelationshipCategory(newRelationshipCategory);
+                    }
+
                     updatedDef.getEndDef1().setIsLegacyAttribute(false);
                     updatedDef.getEndDef2().setIsLegacyAttribute(false);
                     updatedDef.setTypeVersion(patch.getUpdateToVersion());
diff --git 
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasRelationshipDefStoreV2.java
 
b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasRelationshipDefStoreV2.java
index bfee34e..35d0577 100644
--- 
a/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasRelationshipDefStoreV2.java
+++ 
b/repository/src/main/java/org/apache/atlas/repository/store/graph/v2/AtlasRelationshipDefStoreV2.java
@@ -20,6 +20,7 @@ package org.apache.atlas.repository.store.graph.v2;
 import org.apache.atlas.ApplicationProperties;
 import org.apache.atlas.AtlasErrorCode;
 import org.apache.atlas.AtlasException;
+import org.apache.atlas.RequestContext;
 import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.model.typedef.AtlasRelationshipDef;
 import 
org.apache.atlas.model.typedef.AtlasRelationshipDef.RelationshipCategory;
@@ -425,9 +426,13 @@ public class AtlasRelationshipDefStoreV2 extends 
AtlasAbstractDefStoreV2<AtlasRe
         RelationshipCategory newRelationshipCategory      = 
newRelationshipDef.getRelationshipCategory();
 
         if ( !existingRelationshipCategory.equals(newRelationshipCategory)){
-            throw new 
AtlasBaseException(AtlasErrorCode.RELATIONSHIPDEF_INVALID_CATEGORY_UPDATE,
-                    
newRelationshipDef.getName(),newRelationshipCategory.name(),
-                    existingRelationshipCategory.name() );
+            if (!RequestContext.get().isInTypePatching()) {
+                throw new 
AtlasBaseException(AtlasErrorCode.RELATIONSHIPDEF_INVALID_CATEGORY_UPDATE,
+                        newRelationshipDef.getName(), 
newRelationshipCategory.name(),
+                        existingRelationshipCategory.name());
+            } else {
+                LOG.warn("RELATIONSHIP UPDATE: relationship category from {} 
to {} for {}", existingRelationshipCategory.name(), 
newRelationshipCategory.name(), newRelationshipDef.getName());
+            }
         }
 
         AtlasRelationshipEndDef existingEnd1 = 
existingRelationshipDef.getEndDef1();
diff --git 
a/webapp/src/main/java/org/apache/atlas/notification/NotificationHookConsumer.java
 
b/webapp/src/main/java/org/apache/atlas/notification/NotificationHookConsumer.java
index e9a0151..50559dd 100644
--- 
a/webapp/src/main/java/org/apache/atlas/notification/NotificationHookConsumer.java
+++ 
b/webapp/src/main/java/org/apache/atlas/notification/NotificationHookConsumer.java
@@ -792,7 +792,7 @@ public class NotificationHookConsumer implements Service, 
ActiveStateChangeHandl
             return;
         }
 
-        PreprocessorContext context = new PreprocessorContext(kafkaMsg, 
hiveTablesToIgnore, hiveTablesToPrune, hiveTablesCache);
+        PreprocessorContext context = new PreprocessorContext(kafkaMsg, 
hiveTablesToIgnore, hiveTablesToPrune, hiveTablesCache, 
rdbmsTypesRemoveOwnedRefAttrs);
 
         if (!hiveTablesToIgnore.isEmpty() || !hiveTablesToPrune.isEmpty()) {
             ignoreOrPruneHiveTables(context);
diff --git 
a/webapp/src/main/java/org/apache/atlas/notification/preprocessor/PreprocessorContext.java
 
b/webapp/src/main/java/org/apache/atlas/notification/preprocessor/PreprocessorContext.java
index 2d2c09a..0f95fba 100644
--- 
a/webapp/src/main/java/org/apache/atlas/notification/preprocessor/PreprocessorContext.java
+++ 
b/webapp/src/main/java/org/apache/atlas/notification/preprocessor/PreprocessorContext.java
@@ -44,15 +44,17 @@ public class PreprocessorContext {
     private final List<Pattern>                       hiveTablesToIgnore;
     private final List<Pattern>                       hiveTablesToPrune;
     private final Map<String, PreprocessAction>       hiveTablesCache;
+    private final boolean                             
rdbmsTypesRemoveOwnedRefAttrs;
     private final Set<String>                         ignoredEntities        = 
new HashSet<>();
     private final Set<String>                         prunedEntities         = 
new HashSet<>();
     private final Set<String>                         referredEntitiesToMove = 
new HashSet<>();
 
-    public PreprocessorContext(AtlasKafkaMessage<HookNotification> 
kafkaMessage, List<Pattern> hiveTablesToIgnore, List<Pattern> 
hiveTablesToPrune, Map<String, PreprocessAction> hiveTablesCache) {
-        this.kafkaMessage       = kafkaMessage;
-        this.hiveTablesToIgnore = hiveTablesToIgnore;
-        this.hiveTablesToPrune  = hiveTablesToPrune;
-        this.hiveTablesCache    = hiveTablesCache;
+    public PreprocessorContext(AtlasKafkaMessage<HookNotification> 
kafkaMessage, List<Pattern> hiveTablesToIgnore, List<Pattern> 
hiveTablesToPrune, Map<String, PreprocessAction> hiveTablesCache, boolean 
rdbmsTypesRemoveOwnedRefAttrs) {
+        this.kafkaMessage                  = kafkaMessage;
+        this.hiveTablesToIgnore            = hiveTablesToIgnore;
+        this.hiveTablesToPrune             = hiveTablesToPrune;
+        this.hiveTablesCache               = hiveTablesCache;
+        this.rdbmsTypesRemoveOwnedRefAttrs = rdbmsTypesRemoveOwnedRefAttrs;
 
         final HookNotification  message = kafkaMessage.getMessage();
 
@@ -83,6 +85,8 @@ public class PreprocessorContext {
         return kafkaMessage.getPartition();
     }
 
+    public boolean getRdbmsTypesRemoveOwnedRefAttrs() { return 
rdbmsTypesRemoveOwnedRefAttrs; }
+
     public List<AtlasEntity> getEntities() {
         return entitiesWithExtInfo != null ? entitiesWithExtInfo.getEntities() 
: null;
     }
@@ -95,6 +99,12 @@ public class PreprocessorContext {
         return entitiesWithExtInfo != null && guid != null ? 
entitiesWithExtInfo.getEntity(guid) : null;
     }
 
+    public AtlasEntity removeReferredEntity(String guid) {
+        Map<String, AtlasEntity> referredEntities = getReferredEntities();
+
+        return referredEntities != null && guid != null ? 
referredEntities.remove(guid) : null;
+    }
+
     public Set<String> getIgnoredEntities() { return ignoredEntities; }
 
     public Set<String> getPrunedEntities() { return prunedEntities; }
@@ -165,6 +175,14 @@ public class PreprocessorContext {
         }
     }
 
+    public void addToReferredEntitiesToMove(Collection<String> guids) {
+        if (guids != null) {
+            for (String guid : guids) {
+                addToReferredEntitiesToMove(guid);
+            }
+        }
+    }
+
     public void addToIgnoredEntities(Object obj) {
         collectGuids(obj, ignoredEntities);
     }
@@ -173,6 +191,14 @@ public class PreprocessorContext {
         collectGuids(obj, prunedEntities);
     }
 
+    public void removeRefAttributeAndRegisterToMove(AtlasEntity entity, String 
attrName) {
+        Set<String> guidsToMove = new HashSet<>();
+
+        collectGuids(entity.removeAttribute(attrName), guidsToMove);
+
+        addToReferredEntitiesToMove(guidsToMove);
+    }
+
     public void moveRegisteredReferredEntities() {
         List<AtlasEntity>        entities         = getEntities();
         Map<String, AtlasEntity> referredEntities = getReferredEntities();
@@ -202,38 +228,39 @@ public class PreprocessorContext {
         }
     }
 
-    public String getGuid(Object obj) {
+    public String getTypeName(Object obj) {
         Object ret = null;
 
         if (obj instanceof AtlasObjectId) {
-            ret = ((AtlasObjectId) obj).getGuid();
+            ret = ((AtlasObjectId) obj).getTypeName();
         } else if (obj instanceof Map) {
-            ret = ((Map) obj).get(AtlasObjectId.KEY_GUID);
+            ret = ((Map) obj).get(AtlasObjectId.KEY_TYPENAME);
         } else if (obj instanceof AtlasEntity) {
-            ret = ((AtlasEntity) obj).getGuid();
+            ret = ((AtlasEntity) obj).getTypeName();
         } else if (obj instanceof AtlasEntity.AtlasEntityWithExtInfo) {
-            ret = ((AtlasEntity.AtlasEntityWithExtInfo) 
obj).getEntity().getGuid();
+            ret = ((AtlasEntity.AtlasEntityWithExtInfo) 
obj).getEntity().getTypeName();
         }
 
         return ret != null ? ret.toString() : null;
     }
 
+    public String getGuid(Object obj) {
+        Object ret = null;
 
-    private boolean isMatch(String name, List<Pattern> patterns) {
-        boolean ret = false;
-
-        for (Pattern p : patterns) {
-            if (p.matcher(name).matches()) {
-                ret = true;
-
-                break;
-            }
+        if (obj instanceof AtlasObjectId) {
+            ret = ((AtlasObjectId) obj).getGuid();
+        } else if (obj instanceof Map) {
+            ret = ((Map) obj).get(AtlasObjectId.KEY_GUID);
+        } else if (obj instanceof AtlasEntity) {
+            ret = ((AtlasEntity) obj).getGuid();
+        } else if (obj instanceof AtlasEntity.AtlasEntityWithExtInfo) {
+            ret = ((AtlasEntity.AtlasEntityWithExtInfo) 
obj).getEntity().getGuid();
         }
 
-        return ret;
+        return ret != null ? ret.toString() : null;
     }
 
-    private void collectGuids(Object obj, Set<String> guids) {
+    public void collectGuids(Object obj, Set<String> guids) {
         if (obj != null) {
             if (obj instanceof Collection) {
                 Collection objList = (Collection) obj;
@@ -247,11 +274,26 @@ public class PreprocessorContext {
         }
     }
 
-    private void collectGuid(Object obj, Set<String> guids) {
+    public void collectGuid(Object obj, Set<String> guids) {
         String guid = getGuid(obj);
 
         if (guid != null) {
             guids.add(guid);
         }
     }
+
+
+    private boolean isMatch(String name, List<Pattern> patterns) {
+        boolean ret = false;
+
+        for (Pattern p : patterns) {
+            if (p.matcher(name).matches()) {
+                ret = true;
+
+                break;
+            }
+        }
+
+        return ret;
+    }
 }
diff --git 
a/webapp/src/main/java/org/apache/atlas/notification/preprocessor/RdbmsPreprocessor.java
 
b/webapp/src/main/java/org/apache/atlas/notification/preprocessor/RdbmsPreprocessor.java
index 3933cc6..adc1983 100644
--- 
a/webapp/src/main/java/org/apache/atlas/notification/preprocessor/RdbmsPreprocessor.java
+++ 
b/webapp/src/main/java/org/apache/atlas/notification/preprocessor/RdbmsPreprocessor.java
@@ -103,35 +103,35 @@ public class RdbmsPreprocessor {
 
         @Override
         public void preprocess(AtlasEntity entity, PreprocessorContext 
context) {
-            clearRefAttributes(entity, context);
+            if (context.getRdbmsTypesRemoveOwnedRefAttrs()) {
+                clearRefAttributesAndMove(entity, context);
 
-            Map<String, AtlasEntity> referredEntities = 
context.getReferredEntities();
+                Map<String, AtlasEntity> referredEntities = 
context.getReferredEntities();
 
-            if (MapUtils.isNotEmpty(referredEntities)) {
-                for (AtlasEntity referredEntity : referredEntities.values()) {
-                    if 
(entityTypesToMove.contains(referredEntity.getTypeName())) {
-                        clearRefAttributes(referredEntity, context);
-
-                        
context.addToReferredEntitiesToMove(referredEntity.getGuid());
+                if (MapUtils.isNotEmpty(referredEntities)) {
+                    for (AtlasEntity referredEntity : 
referredEntities.values()) {
+                        if 
(entityTypesToMove.contains(referredEntity.getTypeName())) {
+                            clearRefAttributesAndMove(referredEntity, context);
+                        }
                     }
                 }
             }
         }
 
-        private void clearRefAttributes(AtlasEntity entity, 
PreprocessorContext context) {
+        private void clearRefAttributesAndMove(AtlasEntity entity, 
PreprocessorContext context) {
             switch (entity.getTypeName()) {
                 case TYPE_RDBMS_INSTANCE:
-                    entity.removeAttribute(ATTRIBUTE_DATABASES);
+                    context.removeRefAttributeAndRegisterToMove(entity, 
ATTRIBUTE_DATABASES);
                 break;
 
                 case TYPE_RDBMS_DB:
-                    entity.removeAttribute(ATTRIBUTE_TABLES);
+                    context.removeRefAttributeAndRegisterToMove(entity, 
ATTRIBUTE_TABLES);
                 break;
 
                 case TYPE_RDBMS_TABLE:
-                    entity.removeAttribute(ATTRIBUTE_COLUMNS);
-                    entity.removeAttribute(ATTRIBUTE_INDEXES);
-                    entity.removeAttribute(ATTRIBUTE_FOREIGN_KEYS);
+                    context.removeRefAttributeAndRegisterToMove(entity, 
ATTRIBUTE_COLUMNS);
+                    context.removeRefAttributeAndRegisterToMove(entity, 
ATTRIBUTE_INDEXES);
+                    context.removeRefAttributeAndRegisterToMove(entity, 
ATTRIBUTE_FOREIGN_KEYS);
                 break;
             }
         }

Reply via email to