Repository: incubator-atlas
Updated Branches:
  refs/heads/master fe86177a1 -> dc89e7f44


ATLAS-1636: fix incorrect reverseAttribute for hive_column.table


Project: http://git-wip-us.apache.org/repos/asf/incubator-atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-atlas/commit/dc89e7f4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-atlas/tree/dc89e7f4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-atlas/diff/dc89e7f4

Branch: refs/heads/master
Commit: dc89e7f44699d2bd8e08b7d50fbac493cba3ca2e
Parents: fe86177
Author: Sarath Subramanian <[email protected]>
Authored: Mon Mar 6 14:42:30 2017 -0800
Committer: Madhan Neethiraj <[email protected]>
Committed: Mon Mar 6 16:21:44 2017 -0800

----------------------------------------------------------------------
 ...e_column_update_table_remove_constraint.json | 21 +++++++
 .../bootstrap/AtlasTypeDefStoreInitializer.java | 64 ++++++++++++++++++++
 2 files changed, 85 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/dc89e7f4/addons/models/patches/003-hive_column_update_table_remove_constraint.json
----------------------------------------------------------------------
diff --git 
a/addons/models/patches/003-hive_column_update_table_remove_constraint.json 
b/addons/models/patches/003-hive_column_update_table_remove_constraint.json
new file mode 100644
index 0000000..db80722
--- /dev/null
+++ b/addons/models/patches/003-hive_column_update_table_remove_constraint.json
@@ -0,0 +1,21 @@
+{
+  "patches": [
+    {
+      "action": "UPDATE_ATTRIBUTE",
+      "typeName": "hive_column",
+      "applyToVersion": "1.2",
+      "updateToVersion": "1.3",
+      "params": null,
+      "attributeDefs": [
+        {
+          "name": "table",
+          "typeName": "hive_table",
+          "cardinality": "SINGLE",
+          "isIndexable": false,
+          "isOptional": true,
+          "isUnique": false
+        }
+      ]
+    }
+  ]
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/dc89e7f4/repository/src/main/java/org/apache/atlas/repository/store/bootstrap/AtlasTypeDefStoreInitializer.java
----------------------------------------------------------------------
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 fa4a480..51e4b45 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
@@ -160,6 +160,7 @@ public class AtlasTypeDefStoreInitializer {
         PatchHandler[] patchHandlers = new PatchHandler[] {
                 new AddAttributePatchHandler(typeDefStore, typeRegistry),
                 new UpdateTypeDefOptionsPatchHandler(typeDefStore, 
typeRegistry),
+                new UpdateAttributePatchHandler(typeDefStore, typeRegistry)
         };
 
         Map<String, PatchHandler> patchHandlerRegistry = new HashMap<>();
@@ -381,6 +382,69 @@ public class AtlasTypeDefStoreInitializer {
         }
     }
 
+    class UpdateAttributePatchHandler extends PatchHandler {
+        public UpdateAttributePatchHandler(AtlasTypeDefStore typeDefStore, 
AtlasTypeRegistry typeRegistry) {
+            super(typeDefStore, typeRegistry, new String[] { 
"UPDATE_ATTRIBUTE" });
+        }
+
+        @Override
+        public void applyPatch(TypeDefPatch patch) throws AtlasBaseException {
+            String           typeName = patch.getTypeName();
+            AtlasBaseTypeDef typeDef  = 
typeRegistry.getTypeDefByName(typeName);
+
+            if (typeDef == null) {
+                throw new 
AtlasBaseException(AtlasErrorCode.PATCH_FOR_UNKNOWN_TYPE, patch.getAction(), 
typeName);
+            }
+
+            if (isPatchApplicable(patch, typeDef)) {
+                if (typeDef.getClass().equals(AtlasEntityDef.class)) {
+                    AtlasEntityDef updatedDef = new 
AtlasEntityDef((AtlasEntityDef)typeDef);
+
+                    addOrUpdateAttributes(updatedDef, 
patch.getAttributeDefs());
+
+                    updatedDef.setTypeVersion(patch.getUpdateToVersion());
+
+                    typeDefStore.updateEntityDefByName(typeName, updatedDef);
+                } else if 
(typeDef.getClass().equals(AtlasClassificationDef.class)) {
+                    AtlasClassificationDef updatedDef = new 
AtlasClassificationDef((AtlasClassificationDef)typeDef);
+
+                    addOrUpdateAttributes(updatedDef, 
patch.getAttributeDefs());
+
+                    updatedDef.setTypeVersion(patch.getUpdateToVersion());
+
+                    typeDefStore.updateClassificationDefByName(typeName, 
updatedDef);
+                } else if (typeDef.getClass().equals(AtlasStructDef.class)) {
+                    AtlasStructDef updatedDef = new 
AtlasStructDef((AtlasStructDef)typeDef);
+
+                    addOrUpdateAttributes(updatedDef, 
patch.getAttributeDefs());
+
+                    updatedDef.setTypeVersion(patch.getUpdateToVersion());
+
+                    typeDefStore.updateStructDefByName(typeName, updatedDef);
+
+                } else {
+                    throw new 
AtlasBaseException(AtlasErrorCode.PATCH_NOT_APPLICABLE_FOR_TYPE,
+                                                 patch.getAction(), 
typeDef.getClass().getSimpleName());
+                }
+            } else {
+                LOG.info("patch skipped: typeName={}; applyToVersion={}; 
updateToVersion={}",
+                          patch.getTypeName(), patch.getApplyToVersion(), 
patch.getUpdateToVersion());
+            }
+        }
+
+        private void addOrUpdateAttributes(AtlasStructDef structDef, 
List<AtlasAttributeDef> attributesToUpdate) {
+            for (AtlasAttributeDef attributeToUpdate : attributesToUpdate) {
+                String attrName = attributeToUpdate.getName();
+
+                if (structDef.hasAttribute(attrName)) {
+                    structDef.removeAttribute(attrName);
+                }
+
+                structDef.addAttribute(attributeToUpdate);
+            }
+        }
+    }
+
     class UpdateTypeDefOptionsPatchHandler extends PatchHandler {
         public UpdateTypeDefOptionsPatchHandler(AtlasTypeDefStore 
typeDefStore, AtlasTypeRegistry typeRegistry) {
             super(typeDefStore, typeRegistry, new String[] { 
"UPDATE_TYPEDEF_OPTIONS" });

Reply via email to