فهرست منبع

HUE-1845 [impala] Automatic query closing

made query history state expired when closing queries
Abraham Elmahrek 12 سال پیش
والد
کامیت
0c6b56f

+ 13 - 8
apps/beeswax/src/beeswax/api.py

@@ -121,7 +121,7 @@ def execute_directly(request, query, design, query_server, tablename=None, **kwa
   db.use(database)
 
   history_obj = db.execute_query(query, design)
-  watch_url = reverse(get_app_name(request) + ':watch_query_refresh_json', kwargs={'id': history_obj.id})
+  watch_url = reverse(get_app_name(request) + ':api_watch_query_refresh_json', kwargs={'id': history_obj.id})
 
   response = {
     'status': 0,
@@ -178,19 +178,24 @@ def watch_query_refresh_json(request, id):
 
 
 def close_operation(request, query_id):
-  response = {'status': -1, 'message': ''}
+  response = {
+    'status': -1,
+    'message': ''
+  }
 
   if request.method != 'POST':
     response['message'] = _('A POST request is required.')
   else:
     try:
       query_history = authorized_get_history(request, query_id, must_exist=True)
-      db = dbms.get(request.user, query_history.get_query_server_config())
-      db.close_operation(query_history.get_handle())
-      _get_query_handle_and_state(query_history)
-      response = {'status': 0}
+      db = dbms.get(query_history.owner, query_history.get_query_server_config())
+      handle = query_history.get_handle()
+      db.close_operation(handle)
+      query_history.set_to_expired()
+      query_history.save()
+      response['status'] = 0
     except Exception, e:
-      response = {'message': unicode(e)}
+      response['message'] = unicode(e)
 
   return HttpResponse(json.dumps(response), mimetype="application/json")
 
@@ -381,7 +386,7 @@ def save_results(request, query_id):
           response['id'] = query_history.id
           response['query'] = query_history.query
           response['path'] = target_dir
-          response['watch_url'] = reverse(get_app_name(request) + ':watch_query_refresh_json', kwargs={'id': query_history.id})
+          response['watch_url'] = reverse(get_app_name(request) + ':api_watch_query_refresh_json', kwargs={'id': query_history.id})
         elif form.cleaned_data['save_target'] == form.SAVE_TYPE_TBL:
           db.create_table_as_a_select(request, query_history, form.cleaned_data['target_table'], result_meta)
           response['type'] = 'hive-table'

+ 3 - 0
apps/beeswax/src/beeswax/models.py

@@ -155,6 +155,9 @@ class QueryHistory(models.Model):
   def set_to_available(self):
     self.last_state = QueryHistory.STATE.available.index
 
+  def set_to_expired(self):
+    self.last_state = QueryHistory.STATE.expired.index
+
 
 def make_query_context(type, info):
   """

+ 12 - 0
apps/beeswax/src/beeswax/templates/execute.mako

@@ -1679,6 +1679,18 @@ $(document).ready(function () {
       'trigger': 'hover',
       'html': true
     });
+
+    window.onbeforeunload = function(e) {
+      viewModel.closeQuery();
+    };
+
+    $(document).on('explain.query', function() {
+      viewModel.closeQuery();
+    });
+
+    $(document).on('execute.query', function() {
+      viewModel.closeQuery();
+    });
   % endif
 });
 

+ 1 - 1
apps/beeswax/src/beeswax/templates/watch_wait.mako

@@ -101,7 +101,7 @@ ${layout.menubar(section='query')}
 
     function refreshView() {
       $.ajaxSetup({ cache: false });
-      $.getJSON("${url(app_name + ':watch_query_refresh_json', query.id)}", function (data) {
+      $.getJSON("${url(app_name + ':api_watch_query_refresh_json', query.id)}", function (data) {
         if (data.isSuccess || data.isFailure) {
           location.href = fwdUrl;
         }

+ 2 - 2
apps/beeswax/src/beeswax/urls.py

@@ -65,7 +65,7 @@ urlpatterns += patterns(
   url(r'^api/query/(?P<query_id>\d+)?$', 'save_query', name='api_save_query'),
   url(r'^api/query/(?P<query_id>\d+)/get$', 'fetch_saved_query', name='api_fetch_saved_query'),
   url(r'^api/query/(?P<query_id>\d+)/cancel$', 'cancel_query', name='api_cancel_query'),
+  url(r'^api/query/(?P<query_id>\d+)/close/?$', 'close_operation', name='api_close_operation'),
   url(r'^api/query/(?P<query_id>\d+)/results/save$', 'save_results', name='api_save_results'),
-  url(r'^watch/json/(?P<id>\d+)$', 'watch_query_refresh_json', name='watch_query_refresh_json'),
-  url(r'^close_operation/(?P<query_id>\d+)?$', 'close_operation', name='close_operation'),
+  url(r'^api/watch/json/(?P<id>\d+)$', 'watch_query_refresh_json', name='api_watch_query_refresh_json'),
 )

+ 37 - 5
apps/beeswax/static/js/beeswax.vm.js

@@ -18,10 +18,7 @@
 function BeeswaxViewModel(server, query_id) {
   var self = this;
 
-  self.server = ko.observable(server);
-  self.databases = ko.observableArray();
-  self.selectedDatabase = ko.observable(0);
-  self.query = ko.mapping.fromJS({
+  var QUERY_DEFAULTS = {
     'id': query_id,
     'query': '',
     'name': null,
@@ -51,7 +48,12 @@ function BeeswaxViewModel(server, query_id) {
       'url': null,
     },
     'isRunning': false
-  });
+  };
+
+  self.server = ko.observable(server);
+  self.databases = ko.observableArray();
+  self.selectedDatabase = ko.observable(0);
+  self.query = ko.mapping.fromJS(QUERY_DEFAULTS);
 
   self.hasMoreResults = ko.computed(function() {
     return self.query.results.url() != null;
@@ -83,6 +85,10 @@ function BeeswaxViewModel(server, query_id) {
     'deferEvaluation': true
   });
 
+  self.resetQuery = function() {
+    ko.mapping.fromJS(QUERY_DEFAULTS, self.query);
+  };
+
   self.updateDatabases = function(databases) {
     self.databases(databases);
   };
@@ -511,6 +517,32 @@ function BeeswaxViewModel(server, query_id) {
     );
   };
 
+  self.closeQuery = function() {
+    var self = this;
+    if (self.query.id()) {
+      var data = {};
+      var url = '/' + self.server() + '/api/query/' + self.query.id() + '/close';
+      var request = {
+        url: url,
+        dataType: 'json',
+        type: 'POST',
+        success: function(data) {
+          if (data.status == 0) {
+            $(document).trigger('closed.query', data);
+            self.resetQuery();
+          } else {
+            $(document).trigger('error_close.query');
+          }
+        },
+        error: function(data) {
+          $(document).trigger('error_close.results');
+        },
+        data: data
+      };
+      $.ajax(request);
+    }
+  };
+
   self.saveResults = function() {
     var self = this;
     if (self.query.id()) {