You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by al...@apache.org on 2015/05/08 20:02:44 UTC

[2/3] ambari git commit: AMBARI-10997. Improve Error Handling - hive view (alexantonenko)

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/components/query-editor.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/components/query-editor.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/components/query-editor.js
index 01ba37e..f119fc8 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/components/query-editor.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/components/query-editor.js
@@ -87,14 +87,14 @@ export default Ember.Component.extend({
 
     editor = this.get('editor');
 
-    editor.on('cursorActivity', function() {
+    editor.on('cursorActivity', function () {
       self.set('highlightedText', editor.getSelections());
     });
 
     editor.setValue(this.get('query') || '');
 
     editor.on('change', function (instance) {
-      Ember.run(function() {
+      Ember.run(function () {
         self.set('query', instance.getValue());
       });
     });
@@ -110,7 +110,7 @@ export default Ember.Component.extend({
     this.tablesChanged();
   }.on('didInsertElement'),
 
-  updateValue: function() {
+  updateValue: function () {
     var query = this.get('query');
     var editor = this.get('editor');
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/components/query-tabs.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/components/query-tabs.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/components/query-tabs.js
deleted file mode 100644
index 0ef6768..0000000
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/components/query-tabs.js
+++ /dev/null
@@ -1,121 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import Ember from 'ember';
-
-export default Ember.Component.extend({
-  tabClassNames : "fa queries-icon query-context-tab",
-  openOverlayAction   : 'openOverlay',
-  closeOverlayAction  : 'closeOverlay',
-
-  tabs: [
-    Ember.Object.create({
-      iconClass: 'fa-code',
-      action: 'setDefaultActive'
-    }),
-    Ember.Object.create({
-      iconClass: 'fa-gear',
-      action: 'toggleOverlay',
-      template: 'settings',
-      outlet: 'overlay',
-      into: 'open-queries'
-    }),
-    Ember.Object.create({
-      iconClass: 'fa-bar-chart',
-      action: 'toggleOverlay',
-      template: 'visual-explain',
-      outlet: 'overlay',
-      into: 'index'
-    }),
-    Ember.Object.create({
-      iconClass: 'text-icon',
-      text: 'TEZ',
-      action: 'toggleOverlay',
-      template: 'tez-ui',
-      outlet: 'overlay',
-      into: 'index'
-    }),
-    Ember.Object.create({
-      iconClass: 'fa-envelope',
-      action: 'toggleOverlay',
-      template: 'messages',
-      outlet: 'overlay',
-      into: 'open-queries',
-      badgeProperty: 'count'
-    })
-  ],
-
-  setDefaultTab: function() {
-    var defaultTab = this.get('tabs.firstObject');
-
-    defaultTab.set('active', true);
-    this.set('default', defaultTab);
-    this.set('active', defaultTab);
-  }.on('init'),
-
-  setupTabsBadges: function() {
-    var tabs = this.get('tabs');
-    var self = this;
-
-    tabs.map(function(tab) {
-      if (tab.get('badgeProperty')) {
-        var controller = self.container.lookup('controller:' + tab.get('template'));
-        tab.set('controller', controller);
-
-        Ember.oneWay(tab, 'badge', 'controller.count');
-      }
-    });
-  }.on('init'),
-
-  closeActiveOverlay: function() {
-    this.sendAction('closeOverlayAction', this.get('active'));
-  },
-
-  openOverlay: function(tab) {
-    this.closeActiveOverlay();
-    this.set('active.active', false);
-    tab.set('active', true);
-    this.set('active', tab);
-    this.sendAction('openOverlayAction', tab);
-  },
-
-  setDefaultActive: function() {
-    var active     = this.get('active');
-    var defaultTab = this.get('default');
-
-    if (active !== defaultTab) {
-      this.closeActiveOverlay();
-      defaultTab.set('active', true);
-      active.set('active', false);
-      this.set('active', defaultTab);
-    }
-  },
-
-  actions: {
-    toggleOverlay: function(tab) {
-      if (tab !== this.get('default') && tab.get('active')) {
-        this.setDefaultActive();
-      } else {
-        this.openOverlay(tab);
-      }
-    },
-
-    setDefaultActive: function() {
-      this.setDefaultActive();
-    }
-  }
-});

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/components/typeahead-widget.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/components/typeahead-widget.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/components/typeahead-widget.js
index 51f09be..b38c891 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/components/typeahead-widget.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/components/typeahead-widget.js
@@ -20,7 +20,7 @@ import Typeahead from 'ember-cli-selectize/components/ember-selectize';
 import Ember from 'ember';
 
 export default Typeahead.extend(Ember.I18n.TranslateableProperties, {
-  didInsertElement: function() {
+  didInsertElement: function () {
     this._super();
 
     if (!this.get('selection') && this.get('content.firstObject')) {
@@ -30,8 +30,7 @@ export default Typeahead.extend(Ember.I18n.TranslateableProperties, {
     this.selectize.on('dropdown_close', Ember.$.proxy(this.onClose, this));
   },
 
-  removeExcludedObserver: function() {
-    var self    = this;
+  removeExcludedObserver: function () {
     var options = this.get('content');
 
     if (!options) {
@@ -42,8 +41,7 @@ export default Typeahead.extend(Ember.I18n.TranslateableProperties, {
     }
   }.observes('excluded.@each.key').on('init'),
 
-  removeExcluded: function(shouldReturn) {
-    var self            = this;
+  removeExcluded: function (shouldReturn) {
     var excluded        = this.get('excluded') || [];
     var options         = this.get('options');
     var selection       = this.get('selection');
@@ -59,9 +57,12 @@ export default Typeahead.extend(Ember.I18n.TranslateableProperties, {
       objectToModify = Ember.copy(options);
     }
 
+    var valuePath = this.get('optionValuePath');
+    var selectionName = selection ? selection[valuePath] : selection;
+
     if (options) {
-      options.forEach(function(option, index) {
-        if (excluded.contains(option) && option !== selection) {
+      options.forEach(function (option) {
+        if (excluded.contains(option) && option.name !== selectionName) {
           objectsToRemove.push(option);
         } else if (!objectToModify.contains(option)) {
           objectsToAdd.push(option);
@@ -75,13 +76,13 @@ export default Typeahead.extend(Ember.I18n.TranslateableProperties, {
     return objectToModify;
   },
 
-  onClose: function() {
+  onClose: function () {
     if (!this.get('selection') && this.get('prevSelection')) {
       this.set('selection', this.get('prevSelection'));
     }
   },
 
-  _onItemAdd: function(value) {
+  _onItemAdd: function (value) {
     this._super(value);
 
     this.set('prevSelection', this.get('selection'));

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/databases.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/databases.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/databases.js
index 0b103cd..77b5fe5 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/databases.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/databases.js
@@ -209,24 +209,24 @@ export default Ember.ArrayController.extend({
   }.property(),
 
   actions: {
-    refreshDatabaseExplorer: function() {
+    refreshDatabaseExplorer: function () {
       var self = this;
       var selectedDatabase = this.get('selectedDatabase');
 
       this.store.unloadAll('database');
-      this.store.fetchAll('database').then(function() {
+      this.store.fetchAll('database').then(function () {
         var database = self.get('model').findBy('id', selectedDatabase.get('id'));
         self.set('selectedDatabase', database);
-      }).catch(function(response) {
+      }).catch(function (response) {
         self.notify.error(response.responseJSON.message, response.responseJSON.trace);
       });
     },
 
-    loadSampleData: function(tableName, database) {
+    loadSampleData: function (tableName, database) {
       var self = this;
       this.send('addQuery', Ember.I18n.t('titles.tableSample', { tableName: tableName }));
 
-      Ember.run.later(function() {
+      Ember.run.later(function () {
         var query = constants.sampleDataQuery.fmt(tableName);
 
         self.set('selectedDatabase', database);

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/history.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/history.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/history.js
index a5de342..30e9b9b 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/history.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/history.js
@@ -142,6 +142,31 @@ export default Ember.ArrayController.extend(FilterableMixin, {
       job.destroyRecord().then(function () {
         self.store.find(constants.namingConventions.job, id);
       });
+    },
+
+    clearFilters: function () {
+      var columns = this.get('columns');
+
+      if (columns) {
+        columns.forEach(function (column) {
+          var filterValue = column.get('filterValue');
+          var rangeFilter;
+
+          if (filterValue) {
+            if (typeof filterValue === 'string') {
+              column.set('filterValue');
+            } else {
+              rangeFilter = column.get('numberRange') || column.get('dateRange');
+
+              rangeFilter.set('from', rangeFilter.get('min'));
+              rangeFilter.set('to', rangeFilter.get('max'));
+            }
+          }
+        });
+      }
+
+      //call clear filters from Filterable mixin
+      this.clearFilters();
     }
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index.js
index df2d088..fa79048 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index.js
@@ -29,7 +29,8 @@ export default Ember.Controller.extend({
            constants.namingConventions.jobExplain,
            constants.namingConventions.settings,
            constants.namingConventions.visualExplain,
-           constants.namingConventions.tezUI
+           constants.namingConventions.tezUI,
+           constants.namingConventions.jobProgress,
   ],
 
   openQueries: Ember.computed.alias('controllers.' + constants.namingConventions.openQueries),
@@ -41,19 +42,7 @@ export default Ember.Controller.extend({
   settings: Ember.computed.alias('controllers.' + constants.namingConventions.settings),
   visualExplain: Ember.computed.alias('controllers.' + constants.namingConventions.visualExplain),
   tezUI: Ember.computed.alias('controllers.' + constants.namingConventions.tezUI),
-
-  isQueryTabActive: function() {
-    return !this.get('tezUI.showOverlay') && !this.get('visualExplain.showOverlay') && !this.get('settings.showOverlay');
-  }.property('tezUI.showOverlay', 'visualExplain.showOverlay', 'settings.showOverlay'),
-
-  shouldShowTez: function() {
-    return this.get('model.dagId') && this.get('tezUI.isTezViewAvailable');
-  }.property('model.dagId', 'tezUI.isTezViewAvailable'),
-
-  shouldShowVisualExplain: function () {
-    return this.get('openQueries.currentQuery.fileContent');
-  }.property('openQueries.currentQuery.fileContent'),
-
+  jobProgress: Ember.computed.alias('controllers.' + constants.namingConventions.jobProgress),
 
   canExecute: function () {
     var isModelRunning = this.get('model.isRunning');
@@ -199,10 +188,26 @@ export default Ember.Controller.extend({
   },
 
   prependQuerySettings: function (query) {
-    var settings = this.get('settings').getSettingsString();
+    var validSettings = this.get('settings').getCurrentValidSettings();
+    var regex = new RegExp(utils.regexes.setSetting);
+    var existingSettings = query.match(regex);
+
+    //clear previously added settings
+    if (existingSettings) {
+      existingSettings.forEach(function (setting) {
+        query = query.replace(setting, '');
+      });
+    }
+
+    query = query.trim();
 
-    if (settings.length) {
-      return settings + "\n\n" + query;
+    //update with the current settings
+    if (validSettings) {
+      query = '\n' + query;
+
+      validSettings.forEach(function (setting) {
+        query = setting + '\n' + query;
+      });
     }
 
     return query;
@@ -221,16 +226,16 @@ export default Ember.Controller.extend({
     }
 
     queries = queryComponents.queryString.split(';');
-    queries = queries.map(function(s) {
+    queries = queries.map(function (s) {
       return s.trim();
     });
     queries = queries.filter(Boolean);
 
     // return false if multiple queries are selected
     // @FIXME: Remove this to support multiple queries
-    if (queries.length > 1) {
-      return false;
-    }
+    // if (queries.length > 1) {
+    //   return false;
+    // }
 
     queries = queries.map(function (query) {
       if (shouldExplain) {
@@ -335,7 +340,7 @@ export default Ember.Controller.extend({
     });
   }.observes('content'),
 
-  selectedDatabaseChanged: function() {
+  selectedDatabaseChanged: function () {
     this.set('content.dataBase', this.get('databases.selectedDatabase.name'));
   }.observes('databases.selectedDatabase'),
 
@@ -447,7 +452,7 @@ export default Ember.Controller.extend({
       this.saveToHDFS();
     },
 
-    downloadAsCSV: function() {
+    downloadAsCSV: function () {
       var self = this,
           defer = Ember.RSVP.defer();
 
@@ -467,7 +472,7 @@ export default Ember.Controller.extend({
     },
 
     insertUdf: function (item) {
-      var query = this.get('openQueries').getQueryForModel(this.get('model'));
+      var query = this.get('openQueries.currentQuery');
 
       var queryString = query.get('fileContent');
 
@@ -523,7 +528,8 @@ export default Ember.Controller.extend({
       //case 4. Update an existing query tab. -> route doesn't change
 
       var self = this,
-          defer = Ember.RSVP.defer();
+          defer = Ember.RSVP.defer(),
+          currentQuery = this.get('openQueries.currentQuery');
 
       this.set('model.dataBase', this.get('databases.selectedDatabase.name'));
 
@@ -536,6 +542,8 @@ export default Ember.Controller.extend({
       });
 
       defer.promise.then(function (result) {
+        currentQuery.set('fileContent', self.prependQuerySettings(currentQuery.get('fileContent')));
+
         if (result.get('overwrite')) {
           self.get('openQueries').save(self.get('content'), null, true, result.get('text'));
         } else {
@@ -578,41 +586,6 @@ export default Ember.Controller.extend({
       }, function (err) {
         this.notify.error(err.responseJSON.message, err.responseJSON.trace);
       });
-    },
-
-    toggleOverlay: function (targetController) {
-      var self = this;
-
-      if (this.get('visualExplain.showOverlay') && targetController !== 'visualExplain') {
-        this.set('visualExplain.showOverlay', false);
-      } else if (this.get('tezUI.showOverlay') && targetController !== 'tezUI') {
-        this.set('tezUI.showOverlay', false);
-      } else if (this.get('settings.showOverlay') && targetController !== 'settings') {
-        this.set('settings.showOverlay', false);
-      }
-
-      if (!targetController) {
-        return;
-      }
-
-      if (targetController !== 'settings') {
-        //set content for visual explain and tez ui.
-        this.set(targetController + '.content', this.get('content'));
-      }
-
-      if (targetController === 'visualExplain' && !this.get(targetController + '.showOverlay')) {
-        this._executeQuery(true, true).then(function (json) {
-          //this condition should be changed once we change the way of retrieving this json
-          if (json['STAGE PLANS']['Stage-1']) {
-            self.set(targetController + '.json', json);
-            self.toggleProperty(targetController + '.showOverlay');
-          }
-        }, function (err) {
-          self.notify.error(err.responseJSON.message, err.responseJSON.trace);
-        });
-      } else {
-        this.toggleProperty(targetController + '.showOverlay');
-      }
     }
   }
-});
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index/history-query/explain.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index/history-query/explain.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index/history-query/explain.js
index e61df51..2f3e78d 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index/history-query/explain.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index/history-query/explain.js
@@ -80,7 +80,6 @@ export default Ember.ObjectController.extend({
         currentNode,
         currentNodeWhitespace,
         previousNode,
-        formattedExplain = [],
         getLeadingWhitespacesCount = function (str) {
           return str.replace(utils.regexes.whitespaces, '$1').length;
         };
@@ -96,7 +95,7 @@ export default Ember.ObjectController.extend({
                       text: str,
                       parentNode: null,
                       contents: []
-                    }
+                    };
                   });
 
     for (var i = 0; i < explainSet.length; i++) {
@@ -130,4 +129,4 @@ export default Ember.ObjectController.extend({
 
     this.set('formattedExplain', formatted);
   }
-});
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index/history-query/logs.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index/history-query/logs.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index/history-query/logs.js
index 59c0892..c75fffe 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index/history-query/logs.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index/history-query/logs.js
@@ -21,8 +21,10 @@ import constants from 'hive/utils/constants';
 import utils from 'hive/utils/functions';
 
 export default Ember.ObjectController.extend({
-  needs: [ constants.namingConventions.loadedFiles ],
+  needs: [ constants.namingConventions.queryTabs,
+           constants.namingConventions.loadedFiles ],
 
+  queryTabs: Ember.computed.alias('controllers.' + constants.namingConventions.queryTabs),
   files: Ember.computed.alias('controllers.' + constants.namingConventions.loadedFiles),
 
   reloadJobLogs: function (job) {
@@ -68,19 +70,22 @@ export default Ember.ObjectController.extend({
 
       this.reloadJobLogs(job).then(function () {
         var stillRunning = self.isJobRunning(job);
+        var currentContentId = self.get('content.id');
+        var currentActiveTab = self.get('queryTabs.activeTab.name');
 
         //if the current model is the same with the one displayed, continue reloading job
-        if (stillRunning && job.get('id') === self.get('content.id')) {
+        if (stillRunning && job.get('id') === currentContentId) {
           self.listenForUpdates(job);
         } else if (!stillRunning) {
           job.set('isRunning', undefined);
 
-          if (job.get('id') === self.get('content.id')) {
+          if (job.get('id') === currentContentId &&
+              currentActiveTab === constants.namingConventions.index) {
             self.transitionToRoute(constants.namingConventions.subroutes.jobResults);
           }
         }
       });
-    }, 2000);
+    }, 10000);
   },
 
   isJobRunning: function (job) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index/history-query/results.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index/history-query/results.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index/history-query/results.js
index 9a50f27..dc7c199 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index/history-query/results.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/index/history-query/results.js
@@ -24,19 +24,19 @@ export default Ember.ObjectController.extend({
   cachedResults: [],
   formattedResults: [],
 
-  processResults: function() {
+  processResults: function () {
     var results = this.get('results');
 
     if (!results || !results.schema || !results.rows) {
       return;
     }
 
-    var schema = results.schema.map(function(column) {
+    var schema = results.schema.map(function (column) {
       return {
         name: column[0],
         type: column[1],
         index: column[2]
-      }
+      };
     });
 
     this.set('formattedResults', { schema: schema, rows: results.rows });

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/job-progress.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/job-progress.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/job-progress.js
new file mode 100644
index 0000000..737506e
--- /dev/null
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/job-progress.js
@@ -0,0 +1,92 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import constants from 'hive/utils/constants';
+
+export default Ember.Controller.extend({
+  needs: [ constants.namingConventions.index ],
+
+  index: Ember.computed.alias('controllers.' + constants.namingConventions.index),
+
+  listenForProgress: function () {
+    var self = this;
+    var url = this.container.lookup('adapter:application').buildURL();
+    var stages = [];
+    var job = this.get('index.model');
+
+    var reloadProgress = function () {
+      Ember.run.later(function () {
+        Ember.$.getJSON(url).then(function (data) {
+          var total = 0;
+          var length = Object.keys(data.vertexProgresses).length;
+
+          if (!self.get('stages.length')) {
+            data.vertexProgresses.forEach(function (vertexProgress) {
+              var progress = vertexProgress.progress * 100;
+
+              stages.pushObject(Ember.Object.create({
+                name: vertexProgress.name,
+                value: progress
+              }));
+
+              total += progress;
+            });
+
+            self.set('stages', stages);
+          } else {
+            data.vertexProgresses.forEach(function (vertexProgress) {
+              var progress = vertexProgress.progress * 100;
+
+              self.get('stages').findBy('name', vertexProgress.name).set('value', progress);
+
+              total += progress;
+            });
+          }
+
+          total /= length;
+
+          self.set('totalProgress', total);
+
+          if (job.get('isRunning')) {
+            reloadProgress();
+          }
+
+        }, function (err) {
+          reloadProgress();
+        });
+      }, 1000);
+    };
+
+    //reset stages
+    this.set('stages', []);
+    this.set('totalProgress', 0);
+
+    if (!job.get('applicationId')) {
+      return;
+    }
+
+    url += '/' + constants.namingConventions.jobs + '/' + job.get('id') + '/progress';
+
+    reloadProgress();
+  }.observes('index.model', 'index.model.applicationId'),
+
+  displayProgress: function () {
+    return this.get('index.model.constructor.typeKey') === constants.namingConventions.job;
+  }.property('index.model')
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/job.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/job.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/job.js
index 7e62c20..2d53524 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/job.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/job.js
@@ -26,7 +26,7 @@ export default Ember.ObjectController.extend({
   files: Ember.computed.alias('controllers.' + constants.namingConventions.loadedFiles),
 
   canStop: function () {
-    return utils.insensitiveCompare(this.get('status'), constants.statuses.running, constants.statuses.initialized, constants.statuses.pending)
+    return utils.insensitiveCompare(this.get('status'), constants.statuses.running, constants.statuses.initialized, constants.statuses.pending);
   }.property('status'),
 
   actions: {

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/messages.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/messages.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/messages.js
index 6de1c64..db8e0b5 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/messages.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/messages.js
@@ -19,15 +19,19 @@ import Ember from 'ember';
 
 export default Ember.Controller.extend({
   messages: Ember.computed.alias('notify.messages'),
-  count: Ember.computed.alias('messages.length'),
+  count: Ember.computed.alias('notify.unseenMessages.length'),
 
   actions: {
-    removeMessage: function(message) {
+    removeMessage: function (message) {
       this.notify.removeMessage(message);
     },
 
-    removeAllMessages: function() {
+    removeAllMessages: function () {
       this.notify.removeAllMessages();
+    },
+
+    markMessagesAsSeen: function () {
+      this.notify.markMessagesAsSeen();
     }
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/open-queries.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/open-queries.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/open-queries.js
index a0c033e..8add9a1 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/open-queries.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/open-queries.js
@@ -200,7 +200,7 @@ export default Ember.ArrayController.extend({
 
       tab.set('isDirty', false);
 
-      var content = self.get('index').prependQuerySettings(query.get('fileContent'));
+      var content = query.get('fileContent');
       //update query tab path with saved model id if its a new record
       if (wasNew) {
         self.get('settings').updateSettingsId(originalId, updatedModel.get('id'));
@@ -274,7 +274,7 @@ export default Ember.ArrayController.extend({
          hasSettings;
   },
 
-  isDirty: function(model) {
+  isDirty: function (model) {
     var query = this.getQueryForModel(model);
 
     if (model.get('isNew') && !query.get('fileContent')) {
@@ -286,8 +286,6 @@ export default Ember.ArrayController.extend({
     }
 
     return !!(!model.get('queryId') && model.get('isDirty'));
-
-
   },
 
   updatedDeletedQueryTab: function (model) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/queries.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/queries.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/queries.js
index aec2273..cbf6b42 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/queries.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/queries.js
@@ -31,9 +31,6 @@ export default Ember.ArrayController.extend(FilterableMixin, {
   sortProperties: [],
 
   init: function () {
-    var oneYearAgo = new Date();
-    oneYearAgo.setFullYear(oneYearAgo.getFullYear() - 1);
-
     this._super();
 
     this.set('columns', Ember.ArrayProxy.create({ content: Ember.A([
@@ -106,6 +103,23 @@ export default Ember.ArrayController.extend(FilterableMixin, {
         this.set('sortAscending', true);
         this.set('sortProperties', [ property ]);
       }
+    },
+
+    clearFilters: function () {
+      var columns = this.get('columns');
+
+      if (columns) {
+        columns.forEach(function (column) {
+          var filterValue = column.get('filterValue');
+
+          if (filterValue && typeof filterValue === 'string') {
+            column.set('filterValue');
+          }
+        });
+      }
+
+      //call clear filters from Filterable mixin
+      this.clearFilters();
     }
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/query-tabs.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/query-tabs.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/query-tabs.js
new file mode 100644
index 0000000..4c50c2e
--- /dev/null
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/query-tabs.js
@@ -0,0 +1,164 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import Ember from 'ember';
+import constants from 'hive/utils/constants';
+
+export default Ember.Controller.extend({
+  needs: [ constants.namingConventions.index],
+
+  index: Ember.computed.alias('controllers' + constants.namingConventions.index),
+
+  tabClassNames : "fa queries-icon query-context-tab",
+
+  tabs: [
+    Ember.Object.create({
+      iconClass: 'fa-code',
+      id: 'query-icon',
+      action: 'setDefaultActive',
+      name: constants.namingConventions.index,
+      tooltip: Ember.I18n.t('tooltips.query')
+    }),
+    Ember.Object.create({
+      iconClass: 'fa-gear',
+      id: 'settings-icon',
+      action: 'toggleOverlay',
+      template: 'settings',
+      outlet: 'overlay',
+      into: 'open-queries',
+      tooltip: Ember.I18n.t('tooltips.settings')
+    }),
+    Ember.Object.create({
+      iconClass: 'fa-link',
+      id: 'visual-explain-icon',
+      action: 'toggleOverlay',
+      template: 'visual-explain',
+      outlet: 'overlay',
+      into: 'index',
+      onTabOpen: 'onTabOpen',
+      tooltip: Ember.I18n.t('tooltips.visualExplain')
+    }),
+    Ember.Object.create({
+      iconClass: 'text-icon',
+      id: 'tez-icon',
+      text: 'TEZ',
+      action: 'toggleOverlay',
+      template: 'tez-ui',
+      outlet: 'overlay',
+      into: 'index',
+      tooltip: Ember.I18n.t('tooltips.tez')
+    }),
+    Ember.Object.create({
+      iconClass: 'fa-envelope',
+      id: 'notifications-icon',
+      action: 'toggleOverlay',
+      template: 'messages',
+      outlet: 'overlay',
+      into: 'index',
+      badgeProperty: 'count',
+      onTabOpen: 'markMessagesAsSeen',
+      tooltip: Ember.I18n.t('tooltips.notifications')
+    })
+  ],
+
+  init: function() {
+    this.setupControllers();
+    this.setDefaultTab();
+    this.setupTabsBadges();
+  },
+
+  setupControllers: function() {
+    var tabs = this.get('tabs');
+    var self = this;
+
+    tabs.map(function (tab) {
+      var controller;
+
+      if (tab.get('template')) {
+        controller = self.container.lookup('controller:' + tab.get('template'));
+        tab.set('controller', controller);
+      }
+    });
+  },
+
+  setDefaultTab: function () {
+    var defaultTab = this.get('tabs.firstObject');
+
+    defaultTab.set('active', true);
+
+    this.set('default', defaultTab);
+    this.set('activeTab', defaultTab);
+  },
+
+  setupTabsBadges: function () {
+    var tabs = this.get('tabs').filterProperty('badgeProperty');
+
+    tabs.map(function (tab) {
+        Ember.oneWay(tab, 'badge', 'controller.' + tab.badgeProperty);
+    });
+  },
+
+  closeActiveOverlay: function () {
+    this.send('closeOverlay', this.get('activeTab'));
+  },
+
+  onTabOpen: function (tab) {
+    if (!tab.onTabOpen) {
+      return;
+    }
+
+    var controller = this.container.lookup('controller:' + tab.template);
+    controller.send(tab.onTabOpen, controller);
+  },
+
+  openOverlay: function (tab) {
+    this.closeActiveOverlay();
+    this.set('activeTab.active', false);
+    tab.set('active', true);
+    this.set('activeTab', tab);
+
+    this.onTabOpen(tab);
+    this.send('openOverlay', tab);
+  },
+
+  setDefaultActive: function () {
+    var activeTab = this.get('activeTab');
+    var defaultTab = this.get('default');
+
+    if (activeTab !== defaultTab) {
+      this.closeActiveOverlay();
+      defaultTab.set('active', true);
+      activeTab.set('active', false);
+      this.set('activeTab', defaultTab);
+    }
+  },
+
+  actions: {
+    toggleOverlay: function (tab) {
+      if (tab !== this.get('default') && tab.get('active')) {
+        this.setDefaultActive();
+      } else {
+        this.openOverlay(tab);
+      }
+    },
+
+    setDefaultActive: function () {
+      this.setDefaultActive();
+    }
+  }
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/settings.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/settings.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/settings.js
index ddc5b1e..0bb540f 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/settings.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/settings.js
@@ -18,6 +18,7 @@
 
 import Ember from 'ember';
 import constants from 'hive/utils/constants';
+import utils from 'hive/utils/functions';
 
 export default Ember.ArrayController.extend({
   needs: [
@@ -34,11 +35,11 @@ export default Ember.ArrayController.extend({
 
   predefinedSettings: constants.hiveParameters,
 
-  selectedSettings: function() {
+  selectedSettings: function () {
     var predefined = this.get('predefinedSettings');
     var current = this.get('currentSettings.settings');
 
-    return predefined.filter(function(setting) {
+    return predefined.filter(function (setting) {
       return current.findBy('key.name', setting.name);
     });
   }.property('currentSettings.settings.@each.key'),
@@ -47,7 +48,7 @@ export default Ember.ArrayController.extend({
     var currentId = this.get('index.model.id');
     var targetSettings = this.findBy('id', currentId);
 
-   if (!targetSettings) {
+   if (!targetSettings && currentId) {
       targetSettings = this.pushObject(Ember.Object.create({
         id: currentId,
         settings: []
@@ -55,64 +56,54 @@ export default Ember.ArrayController.extend({
     }
 
     return targetSettings;
-  }.property('index.model.id'),
+  }.property('openQueries.currentQuery'),
 
   updateSettingsId: function (oldId, newId) {
     this.filterBy('id', oldId).setEach('id', newId);
   },
 
-  getSettingsString: function () {
-    var currentId = this.get('index.model.id');
-
-    var querySettings = this.findBy('id', currentId);
+  getCurrentValidSettings: function () {
+    var currentSettings = this.get('currentSettings');
+    var validSettings = [];
 
-    if (!querySettings) {
-      return "";
+    if (!currentSettings) {
+      return '';
     }
 
-    var settings = querySettings.get('settings').map(function (setting) {
-      return 'set %@ = %@;'.fmt(setting.get('key.name'), setting.get('value'));
+    currentSettings.get('settings').map(function (setting) {
+      if (setting.get('valid')) {
+        validSettings.pushObject('set %@ = %@;'.fmt(setting.get('key.name'), setting.get('value')));
+      }
     });
 
-    return settings.join("\n");
+    return validSettings;
   },
 
   hasSettings: function (id) {
-    id = id ? id : this.get('index.model.id');
-    var settings = this.findBy('id', id);
+    var settings;
+    var settingId = id ? id : this.get('index.model.id');
+
+    settings = this.findBy('id', settingId);
 
     return settings && settings.get('settings.length');
   },
 
   parseQuerySettings: function () {
-    var id = this.get('index.model.id');
     var query = this.get('openQueries.currentQuery');
     var content = query.get('fileContent');
     var self = this;
+    var regex = new RegExp(utils.regexes.setSetting);
+    var settings = content.match(regex) || [];
+    var targetSettings = this.findBy('id', this.get('index.model.id'));
 
-    var regex = new RegExp(/^set\s+[\w-.]+(\s+|\s?)=(\s+|\s?)[\w-.]+(\s+|\s?);/gim);
-    var settings = content.match(regex);
-
-    if (!settings) {
+    if (!query || !targetSettings) {
       return;
     }
 
-    var Setting = Ember.Object.extend({
-      key: Ember.Object.create(),
-      valid: true,
-      selection: Ember.Object.create(),
-      value: Ember.computed.alias('selection.value')
-    });
-
-    query.set('fileContent', content.replace(regex, '').trim());
     settings = settings.map(function (setting) {
-      var KV = setting.split('=');
-      var name = KV[0].replace('set', '').trim();
-      var value = KV[1].replace(';', '').trim();
-
-      var newSetting = Setting.create({});
-      newSetting.set('key.name', name);
-      newSetting.set('selection.value', value);
+      var KeyValue = setting.split('=');
+      var name     = KeyValue[0].replace('set', '').trim();
+      var value    = KeyValue[1].replace(';', '').trim();
 
       if (!self.get('predefinedSettings').findBy('name', name)) {
         self.get('predefinedSettings').pushObject({
@@ -120,37 +111,32 @@ export default Ember.ArrayController.extend({
         });
       }
 
-      return newSetting;
-    });
+      var settingObj = Ember.Object.createWithMixins({
+        key: Ember.Object.create({ name: 'nam' }),
+        selection : Ember.Object.create({ value: 'val'}),
 
-    this.setSettingForQuery(id, settings);
-  }.observes('openQueries.currentQuery', 'openQueries.tabUpdated'),
+        value: Ember.computed.alias('selection.value'),
+        valid: true
+      });
 
-  setSettingForQuery: function (id, settings) {
-    var querySettings = this.findBy('id', id);
+      settingObj.set('key.name', name);
+      settingObj.set('selection.value', value);
 
-    if (!querySettings) {
-      this.pushObject(Ember.Object.create({
-        id: id,
-        settings: settings
-      }));
-    } else {
-      querySettings.setProperties({
-        'settings': settings
-      });
-    }
-  },
+      return settingObj;
+    });
+
+    targetSettings.set('settings', settings);
+  }.observes('openQueries.currentQuery', 'openQueries.currentQuery.fileContent', 'openQueries.tabUpdated'),
 
-  validate: function() {
+  validate: function () {
     var settings = this.get('currentSettings.settings') || [];
     var predefinedSettings = this.get('predefinedSettings');
 
-    settings.forEach(function(setting) {
-      var predefined = predefinedSettings.filterProperty('name', setting.get('key.name'));
-      if (!predefined.length) {
+    settings.forEach(function (setting) {
+      var predefined = predefinedSettings.findBy('name', setting.get('key.name'));
+
+      if (!predefined) {
         return;
-      } else {
-        predefined = predefined[0];
       }
 
       if (predefined.values && predefined.values.contains(setting.get('value'))) {
@@ -172,14 +158,14 @@ export default Ember.ArrayController.extend({
     });
   }.observes('currentSettings.[]', 'currentSettings.settings.[]', 'currentSettings.settings.@each.value', 'currentSettings.settings.@each.key'),
 
-  currentSettingsAreValid: function() {
+  currentSettingsAreValid: function () {
     var currentSettings = this.get('currentSettings.settings');
     var invalid = currentSettings.filterProperty('valid', false);
 
     return invalid.length ? false : true;
   }.property('currentSettings.settings.@each.value', 'currentSettings.settings.@each.key'),
 
-  loadSessionStatus: function() {
+  loadSessionStatus: function () {
     var model         = this.get('index.model');
     var sessionActive = this.get('sessionActive');
     var sessionTag    = this.get('sessionTag');
@@ -188,10 +174,10 @@ export default Ember.ArrayController.extend({
 
     if (sessionTag && sessionActive === undefined) {
       adapter.ajax(url, 'GET')
-        .then(function(response) {
+        .then(function (response) {
           model.set('sessionActive', response.session.actual);
         })
-        .catch(function() {
+        .catch(function () {
           model.set('sessionActive', false);
         });
     }
@@ -199,20 +185,25 @@ export default Ember.ArrayController.extend({
 
   actions: {
     add: function () {
-      var currentId = this.get('index.model.id'),
-          querySettings = this.findBy('id', currentId);
-
-      var Setting = Ember.Object.extend({
+      var setting = Ember.Object.createWithMixins({
         valid: true,
         selection: Ember.Object.create(),
         value: Ember.computed.alias('selection.value')
       });
 
-      querySettings.get('settings').pushObject(Setting.create({}));
+      this.get('currentSettings.settings').pushObject(setting);
     },
 
     remove: function (setting) {
-      this.findBy('id', this.get('index.model.id')).settings.removeObject(setting);
+      var currentQuery = this.get('openQueries.currentQuery');
+      var currentQueryContent = currentQuery.get('fileContent');
+      var keyValue = 'set %@ = %@;\n'.fmt(setting.get('key.name'), setting.get('value'));
+
+      this.get('currentSettings.settings').removeObject(setting);
+
+      if (currentQueryContent.indexOf(keyValue) > -1) {
+        currentQuery.set('fileContent', currentQueryContent.replace(keyValue, ''));
+      }
     },
 
     addKey: function (param) {
@@ -223,14 +214,17 @@ export default Ember.ArrayController.extend({
       this.get('currentSettings.settings').findBy('key', null).set('key', newKey);
     },
 
-    removeAll: function() {
-      var currentId = this.get('index.model.id'),
-          querySettings = this.findBy('id', currentId);
+    removeAll: function () {
+      var currentQuery = this.get('openQueries.currentQuery'),
+          currentQueryContent = currentQuery.get('fileContent'),
+          regex = new RegExp(utils.regexes.setSetting),
+          settings = currentQueryContent.match(regex);
 
-      querySettings.set('settings', []);
+      currentQuery.set('fileContent', currentQueryContent.replace(settings, ''));
+      this.get('currentSettings').set('settings', []);
     },
 
-    invalidateSession: function() {
+    invalidateSession: function () {
       var self       = this;
       var sessionTag = this.get('sessionTag');
       var adapter    = this.container.lookup('adapter:application');
@@ -238,7 +232,7 @@ export default Ember.ArrayController.extend({
       var model = this.get('index.model');
 
       // @TODO: Split this into then/catch once the BE is fixed
-      adapter.ajax(url, 'DELETE').catch(function(response) {
+      adapter.ajax(url, 'DELETE').catch(function (response) {
         if ([200, 404].contains(response.status)) {
           model.set('sessionActive', false);
           self.notify.success('alerts.success.sessions.deleted');
@@ -248,4 +242,4 @@ export default Ember.ArrayController.extend({
       });
     }
   }
-});
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/tez-ui.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/tez-ui.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/tez-ui.js
index c511e0b..bdb66a1 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/tez-ui.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/tez-ui.js
@@ -31,7 +31,7 @@ export default Ember.Controller.extend({
 
   isTezViewAvailable: Ember.computed.bool('tezViewURL'),
 
-  dagId: function() {
+  dagId: function () {
     if (this.get('isTezViewAvailable')) {
       return this.get('index.model.dagId');
     }
@@ -39,7 +39,7 @@ export default Ember.Controller.extend({
     return false;
   }.property('index.model.dagId', 'isTezViewAvailable'),
 
-  dagURL: function() {
+  dagURL: function () {
     if (this.get('dagId')) {
       return "%@%@%@".fmt(this.get('tezViewURL'), this.get('tezDagPath'), this.get('dagId'));
     }
@@ -47,27 +47,27 @@ export default Ember.Controller.extend({
     return false;
   }.property('dagId'),
 
-  getTezView: function() {
+  getTezView: function () {
     if (this.get('isTezViewAvailable')) {
       return;
     }
 
     var self = this;
     Ember.$.getJSON(this.get('tezApiURL'))
-      .then(function(response) {
+      .then(function (response) {
         self.getTezViewInstance(response);
       })
-      .fail(function(response) {
+      .fail(function (response) {
         self.setTezViewError(response);
       });
   }.on('init'),
 
-  getTezViewInstance: function(data) {
+  getTezViewInstance: function (data) {
     var self = this;
     var url = data.versions[0].href;
 
     Ember.$.getJSON(url)
-      .then(function(response) {
+      .then(function (response) {
         if (!response.instances.length) {
           self.setTezViewError(response);
           return;
@@ -80,7 +80,7 @@ export default Ember.Controller.extend({
       });
   },
 
-  setTezViewURL: function(instance) {
+  setTezViewURL: function (instance) {
     var url = "%@/%@/%@".fmt(
       this.get('tezURLPrefix'),
       instance.version,
@@ -90,7 +90,7 @@ export default Ember.Controller.extend({
     this.set('tezViewURL', url);
   },
 
-  setTezViewError: function(data) {
+  setTezViewError: function (data) {
     // status: 404 => Tev View isn't deployed
     if (data.status && data.status === 404) {
       this.set('error', 'tez.errors.not.deployed');
@@ -100,7 +100,6 @@ export default Ember.Controller.extend({
     // no instance created
     if (data.instances && !data.instances.length) {
       this.set('error', 'tez.errors.no.instance');
-      return;
     }
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/udfs.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/udfs.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/udfs.js
index 52faba1..d9a7d6b 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/udfs.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/udfs.js
@@ -64,6 +64,23 @@ export default Ember.ArrayController.extend(FilterableMixin, {
 
     add: function () {
       this.store.createRecord(constants.namingConventions.udf);
+    },
+
+    clearFilters: function () {
+      var columns = this.get('columns');
+
+      if (columns) {
+        columns.forEach(function (column) {
+          var filterValue = column.get('filterValue');
+
+          if (filterValue && typeof filterValue === 'string') {
+            column.set('filterValue');
+          }
+        });
+      }
+
+      //call clear filters from Filterable mixin
+      this.clearFilters();
     }
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/visual-explain.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/visual-explain.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/visual-explain.js
index 5275a9b..dfd9889 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/visual-explain.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/visual-explain.js
@@ -17,6 +17,31 @@
  */
 
 import Ember from 'ember';
+import constants from 'hive/utils/constants';
 
-export default Ember.ObjectController.extend({
+export default Ember.Controller.extend({
+  needs: [ constants.namingConventions.index,
+           constants.namingConventions.jobProgress ],
+
+  index: Ember.computed.alias('controllers.' + constants.namingConventions.index),
+  jobProgress: Ember.computed.alias('controllers.' + constants.namingConventions.jobProgress),
+
+  updateProgress: function () {
+    this.set('verticesProgress', this.get('jobProgress.stages'));
+  }.observes('jobProgress.stages', 'jobProgress.stages.@each.value'),
+
+  actions: {
+    onTabOpen: function () {
+      var self = this;
+
+      this.get('index')._executeQuery(true, true).then(function (json) {
+        //this condition should be changed once we change the way of retrieving this json
+        if (json['STAGE PLANS']['Stage-1']) {
+          self.set('json', json);
+        }
+      }, function (err) {
+        self.notify.error(err.responseJSON.message, err.responseJSON.trace);
+      });
+    }
+  }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/all-uppercase.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/all-uppercase.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/all-uppercase.js
index f068ed0..92930a9 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/all-uppercase.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/all-uppercase.js
@@ -18,8 +18,8 @@
 
 import Ember from 'ember';
 
-export function allUppercase(input) {
+export function allUppercase (input) {
   return input ? input.toUpperCase() : input;
-};
+}
 
 export default Ember.Handlebars.makeBoundHelper(allUppercase);

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/code-helper.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/code-helper.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/code-helper.js
index 327636f..8bbd19e 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/code-helper.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/code-helper.js
@@ -18,7 +18,7 @@
 
 import Ember from 'ember';
 
-export function code(text) {
+export function code (text) {
   text = Ember.Handlebars.Utils.escapeExpression(text);
   text = text.replace(/(\r\n|\n|\r)/gm, '<br>');
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/date-binding.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/date-binding.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/date-binding.js
index 4baeca8..61251f8 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/date-binding.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/date-binding.js
@@ -20,7 +20,7 @@
 
 import Ember from 'ember';
 
-export function pathBinding(data, key) {
+export function pathBinding (data, key) {
   return moment(data.get(key)).fromNow();
 }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/log-helper.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/log-helper.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/log-helper.js
index c603c60..c29d129 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/log-helper.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/log-helper.js
@@ -18,7 +18,7 @@
 
 import Ember from 'ember';
 
-export function log(text) {
+export function log (text) {
   text = Ember.Handlebars.Utils.escapeExpression(text);
   text = text.replace(/(\r\n|\n|\r)/gm, '<br>');
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/path-binding.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/path-binding.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/path-binding.js
index e53772e..926aaaa 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/path-binding.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/path-binding.js
@@ -18,7 +18,7 @@
 
 import Ember from 'ember';
 
-export function pathBinding(data, key) {
+export function pathBinding (data, key) {
   if (!data || !key) {
     return;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/preformatted-string.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/preformatted-string.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/preformatted-string.js
index bb3d006..4ab6a2e 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/preformatted-string.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/preformatted-string.js
@@ -17,7 +17,7 @@
 */
 import Ember from 'ember';
 
-export function preformattedString(string) {
+export function preformattedString (string) {
   string = string.replace(/\\n/g, '&#10;'); // newline
   string = string.replace(/\\t/g, '&#09;'); // tabs
   string = string.replace(/^\s+|\s+$/g, ''); // trim

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/tb-helper.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/tb-helper.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/tb-helper.js
index fcce185..81af5ff 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/tb-helper.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/helpers/tb-helper.js
@@ -18,7 +18,7 @@
 
 import Ember from 'ember';
 
-export function tb(key, data) {
+export function tb (key, data) {
   var path = data.get ? data.get(key) : data[key];
 
   if (!path && key) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/initializers/i18n.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/initializers/i18n.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/initializers/i18n.js
index b637c5e..e5bb82b 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/initializers/i18n.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/initializers/i18n.js
@@ -22,7 +22,7 @@ var TRANSLATIONS;
 
 export default {
   name: 'i18n',
-  initialize: function() {
+  initialize: function () {
     Ember.ENV.I18N_COMPILE_WITHOUT_HANDLEBARS = true;
     Ember.FEATURES.I18N_TRANSLATE_HELPER_SPAN = false;
     Ember.I18n.translations = TRANSLATIONS;
@@ -33,8 +33,14 @@ export default {
 TRANSLATIONS = {
   tooltips: {
     refresh: 'Refresh database',
-    loadSample: 'Load sample data'
+    loadSample: 'Load sample data',
+    query: 'Query',
+    settings: 'Settings',
+    visualExplain: 'Visual Explain',
+    tez: 'Tez',
+    notifications: 'Notifications'
   },
+
   alerts: {
     errors: {
       save: {
@@ -58,6 +64,7 @@ TRANSLATIONS = {
       }
     }
   },
+
   modals: {
     delete: {
       heading: 'Confirm deletion',
@@ -76,6 +83,7 @@ TRANSLATIONS = {
       csv: 'Download results as CSV'
     }
   },
+
   titles: {
     database: 'Database Explorer',
     explorer: 'Databases',
@@ -87,11 +95,13 @@ TRANSLATIONS = {
       process: 'Query Process Results',
       parameters: 'Parameters',
       visualExplain: 'Visual Explain',
-      tez: 'TEZ'
+      tez: 'TEZ',
+      messages: 'Messages'
     },
     download: 'Save results...',
     tableSample: '{{tableName}} sample'
   },
+
   placeholders: {
     search: {
       tables: 'Search tables...',
@@ -119,6 +129,7 @@ TRANSLATIONS = {
       value: '1'
     }
   },
+
   menus: {
     query: 'Query',
     savedQueries: 'Saved Queries',
@@ -128,6 +139,7 @@ TRANSLATIONS = {
     results: 'Results',
     explain: 'Explain'
   },
+
   columns: {
     id: 'id',
     shortQuery: 'preview',
@@ -142,6 +154,7 @@ TRANSLATIONS = {
     expand: '',
     actions: ''
   },
+
   buttons: {
     addItem: 'Add new item...',
     insert: 'Insert',
@@ -168,10 +181,12 @@ TRANSLATIONS = {
     saveCsv: 'Download as CSV',
     runOnTez: 'Run on Tez'
   },
+
   labels: {
     noTablesMatch: 'No tables match',
     table: 'Table '
   },
+
   popover: {
     visualExplain: {
       statistics: "Statistics"
@@ -186,6 +201,7 @@ TRANSLATIONS = {
     },
     add: 'Add'
   },
+
   tez: {
     errors: {
       'not.deployed': "Tez View isn't deployed.",

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/initializers/notify.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/initializers/notify.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/initializers/notify.js
index be9c359..cf9d64a 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/initializers/notify.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/initializers/notify.js
@@ -17,7 +17,7 @@
 */
 export default {
   name: 'notify',
-  initialize: function(container, app) {
+  initialize: function (container, app) {
     app.inject('route', 'notify', 'service:notify');
     app.inject('controller', 'notify', 'service:notify');
     app.inject('component', 'notify', 'service:notify');

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/mixins/filterable.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/mixins/filterable.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/mixins/filterable.js
index 55d4593..5758bf9 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/mixins/filterable.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/mixins/filterable.js
@@ -87,7 +87,9 @@ export default Ember.Mixin.create({
   },
 
   clearFilters: function () {
-    if (!this.get('filters') || this.get('filters.length')) {
+    var filters = this.get('filters');
+
+    if (!filters || filters.get('length')) {
       this.set('filters', Ember.A());
     }
   },
@@ -95,10 +97,6 @@ export default Ember.Mixin.create({
   actions: {
     filter: function (property, filterValue) {
       this.updateFilters(property, filterValue);
-    },
-
-    clearFilters: function () {
-      this.clearFilters();
     }
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/router.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/router.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/router.js
index 244bc58..5a51b11 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/router.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/router.js
@@ -24,7 +24,7 @@ var Router = Ember.Router.extend({
   location: config.locationType
 });
 
-Router.map(function() {
+Router.map(function () {
   var savedQueryPath = constants.namingConventions.routes.queries + '/:' + constants.namingConventions.savedQuery + '_id';
   var historyQueryPath = constants.namingConventions.routes.history + '/:' + constants.namingConventions.job + '_id';
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/routes/application.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/routes/application.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/routes/application.js
index bf413a3..90b8055 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/routes/application.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/routes/application.js
@@ -53,17 +53,28 @@ export default Ember.Route.extend({
       });
     },
 
-    openOverlay: function(overlay) {
+    openOverlay: function (overlay) {
       return this.render(overlay.template, {
         outlet: overlay.outlet,
         into: overlay.into
       });
     },
-    closeOverlay: function(overlay) {
+    closeOverlay: function (overlay) {
       return this.disconnectOutlet({
         outlet: overlay.outlet,
         parentView: overlay.into
       });
+    },
+
+    removeNotification: function (notification) {
+      this.notify.removeNotification(notification);
+    },
+
+    willTransition: function(transition) {
+      // close active overlay if we transition
+      this.controllerFor('queryTabs').setDefaultActive();
+
+      return transition;
     }
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/routes/index/saved-query.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/routes/index/saved-query.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/routes/index/saved-query.js
index e64c522..0366b0d 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/routes/index/saved-query.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/routes/index/saved-query.js
@@ -21,11 +21,21 @@ import constants from 'hive/utils/constants';
 
 export default Ember.Route.extend({
   setupController: function (controller, model) {
+    // settings modify fileContent to extract the settings
+    // when you load a saved query use the original fileContent
+    // this.store.find('file', model.get('queryFile'))
+    //   .then(function(queryFile) {
+    //     var changes = queryFile.changedAttributes();
+    //     if (changes.fileContent && changes.fileContent[0]) {
+    //       queryFile.set('fileContent', changes.fileContent[0]);
+    //     }
+    //   });
+
     this.controllerFor(constants.namingConventions.routes.index).set('model', model);
   },
 
   actions: {
-    error: function() {
+    error: function () {
       this.store.unloadAll(constants.namingConventions.savedQuery);
       this.transitionTo(constants.namingConventions.routes.index);
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/serializers/database.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/serializers/database.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/serializers/database.js
index fed6d14..f598b20 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/serializers/database.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/serializers/database.js
@@ -31,8 +31,8 @@ export default DS.JSONSerializer.extend({
     return this._super(store, primaryType, payload);
   },
 
-  normalizePayload: function(payload) {
-    var normalized = payload.databases.map(function(database) {
+  normalizePayload: function (payload) {
+    var normalized = payload.databases.map(function (database) {
       return database;
     });
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/services/notify.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/services/notify.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/services/notify.js
index fbd50cd..38e88c3 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/services/notify.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/services/notify.js
@@ -21,10 +21,11 @@ import constants from 'hive/utils/constants';
 export default Ember.Service.extend({
   types: constants.notify,
 
-  messages      : Ember.ArrayProxy.create({ content : [] }),
-  notifications : Ember.ArrayProxy.create({ content : [] }),
+  messages       : Ember.ArrayProxy.create({ content : [] }),
+  notifications  : Ember.ArrayProxy.create({ content : [] }),
+  unseenMessages : Ember.ArrayProxy.create({ content : [] }),
 
-  add: function(type, message, body) {
+  add: function (type, message, body) {
     var formattedBody = this.formatMessageBody(body);
 
     var notification = Ember.Object.create({
@@ -35,25 +36,26 @@ export default Ember.Service.extend({
 
     this.messages.pushObject(notification);
     this.notifications.pushObject(notification);
+    this.unseenMessages.pushObject(notification);
   },
 
-  info: function(message, body) {
+  info: function (message, body) {
     this.add(this.types.INFO, message, body);
   },
 
-  warn: function(message, body) {
+  warn: function (message, body) {
     this.add(this.types.WARN, message, body);
   },
 
-  error: function(message, body) {
+  error: function (message, body) {
     this.add(this.types.ERROR, message, body);
   },
 
-  success: function(message, body) {
+  success: function (message, body) {
     this.add(this.types.SUCCESS, message, body);
   },
 
-  formatMessageBody: function(body) {
+  formatMessageBody: function (body) {
     if (!body) {
       return;
     }
@@ -72,17 +74,22 @@ export default Ember.Service.extend({
     }
   },
 
-  removeMessage: function(message) {
+  removeMessage: function (message) {
     this.messages.removeObject(message);
     this.notifications.removeObject(message);
   },
 
-  removeNotification: function(notification) {
+  removeNotification: function (notification) {
     this.notifications.removeObject(notification);
   },
 
-  removeAllMessages: function() {
+  removeAllMessages: function () {
     this.messages.removeAt(0, this.messages.get('length'));
-  }
+  },
 
+  markMessagesAsSeen: function () {
+    if (this.unseenMessages.get('length')) {
+      this.unseenMessages.removeAt(0, this.unseenMessages.get('length'));
+    }
+  }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/app.scss
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/app.scss b/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/app.scss
index 7fdf096..488fe04 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/app.scss
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/app.scss
@@ -66,9 +66,13 @@ a {
 
 #visual-explain {
   white-space: nowrap;
+
+  .panel-body {
+    overflow: hidden;
+  }
 }
 
-#visual-explain, #tez-ui {
+.index-overlay {
   position: absolute;
   left: 0;
   width: 0;
@@ -152,6 +156,30 @@ aside  hr {
   background-color: white;
 }
 
+.gray {
+  background-color: gray;
+}
+
+.green {
+  background-color: #99CC00;
+}
+
+.red {
+  background-color: #ff3300;
+}
+
+.orange {
+  background-color: #FF9933;
+}
+
+.yellow {
+  background-color: #CCCC00;
+}
+
+.blue {
+  background-color: blue;
+}
+
 .UNKNOWN {
   color: gray;
 }
@@ -372,6 +400,7 @@ tree-view ul li {
   font-weight: 800;
 
   .edge-path {
+    margin-top: -55px;
     height: 2px;
     background-color: #dedede;
     position: absolute;
@@ -436,6 +465,19 @@ tree-view ul li {
           color: green;
         }
       }
+
+      .progress {
+        border-radius: 0;
+        margin: 0 10px 10px 10px;
+      }
+
+      .progress-bar {
+        min-width: 2em;
+      }
     }
   }
 }
+
+.messages-controls {
+  margin: 0 0 10px;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/dropdown-submenu.scss
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/dropdown-submenu.scss b/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/dropdown-submenu.scss
index 8b43bce..bab2216 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/dropdown-submenu.scss
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/dropdown-submenu.scss
@@ -16,7 +16,6 @@
  * limitations under the License.
  */
 
-
 .dropdown-submenu {
     position:relative;
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/mixins.scss
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/mixins.scss b/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/mixins.scss
index 95e4ae8..3e85727 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/mixins.scss
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/mixins.scss
@@ -1,20 +1,20 @@
 /**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
 
 @mixin box-shadow($horizontal, $vertical, $blur, $color) {
   -webkit-box-shadow: $horizontal $vertical $blur $color;

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/notifications.scss
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/notifications.scss b/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/notifications.scss
index c676e4e..166056b 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/notifications.scss
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/notifications.scss
@@ -15,6 +15,7 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
+
 .notifications-container {
   position: absolute;
   top: 4px;

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/query-tabs.scss
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/query-tabs.scss b/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/query-tabs.scss
index d23a751..3bc3095 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/query-tabs.scss
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/query-tabs.scss
@@ -15,6 +15,7 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
+
 .query-menu {
   margin-top: 57px;
 
@@ -59,7 +60,7 @@
 .query-menu-tab .badge {
   position: absolute;
   top: -4px;
-  left: -4px;
+  right: 0;
   background-color: red;
   color: #fff;
   padding: 2px 4px;

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/vars.scss
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/vars.scss b/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/vars.scss
index eec2277..184ac9d 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/vars.scss
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/styles/vars.scss
@@ -15,6 +15,7 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
+
 $panel-background: #f5f5f5;
 $placeholder-color: #aaa;
 $border-color: #ddd;

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/application.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/application.hbs b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/application.hbs
index 99662dd..2242a4f 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/application.hbs
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/application.hbs
@@ -16,7 +16,7 @@
 * limitations under the License.
 }}
 
-{{notify-widget}}
+{{notify-widget notifications=notify.notifications}}
 {{render 'navbar'}}
 
 <div id="content">

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/progress-widget.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/progress-widget.hbs b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/progress-widget.hbs
index c89a9dd..2ea7b94 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/progress-widget.hbs
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/progress-widget.hbs
@@ -17,9 +17,7 @@
 }}
 
 <div class="progress">
-  {{#each stage in formattedStages}}
-  <div {{bind-attr class="stage.className :progress-bar"}} {{bind-attr style=stage.progress}}>
-      <span class="sr-only">35% Complete (success)</span>
-    </div>
-  {{/each}}
-</div>
+  <div {{bind-attr class=":progress-bar :progress-bar-success" style=style}}>
+    {{percentage}}
+  </div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/query-tabs.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/query-tabs.hbs b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/query-tabs.hbs
deleted file mode 100644
index f131367..0000000
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/components/query-tabs.hbs
+++ /dev/null
@@ -1,29 +0,0 @@
-{{!
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-}}
-
-{{#each tab in tabs}}
-    <span {{action tab.action tab}} {{bind-attr class=":query-menu-tab tabClassNames tab.iconClass tab.active:active"}}>
-      {{#if tab.badge}}
-        <span class="badge">{{tab.badge}}</span>
-      {{/if}}
-
-      {{#if tab.text}}
-        {{tab.text}}
-      {{/if}}
-    </span>
-{{/each}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/index.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/index.hbs b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/index.hbs
index 1551072..47becfd 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/index.hbs
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/index.hbs
@@ -23,7 +23,6 @@
     </aside>
 
     <div class="col-md-9 col-xs-12 query-container">
-
       {{#panel-widget headingTranslation="titles.query.editor" classNames="query-editor-panel"}}
         {{render 'open-queries'}}
 
@@ -47,6 +46,11 @@
         </div>
       {{/panel-widget}}
 
+      {{#if jobProgress.stages}}
+        {{#progress-widget value=jobProgress.totalProgress}}
+        {{/progress-widget}}
+      {{/if}}
+
       {{#if queryParams}}
         {{#panel-widget headingTranslation="titles.query.parameters"}}
           <div class="form-horizontal">
@@ -87,6 +91,6 @@
       </ul>
     {{/popover-widget}}
 
-    {{query-tabs}}
+    {{render 'query-tabs'}}
   </div>
 </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/messages.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/messages.hbs b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/messages.hbs
index 7c494b6..3dfc7d0 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/messages.hbs
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/messages.hbs
@@ -16,15 +16,17 @@
 * limitations under the License.
 }}
 
-<div class="editor-overlay messages-container">
-  <h3>Messages
-    {{#if messages.length}}
-      <button class="btn btn-danger btn-xs" {{action 'removeAllMessages'}}><i class="fa fa-minus"></i> Clear All</button>
-    {{/if}}
-  </h3>
+<div id="messages" class="index-overlay">
+  {{#panel-widget headingTranslation="titles.query.messages"}}
+    <div class="messages-controls">
+      {{#if messages.length}}
+        <button class="btn btn-danger btn-xs" {{action 'removeAllMessages'}}><i class="fa fa-minus"></i> Clear All</button>
+      {{/if}}
+    </div>
 
 
-  {{#each message in messages}}
-    {{view 'message' notification=message}}
-  {{/each}}
+    {{#each message in messages}}
+      {{view 'message' notification=message}}
+    {{/each}}
+  {{/panel-widget}}
 </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/query-tabs.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/query-tabs.hbs b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/query-tabs.hbs
new file mode 100644
index 0000000..c170e02
--- /dev/null
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/query-tabs.hbs
@@ -0,0 +1,29 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+}}
+
+{{#each tab in tabs}}
+    <span {{action tab.action tab}} {{bind-attr class=":query-menu-tab tabClassNames tab.iconClass tab.active:active" title="tab.tooltip" id="tab.id"}}>
+      {{#if tab.badge}}
+        <span class="badge">{{tab.badge}}</span>
+      {{/if}}
+
+      {{#if tab.text}}
+        {{tab.text}}
+      {{/if}}
+    </span>
+{{/each}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/642fd46c/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/tez-ui.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/tez-ui.hbs b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/tez-ui.hbs
index 4bc0c0e..6f6df4c 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/tez-ui.hbs
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/templates/tez-ui.hbs
@@ -16,7 +16,7 @@
 * limitations under the License.
 }}
 
-<div id="tez-ui">
+<div id="tez-ui" class="index-overlay">
   {{#panel-widget headingTranslation="titles.query.tez"}}
     {{#if dagURL}}
       <iframe {{bind-attr src=dagURL}}></iframe>