瀏覽代碼

HUE-7950 [assist] Clear all tables cascaded when refreshing a DB in the assist panel

Johan Ahlen 7 年之前
父節點
當前提交
f96b563

+ 2 - 1
apps/metastore/src/metastore/static/metastore/js/metastore.ko.js

@@ -78,7 +78,8 @@ var MetastoreViewModel = (function () {
 
     self.loadDatabases();
 
-    huePubSub.subscribe('data.catalog.entry.refreshed', function (refreshedEntry) {
+    huePubSub.subscribe('data.catalog.entry.refreshed', function (details) {
+      var refreshedEntry = details.entry;
 
       if (refreshedEntry.getSourceType() !== self.sourceType()) {
         return;

+ 1 - 1
desktop/core/src/desktop/static/desktop/js/assist/assistDbEntry.js

@@ -243,7 +243,7 @@ var AssistDbEntry = (function () {
 
   AssistDbEntry.prototype.triggerRefresh = function () {
     var self = this;
-    self.catalogEntry.clear(self.invalidateOnRefresh());
+    self.catalogEntry.clear(self.invalidateOnRefresh(), true);
   };
 
   AssistDbEntry.prototype.highlightInside = function (path) {

+ 4 - 4
desktop/core/src/desktop/static/desktop/js/assist/assistDbSource.js

@@ -281,13 +281,13 @@ var AssistDbSource = (function () {
       $container.find(".assist-actions, .assist-db-header-actions").css('right', -$container.scrollLeft() + 'px');
     };
 
-    huePubSub.subscribe('data.catalog.entry.refreshed', function (refreshedEntry) {
-      if (self.catalogEntry === refreshedEntry) {
+    huePubSub.subscribe('data.catalog.entry.refreshed', function (details) {
+      if (self.catalogEntry === details.entry) {
         self.initDatabases();
-      } else if (refreshedEntry.getSourceType() === self.sourceType) {
+      } else if (details.entry.getSourceType() === self.sourceType) {
         var findAndReloadInside = function (entries) {
           return entries.some(function (entry) {
-            if (entry.catalogEntry === refreshedEntry) {
+            if (entry.catalogEntry === details.entry) {
               entry.loadEntries();
               return true;
             }

+ 37 - 13
desktop/core/src/desktop/static/desktop/js/dataCatalog.js

@@ -44,9 +44,37 @@ var DataCatalog = (function () {
     cacheEnabled = true;
   };
 
-  DataCatalog.prototype.clearStorage = function () {
+  DataCatalog.prototype.clearStorageCascade = function (rootPath) {
     var self = this;
-    return self.store.clear()
+    var deferred = $.Deferred();
+    if (rootPath.length === 0) {
+      self.entries = {};
+      self.store.clear().then(deferred.resolve).catch(deferred.reject);
+      return deferred.promise();
+    }
+
+    var keyPrefix = rootPath.join('.');
+    Object.keys(self.entries).forEach(function (key) {
+      if (key.indexOf(keyPrefix) === 0) {
+        delete self.entries[key];
+      }
+    });
+
+    var deletePromises = [];
+    var keysDeferred = $.Deferred();
+    deletePromises.push(keysDeferred.promise());
+    self.store.keys().then(function (keys) {
+      keys.forEach(function (key) {
+        if (key.indexOf(keyPrefix) === 0) {
+          var deleteDeferred = $.Deferred();
+          deletePromises.push(deleteDeferred.promise());
+          self.store.removeItem(key).then(deleteDeferred.resolve).catch(deleteDeferred.reject);
+        }
+      });
+      keysDeferred.resolve();
+    }).catch(keysDeferred.reject);
+
+    return $.when.apply($, deletePromises);
   };
 
   DataCatalog.prototype.updateStore = function (dataCatalogEntry) {
@@ -54,7 +82,8 @@ var DataCatalog = (function () {
     if (!cacheEnabled) {
       return $.Deferred().resolve().promise();
     }
-    return self.store.setItem(dataCatalogEntry.getQualifiedPath(), {
+    var deferred = $.Deferred();
+    self.store.setItem(dataCatalogEntry.getQualifiedPath(), {
       version: DATA_CATALOG_VERSION,
       definition: dataCatalogEntry.definition,
       sourceMeta: dataCatalogEntry.sourceMeta,
@@ -63,7 +92,8 @@ var DataCatalog = (function () {
       navigatorMeta: dataCatalogEntry.navigatorMeta,
       navOptMeta:  dataCatalogEntry.navOptMeta,
       navOptPopularity: dataCatalogEntry.navOptPopularity,
-    });
+    }).then(deferred.resolve).catch(deferred.reject);
+    return deferred.promise();
   };
 
   /**
@@ -420,21 +450,15 @@ var DataCatalog = (function () {
       invalidatePromise = $.Deferred().resolve().promise();
     }
 
-    self.reset();
 
-    var saveDeferred = $.Deferred();
 
-    if (self.isSource() && cascade) {
-      self.dataCatalog.entries = {};
-      self.dataCatalog.clearStorage().then(saveDeferred.resolve).catch(saveDeferred.reject);
-    } else {
-      self.save().then(saveDeferred.resolve).catch(saveDeferred.reject);
-    }
+    self.reset();
+    var saveDeferred = cascade ? self.dataCatalog.clearStorageCascade(self.path) : self.save();
 
     var clearPromise = $.when(invalidatePromise, saveDeferred);
 
     clearPromise.always(function () {
-      huePubSub.publish('data.catalog.entry.refreshed', self);
+      huePubSub.publish('data.catalog.entry.refreshed', { entry: self, cascade: cascade });
     });
 
     return new CancellablePromise(clearPromise, undefined, [invalidatePromise]);

+ 3 - 3
desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js

@@ -3028,11 +3028,11 @@ var EditorViewModel = (function() {
       })
     }, self.huePubSubId);
 
-    huePubSub.subscribe('data.catalog.entry.refreshed', function (catalogEntry) {
+    huePubSub.subscribe('data.catalog.entry.refreshed', function (details) {
       var notebook = self.selectedNotebook();
-      if (catalogEntry.isSource() && notebook) {
+      if (details.entry.isSource() && notebook) {
         notebook.snippets().forEach(function (snippet) {
-          if (catalogEntry.getSourceType() === snippet.type()) {
+          if (details.entry.getSourceType() === snippet.type()) {
             snippet.updateDatabases();
           }
         });