浏览代码

HUE-1115 [impala] Support multi db and use statement

Support use statement
HS2 has has_result_set=True, Impala has_result_set=False
Romain Rigaux 12 年之前
父节点
当前提交
d556215

+ 1 - 1
apps/beeswax/src/beeswax/server/beeswax_lib.py

@@ -100,7 +100,7 @@ class BeeswaxDataTable(DataTable):
 
 
 class BeeswaxClient:
-  NO_RESULT_SET_RE = re.compile('DROP|CREATE|ALTER|LOAD', re.IGNORECASE)
+  NO_RESULT_SET_RE = re.compile('DROP|CREATE|ALTER|LOAD|USE', re.IGNORECASE)
 
   def __init__(self, query_server, user):
     self.user = user

+ 3 - 4
apps/beeswax/src/beeswax/server/dbms.py

@@ -186,10 +186,10 @@ class Dbms:
 
 
   def use(self, database):
-    """Beeswax interface does not support use directly. Impala app does not support it."""
-    if SERVER_INTERFACE.get() == HIVE_SERVER2 and self.client.query_server['server_name'] != 'impala':
+    """Beeswax interface does not support use directly."""
+    if SERVER_INTERFACE.get() == HIVE_SERVER2:
       query = hql_query('USE %s' % database)
-      return self.execute_and_wait(query)
+      self.client.query(query)
 
 
   def get_log(self, query_handle):
@@ -269,7 +269,6 @@ class Dbms:
     query_history.has_results = handle.has_result_set
     query_history.modified_row_count = handle.modified_row_count
     query_history.log_context = handle.log_context
-
     query_history.set_to_running()
     query_history.save()
 

+ 4 - 3
apps/beeswax/src/beeswax/server/hive_server2_lib.py

@@ -16,6 +16,7 @@
 # limitations under the License.
 
 import logging
+import re
 import thrift
 
 from desktop.lib import thrift_util
@@ -271,9 +272,9 @@ class HiveServerClient:
 
     res = fn(req)
 
-    # Not supported currently in HS2: TStatusCode.INVALID_HANDLE_STATUS
+    # Not supported currently in HS2 and Impala: TStatusCode.INVALID_HANDLE_STATUS
     if res.status.statusCode == TStatusCode.ERROR_STATUS and \
-        res.status.errorMessage is not None and 'Invalid SessionHandle' in res.status.errorMessage:
+        re.search('Invalid SessionHandle|Invalid session id', res.status.errorMessage or '', re.I):
       LOG.info('Retrying with a new session because of %s' % res)
 
       session = self.open_session(self.user)
@@ -390,7 +391,7 @@ class HiveServerClient:
 
     return self.fetch_result(res.operationHandle)
 
-# TFetchOrientation.FETCH_NEXT
+
   def fetch_result(self, operation_handle, orientation=TFetchOrientation.FETCH_NEXT, max_rows=100):
     fetch_req = TFetchResultsReq(operationHandle=operation_handle, orientation=orientation, maxRows=max_rows)
     res = self.call(self._client.FetchResults, fetch_req)

+ 2 - 10
apps/beeswax/src/beeswax/templates/execute.mako

@@ -67,16 +67,8 @@ ${layout.menubar(section='query')}
             <div class="well sidebar-nav">
                 <form id="advancedSettingsForm" action="${action}" method="POST" class="form form-horizontal noPadding">
                     <ul class="nav nav-list">
-                        <li class="nav-header
-                        % if app_name == 'impala':
-                            hide
-                        % endif
-                        ">${_('database')}</li>
-                        <li
-                        % if app_name == 'impala':
-                            class="hide"
-                        % endif
-                        >
+                        <li class="nav-header">${_('database')}</li>
+                        <li>
                           ${ form.query['database'] | n,unicode }
                         </li>
                         <li class="nav-header">${_('settings')}</li>

+ 18 - 13
apps/beeswax/src/beeswax/views.py

@@ -46,7 +46,7 @@ import beeswax.management.commands.beeswax_install_examples
 from beeswax import common, data_export, models, conf
 from beeswax.forms import QueryForm
 from beeswax.design import HQLdesign, hql_query
-from beeswax.models import SavedQuery, make_query_context
+from beeswax.models import SavedQuery, make_query_context, QueryHistory
 from beeswax.server import dbms
 from beeswax.server.dbms import expand_exception, get_query_server_config
 
@@ -491,6 +491,7 @@ def view_results(request, id, first_row=0):
 
   The query results MUST be ready.
   To display query results, one should always go through the watch_query view.
+  If the result set has has_result_set=False, display an empty result.
 
   If ``first_row`` is 0, restarts (if necessary) the query read.  Otherwise, just
   spits out a warning if first_row doesn't match the servers conception.
@@ -500,8 +501,12 @@ def view_results(request, id, first_row=0):
   """
   first_row = long(first_row)
   start_over = (first_row == 0)
-  results = None
-  data = None
+  results = type('Result', (object,), {
+                'rows': 0,
+                'columns': [],
+                'has_more': False,
+                'start_row': 0, })
+  data = []
   fetch_error = False
   error_message = ''
   log = ''
@@ -524,23 +529,20 @@ def view_results(request, id, first_row=0):
     state = models.QueryHistory.STATE.expired
     query_history.save_state(state)
 
-  # Retrieve query results
+  # Retrieve query results or use empty result if no result set
   try:
-    if not download:
+    if not handle.has_result_set:
+      downloadable = False
+    elif not download:
       results = db.fetch(handle, start_over, 100)
       data = list(results.rows()) # Materialize results
 
       # We display the "Download" button only when we know that there are results:
       downloadable = first_row > 0 or data
+      log = db.get_log(handle)
     else:
       downloadable = True
-      data = []
-      results = type('Result', (object,), {
-                    'rows': 0,
-                    'columns': [],
-                    'has_more': False,
-                    'start_row': 0, })
-    log = db.get_log(handle)
+
   except Exception, ex:
     fetch_error = True
     error_message, log = expand_exception(ex, db, handle)
@@ -1125,7 +1127,10 @@ def _get_query_handle_and_state(query_history):
   if handle is None:
     raise PopupException(_("Failed to retrieve query state from the Query Server."))
 
-  state = dbms.get(query_history.owner, query_history.get_query_server_config()).get_state(handle)
+  if handle.has_result_set:
+    state = dbms.get(query_history.owner, query_history.get_query_server_config()).get_state(handle)
+  else:
+    state = QueryHistory.STATE.available
 
   if state is None:
     raise PopupException(_("Failed to contact Beeswax Server to check query status."))

+ 1 - 1
apps/impala/static/help/index.html

@@ -208,6 +208,6 @@ A copy of the query displays in the Query Editor window.
                         </td>
 		    </tr>
 	    </table>
-	    
+	
     </body>
 </html>