Browse Source

HUE-5094 [metastore] Fix initial loading of tables and databases

Sometimes the correct table is not shown and it instead shows the list of tables, with this fix it will wait until databases and tables are loaded instead.
Johan Ahlen 8 năm trước cách đây
mục cha
commit
d6c2689c7d
1 tập tin đã thay đổi với 105 bổ sung82 xóa
  1. 105 82
      apps/metastore/src/metastore/static/metastore/js/metastore.ko.js

+ 105 - 82
apps/metastore/src/metastore/static/metastore/js/metastore.ko.js

@@ -729,36 +729,7 @@ var MetastoreViewModel = (function () {
 
     self.database = ko.observable(null);
 
-    var loadDatabases = function (successCallback) {
-      if (self.loading()) {
-        return;
-      }
-      self.loading(true);
-      self.apiHelper.loadDatabases({
-        sourceType: 'hive',
-        successCallback: function (databaseNames) {
-          self.databases($.map(databaseNames, function (name) {
-            return new MetastoreDatabase({
-              name: name,
-              apiHelper: self.apiHelper,
-              i18n: self.i18n,
-              metastore: self,
-              optimizerEnabled: self.optimizerEnabled,
-              navigatorEnabled: self.navigatorEnabled
-            })
-          }));
-          self.loading(false);
-          if (successCallback) {
-            successCallback();
-          }
-        },
-        errorCallback: function () {
-          self.databases([]);
-        }
-      });
-    };
-
-    loadDatabases();
+    self.loadDatabases();
 
     huePubSub.subscribe('assist.db.refresh', function (options) {
       if (options.sourceType !== 'hive') {
@@ -779,7 +750,7 @@ var MetastoreViewModel = (function () {
         }
         self.database(null);
       }
-      loadDatabases(function () {
+      self.loadDatabases(function () {
         if (currentDatabase) {
           self.setDatabaseByName(currentDatabase, function () {
             if (self.database() && currentTable) {
@@ -844,65 +815,120 @@ var MetastoreViewModel = (function () {
     }
   }
 
-  MetastoreViewModel.prototype.loadTableDef = function (tableDef, callback) {
+  var lastLoadDatabasesDeferred = null;
+
+  MetastoreViewModel.prototype.loadDatabases = function (successCallback) {
     var self = this;
-    self.setDatabaseByName(tableDef.database);
-    if (self.database()) {
-      if (self.database().table() && self.database().table().name == tableDef.name) {
-        return;
+    if (self.loading()) {
+      if (lastLoadDatabasesDeferred !== null) {
+        lastLoadDatabasesDeferred.done(successCallback);
       }
-      var setTableAfterLoad = function () {
-        var foundTables = $.grep(self.database().tables(), function (table) {
-          return table.name === tableDef.name;
-        });
-        if (foundTables.length === 1) {
-          self.database().setTable(foundTables[0], callback);
+      return;
+    }
+
+    lastLoadDatabasesDeferred = $.Deferred();
+    lastLoadDatabasesDeferred.done(successCallback);
+
+    self.loading(true);
+    self.apiHelper.loadDatabases({
+      sourceType: 'hive',
+      successCallback: function (databaseNames) {
+        self.databases($.map(databaseNames, function (name) {
+          return new MetastoreDatabase({
+            name: name,
+            apiHelper: self.apiHelper,
+            i18n: self.i18n,
+            metastore: self,
+            optimizerEnabled: self.optimizerEnabled,
+            navigatorEnabled: self.navigatorEnabled
+          })
+        }));
+        self.loading(false);
+        lastLoadDatabasesDeferred.resolve();
+      },
+      errorCallback: function () {
+        self.databases([]);
+        lastLoadDatabasesDeferred.reject();
+      }
+    });
+  };
+
+  MetastoreViewModel.prototype.loadTableDef = function (tableDef, callback) {
+    var self = this;
+    self.setDatabaseByName(tableDef.database, function () {
+      if (self.database()) {
+        if (self.database().table() && self.database().table().name == tableDef.name) {
+          if (callback) {
+            callback();
+          }
+          return;
         }
-        else {
-          huePubSub.publish('assist.clear.db.cache', {
-            sourceType: 'hive',
-            clearAll: false,
-            databaseName: self.database().name
+
+        var setTableAfterLoad = function (clearDbCacheOnMissing) {
+          var foundTables = $.grep(self.database().tables(), function (table) {
+            return table.name === tableDef.name;
           });
-          self.database().load(setTableAfterLoad, self.optimizerEnabled(), self.navigatorEnabled());
-        }
-      };
+          if (foundTables.length === 1) {
+            self.database().setTable(foundTables[0], callback);
+          } else if (clearDbCacheOnMissing) {
+            huePubSub.publish('assist.clear.db.cache', {
+              sourceType: 'hive',
+              clearAll: false,
+              databaseName: self.database().name
+            });
+            self.database().load(function () {
+              setTableAfterLoad(false);
+            }, self.optimizerEnabled(), self.navigatorEnabled());
+          }
+        };
 
-      if (!self.database().loaded()) {
-        var doOnce = self.database().loaded.subscribe(function () {
-          setTableAfterLoad();
-          doOnce.dispose();
-        });
-      } else {
-        setTableAfterLoad();
+        if (!self.database().loaded()) {
+          var doOnce = self.database().loaded.subscribe(function () {
+            setTableAfterLoad(true);
+            doOnce.dispose();
+          });
+        } else {
+          setTableAfterLoad(true);
+        }
       }
-    }
+    });
   };
 
   MetastoreViewModel.prototype.setDatabaseByName = function (databaseName, callback) {
     var self = this;
-    if (databaseName === '') {
-      databaseName = self.apiHelper.getFromTotalStorage('editor', 'last.selected.database') ||
-          self.apiHelper.getFromTotalStorage('metastore', 'last.selected.database') || 'default';
-    }
-    if (self.database() && self.database().name == databaseName) {
-      if (callback) {
-        callback();
+
+    var whenLoaded = function () {
+      if (databaseName === '') {
+        databaseName = self.apiHelper.getFromTotalStorage('editor', 'last.selected.database') ||
+            self.apiHelper.getFromTotalStorage('metastore', 'last.selected.database') || 'default';
       }
-      return;
-    }
-    var foundDatabases = $.grep(self.databases(), function (database) {
-      return database.name === databaseName;
-    });
-    if (foundDatabases.length === 1) {
-      self.setDatabase(foundDatabases[0], callback);
-    } else {
-      foundDatabases = $.grep(self.databases(), function (database) {
-        return database.name === 'default';
+      if (self.database() && self.database().name == databaseName) {
+        if (callback) {
+          callback();
+        }
+        return;
+      }
+      var foundDatabases = $.grep(self.databases(), function (database) {
+        return database.name === databaseName;
       });
       if (foundDatabases.length === 1) {
         self.setDatabase(foundDatabases[0], callback);
+      } else {
+        foundDatabases = $.grep(self.databases(), function (database) {
+          return database.name === 'default';
+        });
+
+        if (foundDatabases.length === 1) {
+          self.setDatabase(foundDatabases[0], callback);
+        } else {
+        }
       }
+    };
+
+    if (self.loading() && lastLoadDatabasesDeferred !== null) {
+      lastLoadDatabasesDeferred.done(whenLoaded);
+    } else {
+      whenLoaded();
     }
   };
 
@@ -930,13 +956,10 @@ var MetastoreViewModel = (function () {
         self.setDatabaseByName(path[1]);
         break;
       case 'table':
-        window.setTimeout(function() {
-          self.loadTableDef({
-            name: path[2],
-            database: path[1]
-          });
-        }, 200);
-        break;
+        self.loadTableDef({
+          name: path[2],
+          database: path[1]
+        });
     }
   };