Browse Source

HUE-3078 [impala] Ask if the user wants to invalidate on refresh for Impala

Johan Ahlen 9 years ago
parent
commit
7459cef359

+ 9 - 5
desktop/core/src/desktop/static/desktop/js/assist/assistDbEntry.js

@@ -53,6 +53,10 @@
     self.filter = filter;
     self.isSearchVisible = assistDbSource.isSearchVisible;
     self.editingSearch = ko.observable(false);
+    self.sourceType = self.assistDbSource.sourceType;
+    self.dontAskForInvalidate = self.assistDbSource.dontAskForInvalidate;
+    self.dontAskForInvalidateTemp = self.assistDbSource.dontAskForInvalidateTemp;
+    self.invalidateOnRefresh =  self.assistDbSource.invalidateOnRefresh;
 
     self.expandable = typeof definition.type === "undefined" || /table|view|struct|array|map/i.test(definition.type);
 
@@ -119,7 +123,7 @@
           break;
         }
         if (entry.definition.isArray || entry.definition.isMapValue) {
-          if (self.assistDbSource.type === 'hive') {
+          if (self.assistDbSource.sourceType === 'hive') {
             parts.push("[]");
           }
         } else {
@@ -142,7 +146,7 @@
 
   AssistDbEntry.prototype.triggerRefresh = function () {
     var self = this;
-    huePubSub.publish('assist.db.refresh', self.assistDbSource.type);
+    self.assistDbSource.triggerRefresh();
   };
 
   AssistDbEntry.prototype.loadEntries = function() {
@@ -257,7 +261,7 @@
     };
 
     self.assistDbSource.assistHelper.fetchPanelData({
-      sourceType: self.assistDbSource.type,
+      sourceType: self.assistDbSource.sourceType,
       hierarchy: self.getHierarchy(),
       successCallback: successCallback,
       errorCallback: errorCallback
@@ -311,7 +315,7 @@
       })
     } else if (self.definition.isDatabase) {
       huePubSub.publish("assist.database.selected", {
-        source: self.assistDbSource.type,
+        source: self.assistDbSource.sourceType,
         name: self.definition.name
       })
     }
@@ -332,7 +336,7 @@
     $assistQuickLook.attr("style", "width: " + ($(window).width() - 120) + "px;margin-left:-" + (($(window).width() - 80) / 2) + "px!important;");
 
     self.assistDbSource.assistHelper.fetchTableSample({
-      sourceType: self.assistDbSource.type === "hive" ? "beeswax" : self.assistDbSource.type,
+      sourceType: self.assistDbSource.sourceType === "hive" ? "beeswax" : self.assistDbSource.sourceType,
       databaseName: databaseName,
       tableName: tableName,
       dataType: "html",

+ 18 - 9
desktop/core/src/desktop/static/desktop/js/assist/assistDbSource.js

@@ -37,7 +37,7 @@
     self.i18n = options.i18n;
     self.navigationSettings = options.navigationSettings;
     self.assistHelper = options.assistHelper;
-    self.type = options.type;
+    self.sourceType = options.type;
     self.name = options.name;
 
     self.hasErrors = ko.observable(false);
@@ -45,6 +45,12 @@
     self.isSearchVisible = ko.observable(false);
     self.editingSearch = ko.observable(false);
 
+    self.dontAskForInvalidate = ko.observable();
+    self.dontAskForInvalidateTemp = ko.observable();
+    self.assistHelper.withTotalStorage('assist', 'dontAskForInvalidate', self.dontAskForInvalidate, false);
+    self.invalidateOnRefresh = ko.observable();
+    self.assistHelper.withTotalStorage('assist', 'invalidateOnRefresh', self.invalidateOnRefresh, true);
+
     self.filter = {
       query: ko.observable("").extend({ rateLimit: 150 })
     };
@@ -53,11 +59,11 @@
       return self.filter.query().length !== 0;
     });
 
-    var storageSearchVisible = $.totalStorage(self.type + ".assist.searchVisible");
+    var storageSearchVisible = $.totalStorage(self.sourceType + ".assist.searchVisible");
     self.searchVisible = ko.observable(storageSearchVisible || false);
 
     self.searchVisible.subscribe(function (newValue) {
-      $.totalStorage(self.type + ".assist.searchVisible", newValue);
+      $.totalStorage(self.sourceType + ".assist.searchVisible", newValue);
     });
 
     self.databases = ko.observableArray();
@@ -100,7 +106,7 @@
         }
         $.totalStorage("hue.assist.lastSelectedDb." + self.assistHelper.getTotalStorageUserPrefix(), newValue.definition.name);
         huePubSub.publish("assist.database.set", {
-          source: self.type,
+          source: self.sourceType,
           name: newValue.definition.name
         })
       }
@@ -157,8 +163,9 @@
       self.loading(true);
       var lastSelectedDb = self.selectedDatabase() ? self.selectedDatabase().definition.name : null;
       self.selectedDatabase(null);
+      self.databases([]);
       self.assistHelper.loadDatabases({
-        sourceType: self.type,
+        sourceType: self.sourceType,
         successCallback: function(data) {
           self.hasErrors(false);
           updateDatabases(data, lastSelectedDb)
@@ -180,14 +187,15 @@
     self.reload = function() {
       self.reloading(true);
       huePubSub.publish('assist.clear.db.cache', {
-        sourceType: self.type,
-        clearAll: true
+        sourceType: self.sourceType,
+        clearAll: true,
+        invalidateImpala: self.invalidateOnRefresh()
       });
       self.initDatabases();
     };
 
     huePubSub.subscribe('assist.db.refresh', function (type) {
-      if (self.type === type) {
+      if (self.sourceType === type) {
         self.reload();
       }
     });
@@ -201,7 +209,8 @@
 
   AssistDbSource.prototype.triggerRefresh = function () {
     var self = this;
-    huePubSub.publish('assist.db.refresh', self.type);
+    self.dontAskForInvalidate(self.dontAskForInvalidateTemp());
+    huePubSub.publish('assist.db.refresh', self.sourceType);
   };
 
   return AssistDbSource;

+ 2 - 1
desktop/core/src/desktop/static/desktop/js/assist/assistHelper.js

@@ -440,13 +440,14 @@
    * @param {Object} options
    * @param {string} options.sourceType
    * @param {string} [options.databaseName]
+   * @param {boolean} [options.invalidateImpala]
    * @param {string} [options.tableName]
    * @param {string[]} [options.fields]
    * @param {boolean} [options.clearAll]
    */
   AssistHelper.prototype.clearDbCache = function (options) {
     var self = this;
-    self.invalidateImpala = options.sourceType === 'impala' && options.clearAll;
+    self.invalidateImpala = options.invalidateImpala || false;
     if (options.clearAll) {
       $.totalStorage("hue.assist." + self.getTotalStorageUserPrefix(options.sourceType), {});
     } else {

+ 2 - 0
desktop/core/src/desktop/static/desktop/js/ko.hue-bindings.js

@@ -493,6 +493,8 @@
         visible = false;
       };
 
+      huePubSub.subscribe('close.popover', hidePopover);
+
       var showPopover = function () {
         ko.renderTemplate(options.contentTemplate, viewModel, {
           afterRender: function () {

+ 26 - 4
desktop/core/src/desktop/templates/assist.mako

@@ -321,7 +321,7 @@ from desktop.views import _ko
       <a class="inactive-action" href="javascript:void(0)" data-bind="visible: (definition.isTable || definition.isView) && navigationSettings.showPreview, click: showPreview"><i class="fa fa-list" title="${_('Preview Sample data')}"></i></a>
       <span data-bind="visible: navigationSettings.showStats, component: { name: 'table-stats', params: {
           statsVisible: statsVisible,
-          sourceType: assistDbSource.type,
+          sourceType: sourceType,
           snippet: assistDbSource.snippet,
           databaseName: databaseName,
           tableName: tableName,
@@ -337,7 +337,7 @@ from desktop.views import _ko
     <li class="assist-table" data-bind="visibleOnHover: { override: statsVisible, selector: '.table-actions' }">
       <div class="assist-actions table-actions" style="opacity: 0">
         <a class="inactive-action" href="javascript:void(0)" data-bind="visible: navigationSettings.showPreview, click: showPreview"><i class="fa fa-list" title="${_('Preview Sample data')}"></i></a>
-        <span data-bind="visible: navigationSettings.showStats, component: { name: 'table-stats', params: { statsVisible: statsVisible, sourceType: assistDbSource.type, snippet: assistDbSource.snippet, databaseName: databaseName, tableName: tableName, columnName: columnName, fieldType: definition.type, assistHelper: assistDbSource.assistHelper }}"></span>
+        <span data-bind="visible: navigationSettings.showStats, component: { name: 'table-stats', params: { statsVisible: statsVisible, sourceType: sourceType, snippet: assistDbSource.snippet, databaseName: databaseName, tableName: tableName, columnName: columnName, fieldType: definition.type, assistHelper: assistDbSource.assistHelper }}"></span>
         <a class="inactive-action" href="javascript:void(0)" data-bind="visible: navigationSettings.openItem, click: openItem"><i class="fa fa-long-arrow-right" title="${_('Open')}"></i></a>
       </div>
       <a class="assist-entry assist-table-link" href="javascript:void(0)" data-bind="multiClick: { click: toggleOpen, dblClick: dblClick }, attr: {'title': definition.title }"><i class="fa fa-fw fa-table muted valign-middle"></i><span draggable="true" data-bind="text: definition.displayName, draggableText: { text: editorText }"></span></a>
@@ -575,16 +575,38 @@ from desktop.views import _ko
     </div>
   </script>
 
+  <script type="text/html" id="ask-for-invalidate-title">
+    <a class="pull-right pointer close-popover inactive-action"><i class="fa fa-times"></i></a>
+  </script>
+
+  <script type="text/html" id="ask-for-invalidate-content">
+    <label class="checkbox" style="margin-bottom: 2px;"><input type="checkbox" data-bind="checked: invalidateOnRefresh" /> ${ _('Invalidate metadata') }</label>
+    <div style="display: inline-block; margin-left: 20px; font-style: italic">${ _('This could take a noticeable amount of time') }</div>
+    <label class="checkbox" style="margin-top: 4px;"><input type="checkbox" data-bind="checked: dontAskForInvalidateTemp" /> ${ _('Remember my decision') }</label>
+    <div style="width: 100%; display: inline-block; margin-top: 5px;"><button class="pull-right btn btn-primary" data-bind="click: function () { huePubSub.publish('close.popover'); triggerRefresh(); }, clickBubble: false">${ _('Refresh') }</button></div>
+  </script>
+
   <script type="text/html" id="assist-db-header-actions">
     <div class="assist-db-header-actions" data-bind="visible: hasEntries() && (!$parent.loading() && !$parent.hasErrors()">
       <span class="assist-tables-counter">(<span data-bind="text: filteredEntries().length"></span>)</span>
       <!-- ko ifnot: loading -->
       <a class="inactive-action" href="javascript:void(0)" data-bind="click: toggleSearch, css: { 'blue' : isSearchVisible }"><i class="pointer fa fa-search" title="${_('Search')}"></i></a>
+      <!-- ko if: sourceType === 'impala' -->
+      <!-- ko if: dontAskForInvalidate -->
+      <a class="inactive-action" href="javascript:void(0)" data-bind="click: triggerRefresh"><i class="pointer fa fa-refresh" data-bind="css: { 'fa-spin blue' : loading }" title="${_('Manually refresh the table list')}"></i></a>
+      <!-- /ko -->
+      <!-- ko ifnot: dontAskForInvalidate -->
+      <a class="inactive-action" href="javascript:void(0)" data-bind="templatePopover : { contentTemplate: 'ask-for-invalidate-content', titleTemplate: 'ask-for-invalidate-title', trigger: 'click', minWidth: '320px' }"><i class="pointer fa fa-refresh" data-bind="css: { 'fa-spin blue' : loading }" title="${_('Manually refresh the table list')}"></i></a>
+      <!-- /ko -->
+      <!-- /ko -->
+      <!-- ko if: sourceType !== 'impala' -->
+      <a class="inactive-action" href="javascript:void(0)" data-bind="click: triggerRefresh"><i class="pointer fa fa-refresh" data-bind="css: { 'fa-spin blue' : loading }" title="${_('Manually refresh the table list')}"></i></a>
+      <!-- /ko -->
       <!-- /ko -->
       <!-- ko if: loading -->
       <span style="color: #aaa;"><i class="fa fa-search" title="${_('Search')}"></i></span>
+      <i class="fa fa-refresh fa-spin blue" title="${_('Manually refresh the table list')}"></i></a>
       <!-- /ko -->
-      <a class="inactive-action" href="javascript:void(0)" data-bind="click: triggerRefresh"><i class="pointer fa fa-refresh" data-bind="css: { 'fa-spin blue' : loading }" title="${_('Manually refresh the table list')}"></i></a>
     </div>
   </script>
 
@@ -876,7 +898,7 @@ from desktop.views import _ko
         self.selectedSource.subscribe(function (newSource) {
           if (newSource) {
             newSource.initDatabases();
-            self.assistHelper.setInTotalStorage('assist', 'lastSelectedSource', newSource.type);
+            self.assistHelper.setInTotalStorage('assist', 'lastSelectedSource', newSource.sourceType);
           } else {
             self.assistHelper.setInTotalStorage('assist', 'lastSelectedSource');
           }