Browse Source

[metastore] Fixed history back and forward and unified assist open item behavior

Enrico Berti 10 years ago
parent
commit
08a1954
1 changed files with 113 additions and 100 deletions
  1. 113 100
      apps/metastore/src/metastore/templates/metastore.mako

+ 113 - 100
apps/metastore/src/metastore/templates/metastore.mako

@@ -291,7 +291,7 @@ ${ assist.assistPanel() }
         <div class="hueCheckbox fa" data-bind="multiCheck: '#databasesTable', value: $data, hueChecked: $parent.selectedDatabases"></div>
         <div class="hueCheckbox fa" data-bind="multiCheck: '#databasesTable', value: $data, hueChecked: $parent.selectedDatabases"></div>
       </td>
       </td>
       <td>
       <td>
-        <a href="javascript: void(0);" data-bind="text: name, click: function () { $parent.setDatabase($data) }"></a>
+        <a href="javascript: void(0);" data-bind="text: name, click: function () { $parent.setDatabase($data, function(){ huePubSub.publish('metastore.url.change'); }) }"></a>
       </td>
       </td>
     </tr>
     </tr>
     </tbody>
     </tbody>
@@ -392,7 +392,7 @@ ${ assist.assistPanel() }
                   assistHelper: assistHelper
                   assistHelper: assistHelper
                 } }"></span></td>
                 } }"></span></td>
               <td>
               <td>
-                <a class="tableLink" href="javascript:void(0);" data-bind="text: name, click: function() { $parent.setTable($data) }"></a>
+                <a class="tableLink" href="javascript:void(0);" data-bind="text: name, click: function() { $parent.setTable($data, function(){ huePubSub.publish('metastore.url.change'); }) }"></a>
               </td>
               </td>
               <td data-bind="text: comment"></td>
               <td data-bind="text: comment"></td>
               <td data-bind="text: type"></td>
               <td data-bind="text: type"></td>
@@ -747,7 +747,7 @@ ${ assist.assistPanel() }
      * @param {string} [options.tableComment]
      * @param {string} [options.tableComment]
      * @constructor
      * @constructor
      */
      */
-    function MetastoreDatabase (options) {
+    function MetastoreDatabase(options) {
       var self = this;
       var self = this;
       self.assistHelper = options.assistHelper;
       self.assistHelper = options.assistHelper;
       self.name = options.name;
       self.name = options.name;
@@ -757,7 +757,7 @@ ${ assist.assistPanel() }
       self.tables = ko.observableArray();
       self.tables = ko.observableArray();
       self.stats = ko.observable();
       self.stats = ko.observable();
 
 
-      self.tableQuery = ko.observable('').extend({ rateLimit: 150 });
+      self.tableQuery = ko.observable('').extend({rateLimit: 150});
 
 
       self.filteredTables = ko.computed(function () {
       self.filteredTables = ko.computed(function () {
         if (self.tableQuery() === '') {
         if (self.tableQuery() === '') {
@@ -785,7 +785,7 @@ ${ assist.assistPanel() }
         sourceType: 'hive',
         sourceType: 'hive',
         databaseName: self.name,
         databaseName: self.name,
         successCallback: function (data) {
         successCallback: function (data) {
-          self.tables($.map(data.tables_meta, function(tableMeta) {
+          self.tables($.map(data.tables_meta, function (tableMeta) {
             return new MetastoreTable({
             return new MetastoreTable({
               database: self,
               database: self,
               name: tableMeta.name,
               name: tableMeta.name,
@@ -801,15 +801,16 @@ ${ assist.assistPanel() }
           }
           }
         },
         },
         errorCallback: function (response) {
         errorCallback: function (response) {
-          console.log(response);
+          console.error('MetastoreDatabase.load error');
+          console.error(response);
           self.loading(false);
           self.loading(false);
           if (callback) {
           if (callback) {
             callback();
             callback();
           }
           }
         }
         }
       });
       });
-      $.getJSON('/metastore/databases/'+ self.name +'/metadata', function(data){
-        if (data && data.status == 0){
+      $.getJSON('/metastore/databases/' + self.name + '/metadata', function (data) {
+        if (data && data.status == 0) {
           self.stats(data.data);
           self.stats(data.data);
         }
         }
       });
       });
@@ -824,19 +825,20 @@ ${ assist.assistPanel() }
       if (foundTables.length === 1) {
       if (foundTables.length === 1) {
         self.setTable(foundTables[0]);
         self.setTable(foundTables[0]);
       }
       }
-      huePubSub.publish('metastore.url.change');
     };
     };
 
 
-    MetastoreDatabase.prototype.setTable = function (metastoreTable) {
+    MetastoreDatabase.prototype.setTable = function (metastoreTable, callback) {
       var self = this;
       var self = this;
       self.table(metastoreTable);
       self.table(metastoreTable);
-      if (! metastoreTable.loaded()) {
+      if (!metastoreTable.loaded()) {
         metastoreTable.load();
         metastoreTable.load();
       }
       }
+      if (callback) {
+        callback();
+      }
       window.setTimeout(function () {
       window.setTimeout(function () {
         $('a[href="#overview"]').click();
         $('a[href="#overview"]').click();
       }, 200);
       }, 200);
-      huePubSub.publish('metastore.url.change');
     };
     };
 
 
     /**
     /**
@@ -844,7 +846,7 @@ ${ assist.assistPanel() }
      * @param {AssistHelper} options.assistHelper
      * @param {AssistHelper} options.assistHelper
      * @param {MetastoreTable} options.metastoreTable
      * @param {MetastoreTable} options.metastoreTable
      */
      */
-    function MetastoreTablePartitions (options) {
+    function MetastoreTablePartitions(options) {
       var self = this;
       var self = this;
       self.detailedKeys = ko.observableArray();
       self.detailedKeys = ko.observableArray();
       self.keys = ko.observableArray();
       self.keys = ko.observableArray();
@@ -891,7 +893,7 @@ ${ assist.assistPanel() }
      * @param {AssistHelper} options.assistHelper
      * @param {AssistHelper} options.assistHelper
      * @param {MetastoreTable} options.metastoreTable
      * @param {MetastoreTable} options.metastoreTable
      */
      */
-    function MetastoreTableSamples (options) {
+    function MetastoreTableSamples(options) {
       var self = this;
       var self = this;
       self.rows = ko.observableArray();
       self.rows = ko.observableArray();
       self.headers = ko.observableArray();
       self.headers = ko.observableArray();
@@ -945,7 +947,7 @@ ${ assist.assistPanel() }
      * @param {AssistHelper} options.assistHelper
      * @param {AssistHelper} options.assistHelper
      * @constructor
      * @constructor
      */
      */
-    function MetastoreTable (options) {
+    function MetastoreTable(options) {
       var self = this;
       var self = this;
       self.database = options.database;
       self.database = options.database;
       self.assistHelper = options.assistHelper;
       self.assistHelper = options.assistHelper;
@@ -974,10 +976,10 @@ ${ assist.assistPanel() }
 
 
       self.comment.subscribe(function (newValue) {
       self.comment.subscribe(function (newValue) {
         // TODO: Switch to using the ko observables in the url (self.database.name() and self.name())
         // TODO: Switch to using the ko observables in the url (self.database.name() and self.name())
-##         $.post("${ url('metastore:alter_table', database=database, table=table.name) }", {
-##           comment: newValue ? newValue : ""
-##         });
-      });
+        ##         $.post("${ url('metastore:alter_table', database=database, table=table.name) }", {
+        ##           comment: newValue ? newValue : ""
+        ##         });
+              });
 
 
       self.refreshTableStats = function () {
       self.refreshTableStats = function () {
         if (self.refreshingTableStats()) {
         if (self.refreshingTableStats()) {
@@ -1008,10 +1010,12 @@ ${ assist.assistPanel() }
           tableName: self.name,
           tableName: self.name,
           fields: [],
           fields: [],
           successCallback: function (data) {
           successCallback: function (data) {
-            self.columns($.map(data.extended_columns, function (column) { return new MetastoreColumn({
-              extendedColumn: column,
-              table: self
-            }) }));
+            self.columns($.map(data.extended_columns, function (column) {
+              return new MetastoreColumn({
+                extendedColumn: column,
+                table: self
+              })
+            }));
             self.favouriteColumns(self.columns().slice(0, 3));
             self.favouriteColumns(self.columns().slice(0, 3));
           },
           },
           errorCallback: function (data) {
           errorCallback: function (data) {
@@ -1079,18 +1083,18 @@ ${ assist.assistPanel() }
 
 
       self.comment.subscribe(function (newValue) {
       self.comment.subscribe(function (newValue) {
         // TODO: Switch to using the ko observables in the url (self.table.name() and self.table.database.name();
         // TODO: Switch to using the ko observables in the url (self.table.name() and self.table.database.name();
-##         $.post("${ url('metastore:alter_column', database=database, table=table.name) }", {
-##           column: self.name(),
-##           comment: newValue
-##         }, function () {
-##           self.vm.assistHelper.clearCache({
-##             sourceType: 'hive',
-##             databaseName: self.table.database.name,
-##             tableName: self.table.name,
-##             fields: []
-##           })
-##         });
-      })
+        ##         $.post("${ url('metastore:alter_column', database=database, table=table.name) }", {
+        ##           column: self.name(),
+        ##           comment: newValue
+        ##         }, function () {
+        ##           self.vm.assistHelper.clearCache({
+        ##             sourceType: 'hive',
+        ##             databaseName: self.table.database.name,
+        ##             tableName: self.table.name,
+        ##             fields: []
+        ##           })
+        ##         });
+              })
     }
     }
 
 
     /**
     /**
@@ -1114,7 +1118,7 @@ ${ assist.assistPanel() }
 
 
       self.selectedDatabases = ko.observableArray();
       self.selectedDatabases = ko.observableArray();
 
 
-      self.databaseQuery = ko.observable('').extend({ rateLimit: 150 });
+      self.databaseQuery = ko.observable('').extend({rateLimit: 150});
 
 
       self.filteredDatabases = ko.computed(function () {
       self.filteredDatabases = ko.computed(function () {
         if (self.databaseQuery() === '') {
         if (self.databaseQuery() === '') {
@@ -1135,7 +1139,7 @@ ${ assist.assistPanel() }
         self.assistHelper.loadDatabases({
         self.assistHelper.loadDatabases({
           sourceType: 'hive',
           sourceType: 'hive',
           callback: function (databaseNames) {
           callback: function (databaseNames) {
-            self.databases($.map(databaseNames, function(name) {
+            self.databases($.map(databaseNames, function (name) {
               return new MetastoreDatabase({
               return new MetastoreDatabase({
                 name: name,
                 name: name,
                 assistHelper: self.assistHelper
                 assistHelper: self.assistHelper
@@ -1153,7 +1157,9 @@ ${ assist.assistPanel() }
 
 
       var setDatabaseByName = function (databaseName, callback) {
       var setDatabaseByName = function (databaseName, callback) {
         if (self.database() && self.database().name == databaseName) {
         if (self.database() && self.database().name == databaseName) {
-          huePubSub.publish('metastore.url.change');
+          if (callback) {
+            callback();
+          }
           return;
           return;
         }
         }
         var foundDatabases = $.grep(self.databases(), function (database) {
         var foundDatabases = $.grep(self.databases(), function (database) {
@@ -1164,11 +1170,10 @@ ${ assist.assistPanel() }
         }
         }
       };
       };
 
 
-      var loadTableDef = function (tableDef) {
+      var loadTableDef = function (tableDef, callback) {
         setDatabaseByName(tableDef.database);
         setDatabaseByName(tableDef.database);
         if (self.database()) {
         if (self.database()) {
           if (self.database().table() && self.database().table().name == tableDef.name) {
           if (self.database().table() && self.database().table().name == tableDef.name) {
-            huePubSub.publish('metastore.url.change');
             return;
             return;
           }
           }
 
 
@@ -1177,11 +1182,11 @@ ${ assist.assistPanel() }
               return table.name === tableDef.name;
               return table.name === tableDef.name;
             });
             });
             if (foundTables.length === 1) {
             if (foundTables.length === 1) {
-              self.database().setTable(foundTables[0]);
+              self.database().setTable(foundTables[0], callback);
             }
             }
           };
           };
 
 
-          if (! self.database().loaded()) {
+          if (!self.database().loaded()) {
             var doOnce = self.database().loaded.subscribe(function () {
             var doOnce = self.database().loaded.subscribe(function () {
               setTableAfterLoad();
               setTableAfterLoad();
               doOnce.dispose();
               doOnce.dispose();
@@ -1222,13 +1227,22 @@ ${ assist.assistPanel() }
         });
         });
       });
       });
 
 
-      huePubSub.subscribe("assist.table.selected", loadTableDef);
+      huePubSub.subscribe("assist.table.selected", function (tableDef) {
+        loadTableDef(tableDef, function () {
+          huePubSub.publish('metastore.url.change')
+        });
+      });
 
 
       huePubSub.subscribe("assist.database.selected", function (databaseDef) {
       huePubSub.subscribe("assist.database.selected", function (databaseDef) {
-        setDatabaseByName(databaseDef.name);
+        if (self.database()) {
+          self.database().table(null);
+        }
+        setDatabaseByName(databaseDef.name, function () {
+          huePubSub.publish('metastore.url.change')
+        });
       });
       });
 
 
-      self.isLeftPanelVisible.subscribe(function(newValue) {
+      self.isLeftPanelVisible.subscribe(function (newValue) {
         $.totalStorage('spark_left_panel_visible', newValue);
         $.totalStorage('spark_left_panel_visible', newValue);
       });
       });
 
 
@@ -1236,7 +1250,7 @@ ${ assist.assistPanel() }
         if (self.database() && self.database().table()) {
         if (self.database() && self.database().table()) {
           hueUtils.changeURL('/metastore/table/' + self.database().name + '/' + self.database().table().name);
           hueUtils.changeURL('/metastore/table/' + self.database().name + '/' + self.database().table().name);
         }
         }
-        else if (self.database()){
+        else if (self.database()) {
           hueUtils.changeURL('/metastore/tables/' + self.database().name);
           hueUtils.changeURL('/metastore/tables/' + self.database().name);
         }
         }
         else {
         else {
@@ -1253,7 +1267,7 @@ ${ assist.assistPanel() }
         var path = window.location.pathname.split('/');
         var path = window.location.pathname.split('/');
         switch (path[2]) {
         switch (path[2]) {
           case 'databases':
           case 'databases':
-            if (self.database()){
+            if (self.database()) {
               self.database().table(null);
               self.database().table(null);
               self.database(null);
               self.database(null);
             }
             }
@@ -1282,18 +1296,17 @@ ${ assist.assistPanel() }
       var self = this;
       var self = this;
       self.database(metastoreDatabase);
       self.database(metastoreDatabase);
 
 
-      if (! metastoreDatabase.loaded()) {
+      if (!metastoreDatabase.loaded()) {
         metastoreDatabase.load(callback);
         metastoreDatabase.load(callback);
-      } else {
+      } else if (callback) {
         callback();
         callback();
       }
       }
-      huePubSub.publish('metastore.url.change');
     };
     };
 
 
     $(document).ready(function () {
     $(document).ready(function () {
       var options = {
       var options = {
         user: '${ user.username }',
         user: '${ user.username }',
-        i18n : {
+        i18n: {
           errorLoadingDatabases: "${ _('There was a problem loading the databases') }",
           errorLoadingDatabases: "${ _('There was a problem loading the databases') }",
           errorLoadingTablePreview: "${ _('There was a problem loading the table preview.') }"
           errorLoadingTablePreview: "${ _('There was a problem loading the table preview.') }"
         }
         }
@@ -1307,11 +1320,11 @@ ${ assist.assistPanel() }
       $('a[data-toggle="tab"]').on('shown', function (e) {
       $('a[data-toggle="tab"]').on('shown', function (e) {
         if ($(e.target).attr("href") == "#queries") {
         if ($(e.target).attr("href") == "#queries") {
           viewModel.loadingQueries(true);
           viewModel.loadingQueries(true);
-##           $.getJSON("${ url('metastore:table_queries', database=database, table=table.name) }", function (data) {
-##             viewModel.queries(data.queries);
-##             viewModel.loadingQueries(false);
-##           });
-        }
+          ##           $.getJSON("${ url('metastore:table_queries', database=database, table=table.name) }", function (data) {
+          ##             viewModel.queries(data.queries);
+          ##             viewModel.loadingQueries(false);
+          ##           });
+                  }
       });
       });
 
 
     });
     });
@@ -1320,7 +1333,7 @@ ${ assist.assistPanel() }
   $(document).ready(function () {
   $(document).ready(function () {
     function selectColumn(col) {
     function selectColumn(col) {
       var _t = $("#sampleTable");
       var _t = $("#sampleTable");
-      var _col = _t.find("th").filter(function() {
+      var _col = _t.find("th").filter(function () {
         return $.trim($(this).text()).indexOf(col) > -1;
         return $.trim($(this).text()).indexOf(col) > -1;
       });
       });
       _t.find(".columnSelected").removeClass("columnSelected");
       _t.find(".columnSelected").removeClass("columnSelected");
@@ -1335,7 +1348,7 @@ ${ assist.assistPanel() }
 
 
     if (window.location.hash != "") {
     if (window.location.hash != "") {
       if (window.location.hash.indexOf("col=") > -1) {
       if (window.location.hash.indexOf("col=") > -1) {
-        window.setTimeout(function(){
+        window.setTimeout(function () {
           selectColumn(window.location.hash.split("=")[1]);
           selectColumn(window.location.hash.split("=")[1]);
         }, 200)
         }, 200)
       }
       }
@@ -1367,30 +1380,30 @@ ${ assist.assistPanel() }
 
 
       for (var id in sortables) {
       for (var id in sortables) {
         $("#" + id).addClass("initialized");
         $("#" + id).addClass("initialized");
-##         % if len(table.cols) < 1000:
-##         $("#" + id).dataTable({
-##           "aoColumns": sortables[id],
-##           "bPaginate": false,
-##           "bLengthChange": false,
-##           "bInfo": false,
-##           "bFilter": false,
-##           "bAutoWidth": false,
-##           "fnInitComplete": function () {
-##             $(this).parent().jHueTableScroller();
-##             if (! $(this).hasClass("skip-extender")) {
-##               $(this).jHueTableExtender({
-##                 hintElement: "#jumpToColumnAlert",
-##                 fixedHeader: true
-##               });
-##             }
-##           },
-##           "oLanguage": {
-##             "sEmptyTable": "${_('No data available')}",
-##             "sZeroRecords": "${_('No matching records')}"
-##           }
-##         });
-##         % endif
-      }
+        ##         % if len(table.cols) < 1000:
+        ##         $("#" + id).dataTable({
+        ##           "aoColumns": sortables[id],
+        ##           "bPaginate": false,
+        ##           "bLengthChange": false,
+        ##           "bInfo": false,
+        ##           "bFilter": false,
+        ##           "bAutoWidth": false,
+        ##           "fnInitComplete": function () {
+        ##             $(this).parent().jHueTableScroller();
+        ##             if (! $(this).hasClass("skip-extender")) {
+        ##               $(this).jHueTableExtender({
+        ##                 hintElement: "#jumpToColumnAlert",
+        ##                 fixedHeader: true
+        ##               });
+        ##             }
+        ##           },
+        ##           "oLanguage": {
+        ##             "sEmptyTable": "${_('No data available')}",
+        ##             "sZeroRecords": "${_('No matching records')}"
+        ##           }
+        ##         });
+        ##         % endif
+              }
       if ($(e.target).attr("href") == "#columnAnalysisTerms") {
       if ($(e.target).attr("href") == "#columnAnalysisTerms") {
         $("#columnAnalysis .filter").removeClass("hide");
         $("#columnAnalysis .filter").removeClass("hide");
       }
       }
@@ -1400,30 +1413,30 @@ ${ assist.assistPanel() }
     });
     });
 
 
     $("#import-data-btn").click(function () {
     $("#import-data-btn").click(function () {
-##       $.get("${ url('metastore:load_table', database=database, table=table.name) }", function (response) {
-##           $("#import-data-modal").html(response['data']);
-##           $("#import-data-modal").modal("show");
-##         }
-##       );
-    });
+      ##       $.get("${ url('metastore:load_table', database=database, table=table.name) }", function (response) {
+      ##           $("#import-data-modal").html(response['data']);
+      ##           $("#import-data-modal").modal("show");
+      ##         }
+      ##       );
+          });
 
 
     // convert link text to URLs in comment column (Columns tab)
     // convert link text to URLs in comment column (Columns tab)
     hueUtils.text2Url(document.querySelectorAll('.sampleTable td:last-child'));
     hueUtils.text2Url(document.querySelectorAll('.sampleTable td:last-child'));
 
 
     $('a[data-toggle="tab"]:eq(0)').click();
     $('a[data-toggle="tab"]:eq(0)').click();
 
 
-##     $("a[data-column]").on("click", function () {
-##       var _link = $(this);
-##       var _col = _link.data("column");
-##       var statsUrl = "/beeswax/api/table/${database}/${table.name}/stats/" + _col;
-##       var refreshUrl = "/beeswax/api/analyze/${database}/${table.name}/" + _col;
-##       var termsUrl = "/beeswax/api/table/${database}/${table.name}/terms/" + _col + "/";
-##       $("#columnAnalysisStats .content").html("<i class='fa fa-spinner fa-spin'></i>");
-##       $("#columnAnalysis").show().css("top", _link.position().top - $("#columnAnalysis").outerHeight() / 2 + _link.outerHeight() / 2).css("left", _link.position().left + _link.outerWidth());
-##       showColumnStats(statsUrl, refreshUrl, termsUrl, _col, STATS_PROBLEMS, function () {
-##         $("#columnAnalysis").show().css("top", _link.position().top - $("#columnAnalysis").outerHeight() / 2 + _link.outerHeight() / 2).css("left", _link.position().left + _link.outerWidth());
-##       });
-##     });
+    ##     $("a[data-column]").on("click", function () {
+    ##       var _link = $(this);
+    ##       var _col = _link.data("column");
+    ##       var statsUrl = "/beeswax/api/table/${database}/${table.name}/stats/" + _col;
+    ##       var refreshUrl = "/beeswax/api/analyze/${database}/${table.name}/" + _col;
+    ##       var termsUrl = "/beeswax/api/table/${database}/${table.name}/terms/" + _col + "/";
+    ##       $("#columnAnalysisStats .content").html("<i class='fa fa-spinner fa-spin'></i>");
+    ##       $("#columnAnalysis").show().css("top", _link.position().top - $("#columnAnalysis").outerHeight() / 2 + _link.outerHeight() / 2).css("left", _link.position().left + _link.outerWidth());
+    ##       showColumnStats(statsUrl, refreshUrl, termsUrl, _col, STATS_PROBLEMS, function () {
+    ##         $("#columnAnalysis").show().css("top", _link.position().top - $("#columnAnalysis").outerHeight() / 2 + _link.outerHeight() / 2).css("left", _link.position().left + _link.outerWidth());
+    ##       });
+    ##     });
 
 
     $(document).on("click", "#columnAnalysis .close-popover", function () {
     $(document).on("click", "#columnAnalysis .close-popover", function () {
       $("#columnAnalysis").hide();
       $("#columnAnalysis").hide();