Repository: atlas Updated Branches: refs/heads/master cabc1e550 -> 6c49542b8
ATLAS-2581: V2 Hive hook notifications - incorrect location for sd after moving table to a different database Project: http://git-wip-us.apache.org/repos/asf/atlas/repo Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/6c49542b Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/6c49542b Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/6c49542b Branch: refs/heads/master Commit: 6c49542b8e95b248c4a4062f13e499e2ebea93bf Parents: cabc1e5 Author: Madhan Neethiraj <mad...@apache.org> Authored: Tue Apr 17 15:10:42 2018 -0700 Committer: Madhan Neethiraj <mad...@apache.org> Committed: Wed Apr 18 09:43:44 2018 -0700 ---------------------------------------------------------------------- .../hive/hook/events/AlterTableRename.java | 53 +++++++++++++------- .../atlas/util/AtlasGremlin3QueryProvider.java | 2 +- 2 files changed, 35 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/atlas/blob/6c49542b/addons/hive-bridge/src/main/java/org/apache/atlas/hive/hook/events/AlterTableRename.java ---------------------------------------------------------------------- diff --git a/addons/hive-bridge/src/main/java/org/apache/atlas/hive/hook/events/AlterTableRename.java b/addons/hive-bridge/src/main/java/org/apache/atlas/hive/hook/events/AlterTableRename.java index eac095c..35b0586 100644 --- a/addons/hive-bridge/src/main/java/org/apache/atlas/hive/hook/events/AlterTableRename.java +++ b/addons/hive-bridge/src/main/java/org/apache/atlas/hive/hook/events/AlterTableRename.java @@ -72,6 +72,8 @@ public class AlterTableRename extends BaseHiveEvent { continue; } + newTable = getHive().getTable(newTable.getDbName(), newTable.getTableName()); + break; } } @@ -88,27 +90,27 @@ public class AlterTableRename extends BaseHiveEvent { // first update with oldTable info, so that the table will be created if it is not present in Atlas ret.add(new EntityUpdateRequestV2(getUserName(), new AtlasEntitiesWithExtInfo(oldTableEntity))); + AtlasEntityWithExtInfo renamedTableEntity = toTableEntity(newTable); + // update qualifiedName for all columns, partitionKeys, storageDesc - String newTableQualifiedName = getQualifiedName(newTable); + String renamedTableQualifiedName = (String) renamedTableEntity.getEntity().getAttribute(ATTRIBUTE_QUALIFIED_NAME); - renameColumns((List<AtlasObjectId>) oldTableEntity.getEntity().getAttribute(ATTRIBUTE_COLUMNS), oldTableEntity, newTableQualifiedName, ret); - renameColumns((List<AtlasObjectId>) oldTableEntity.getEntity().getAttribute(ATTRIBUTE_PARTITION_KEYS), oldTableEntity, newTableQualifiedName, ret); - renameStorageDesc((AtlasObjectId) oldTableEntity.getEntity().getAttribute(ATTRIBUTE_STORAGEDESC), oldTableEntity, newTableQualifiedName, ret); + renameColumns((List<AtlasObjectId>) oldTableEntity.getEntity().getAttribute(ATTRIBUTE_COLUMNS), oldTableEntity, renamedTableQualifiedName, ret); + renameColumns((List<AtlasObjectId>) oldTableEntity.getEntity().getAttribute(ATTRIBUTE_PARTITION_KEYS), oldTableEntity, renamedTableQualifiedName, ret); + renameStorageDesc(oldTableEntity, renamedTableEntity, ret); - // update qualifiedName and other attributes (like params - which include lastModifiedTime, lastModifiedBy) of the table - AtlasEntityWithExtInfo newTableEntity = toTableEntity(newTable); + // remove columns, partitionKeys and storageDesc - as they have already been updated above + removeAttribute(renamedTableEntity, ATTRIBUTE_COLUMNS); + removeAttribute(renamedTableEntity, ATTRIBUTE_PARTITION_KEYS); + removeAttribute(renamedTableEntity, ATTRIBUTE_STORAGEDESC); // set previous name as the alias - newTableEntity.getEntity().setAttribute(ATTRIBUTE_ALIASES, Collections.singletonList(oldTable.getTableName())); - - // remove columns, partitionKeys and storageDesc - as they have already been updated above - removeAttribute(newTableEntity, ATTRIBUTE_COLUMNS); - removeAttribute(newTableEntity, ATTRIBUTE_PARTITION_KEYS); - removeAttribute(newTableEntity, ATTRIBUTE_STORAGEDESC); + renamedTableEntity.getEntity().setAttribute(ATTRIBUTE_ALIASES, Collections.singletonList(oldTable.getTableName())); AtlasObjectId oldTableId = new AtlasObjectId(oldTableEntity.getEntity().getTypeName(), ATTRIBUTE_QUALIFIED_NAME, oldTableEntity.getEntity().getAttribute(ATTRIBUTE_QUALIFIED_NAME)); - ret.add(new EntityPartialUpdateRequestV2(getUserName(), oldTableId, newTableEntity)); + // update qualifiedName and other attributes (like params - which include lastModifiedTime, lastModifiedBy) of the table + ret.add(new EntityPartialUpdateRequestV2(getUserName(), oldTableId, renamedTableEntity)); context.removeFromKnownTable((String) oldTableEntity.getEntity().getAttribute(ATTRIBUTE_QUALIFIED_NAME)); @@ -127,11 +129,14 @@ public class AlterTableRename extends BaseHiveEvent { } } - private void renameStorageDesc(AtlasObjectId sdId, AtlasEntityExtInfo oldEntityExtInfo, String newTableQualifiedName, List<HookNotification> notifications) { - if (sdId != null) { - AtlasEntity oldSd = oldEntityExtInfo.getEntity(sdId.getGuid()); + private void renameStorageDesc(AtlasEntityWithExtInfo oldEntityExtInfo, AtlasEntityWithExtInfo newEntityExtInfo, List<HookNotification> notifications) { + AtlasEntity oldSd = getStorageDescEntity(oldEntityExtInfo); + AtlasEntity newSd = getStorageDescEntity(newEntityExtInfo); + + if (oldSd != null && newSd != null) { AtlasObjectId oldSdId = new AtlasObjectId(oldSd.getTypeName(), ATTRIBUTE_QUALIFIED_NAME, oldSd.getAttribute(ATTRIBUTE_QUALIFIED_NAME)); - AtlasEntity newSd = new AtlasEntity(oldSd.getTypeName(), ATTRIBUTE_QUALIFIED_NAME, getStorageDescQualifiedName(newTableQualifiedName)); + + newSd.removeAttribute(ATTRIBUTE_TABLE); notifications.add(new EntityPartialUpdateRequestV2(getUserName(), oldSdId, new AtlasEntityWithExtInfo(newSd))); } @@ -156,7 +161,17 @@ public class AlterTableRename extends BaseHiveEvent { } } - private String getStorageDescQualifiedName(String tblQualifiedName) { - return tblQualifiedName + "_storage"; + private AtlasEntity getStorageDescEntity(AtlasEntityWithExtInfo tableEntity) { + AtlasEntity ret = null; + + if (tableEntity != null && tableEntity.getEntity() != null) { + Object attrSdId = tableEntity.getEntity().getAttribute(ATTRIBUTE_STORAGEDESC); + + if (attrSdId instanceof AtlasObjectId) { + ret = tableEntity.getReferredEntity(((AtlasObjectId) attrSdId).getGuid()); + } + } + + return ret; } } http://git-wip-us.apache.org/repos/asf/atlas/blob/6c49542b/repository/src/main/java/org/apache/atlas/util/AtlasGremlin3QueryProvider.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/util/AtlasGremlin3QueryProvider.java b/repository/src/main/java/org/apache/atlas/util/AtlasGremlin3QueryProvider.java index e82c658..8555f70 100644 --- a/repository/src/main/java/org/apache/atlas/util/AtlasGremlin3QueryProvider.java +++ b/repository/src/main/java/org/apache/atlas/util/AtlasGremlin3QueryProvider.java @@ -52,7 +52,7 @@ public class AtlasGremlin3QueryProvider extends AtlasGremlin2QueryProvider { case TO_RANGE_LIST: return ".range(startIdx, endIdx).toList()"; case RELATIONSHIP_SEARCH: - return "g.V().has('__guid', guid).both(relation).has('__state', within(states))"; + return "g.V().has('__guid', guid).bothE(relation).has('__state', within(states)).otherV().has('__state', within(states))"; case RELATIONSHIP_SEARCH_ASCENDING_SORT: return ".order().by(sortAttributeName, incr)"; case RELATIONSHIP_SEARCH_DESCENDING_SORT: