Răsfoiți Sursa

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 ani în urmă
părinte
comite
d6c2689c7d
1 a modificat fișierele cu 105 adăugiri și 82 ștergeri
  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]
+        });
     }
   };