Jelajahi Sumber

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 tahun lalu
induk
melakukan
d6c2689c7d
1 mengubah file dengan 105 tambahan dan 82 penghapusan
  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]
+        });
     }
   };