浏览代码

HUE-6060 [editor] Support dropping databases in responsive

Romain Rigaux 8 年之前
父节点
当前提交
0a5c4ac

+ 12 - 8
apps/beeswax/src/beeswax/server/dbms.py

@@ -570,13 +570,13 @@ class HiveServer2Dbms(object):
         hql.append(drop_query)
 
     query = hql_query(';'.join(hql), database)
-    
+
     if generate_ddl_only:
-      return query
-    else:   
+      return query.hql_query
+    else:
       design.data = query.dumps()
       design.save()
-  
+
       return self.execute_query(query, design)
 
 
@@ -584,16 +584,20 @@ class HiveServer2Dbms(object):
     return self.execute_statement("DROP DATABASE `%s`" % database)
 
 
-  def drop_databases(self, databases, design):
+  def drop_databases(self, databases, design, generate_ddl_only=False):
     hql = []
 
     for database in databases:
       hql.append("DROP DATABASE `%s` CASCADE" % database)
     query = hql_query(';'.join(hql), database)
-    design.data = query.dumps()
-    design.save()
 
-    return self.execute_query(query, design)
+    if generate_ddl_only:
+      return query.hql_query
+    else:
+      design.data = query.dumps()
+      design.save()
+
+      return self.execute_query(query, design)
 
   def _get_and_validate_select_query(self, design, query_history):
     query = design.get_query_statement(query_history.statement_number)

+ 10 - 3
apps/metastore/src/metastore/templates/metastore.mako

@@ -323,7 +323,13 @@ ${ components.menubar() }
     % if has_write_access:
       <button class="btn toolbarBtn margin-left-20" title="${_('Drop the selected databases')}" data-bind="click: function () { $('#dropDatabase').modal('show'); }, disable: selectedDatabases().length === 0"><i class="fa fa-times"></i>  ${_('Drop')}</button>
       <div id="dropDatabase" class="modal hide fade">
+
+      % if is_embeddable:
+        <form action="/metastore/databases/drop" data-bind="submit: dropAndWatch" method="POST">
+          <input type="hidden" name="is_embeddable" value="true"/>
+      % else:
         <form id="dropDatabaseForm" action="/metastore/databases/drop" method="POST">
+      % endif
           ${ csrf_token(request) | n,unicode }
           <div class="modal-header">
             <a href="#" class="close" data-dismiss="modal">&times</a>
@@ -509,7 +515,7 @@ ${ components.menubar() }
   % if has_write_access:
     <div id="dropTable" class="modal hide fade">
       % if is_embeddable:
-        <form data-bind="attr: { 'action': '/metastore/tables/drop/' + name }, submit: dropTables" method="POST">
+        <form data-bind="attr: { 'action': '/metastore/tables/drop/' + name }, submit: dropAndWatch" method="POST">
           <input type="hidden" name="is_embeddable" value="true"/>
       % else:
         <form data-bind="attr: { 'action': '/metastore/tables/drop/' + name }" method="POST">
@@ -1098,7 +1104,7 @@ ${ components.menubar() }
 
   <div id="dropSingleTable" class="modal hide fade">
     % if is_embeddable:
-    <form data-bind="submit: dropTables" method="POST">
+    <form data-bind="submit: dropAndWatch" method="POST">
       <input type="hidden" name="is_embeddable" value="true"/>
     % else:
     <form method="POST">
@@ -1125,7 +1131,7 @@ ${ components.menubar() }
 
 <script type="text/javascript">
 
-  function dropTables(formElement) {
+  function dropAndWatch(formElement) {
     $(formElement).ajaxSubmit({
       dataType: 'json',
       success: function(resp) {
@@ -1136,6 +1142,7 @@ ${ components.menubar() }
         }
         $("#dropTable").modal('hide');
         $("#dropSingleTable").modal('hide');
+        $("#dropDatabase").modal('hide');
       },
       error: function (xhr, textStatus, errorThrown) {
         $(document).trigger("error", xhr.responseText);

+ 18 - 5
apps/metastore/src/metastore/views.py

@@ -98,11 +98,24 @@ def drop_database(request):
     databases = request.POST.getlist('database_selection')
 
     try:
-      # Can't be simpler without an important refactoring
       design = SavedQuery.create_empty(app_name='beeswax', owner=request.user, data=hql_query('').dumps())
-      query_history = db.drop_databases(databases, design)
-      url = reverse('beeswax:watch_query_history', kwargs={'query_history_id': query_history.id}) + '?on_success_url=' + reverse('metastore:databases')
-      return redirect(url)
+
+      if request.POST.get('is_embeddable'):
+        sql = db.drop_databases(databases, design, generate_ddl_only=True)
+        job = make_notebook(
+            name='Execute and watch',
+            editor_type='hive',
+            statement=sql.strip(),
+            status='ready',
+            database=None,
+            on_success_url='assist.db.refresh',
+            is_task=True
+        )
+        return JsonResponse(job.execute(request))
+      else:
+        query_history = db.drop_databases(databases, design)
+        url = reverse('beeswax:watch_query_history', kwargs={'query_history_id': query_history.id}) + '?on_success_url=' + reverse('metastore:databases')
+        return redirect(url)
     except Exception, ex:
       error_message, log = dbms.expand_exception(ex, db)
       error = _("Failed to remove %(databases)s.  Error: %(error)s") % {'databases': ','.join(databases), 'error': error_message}
@@ -376,7 +389,7 @@ def drop_table(request, database):
       skip_trash = request.POST.get('skip_trash') == 'on'
 
       if request.POST.get('is_embeddable'):
-        sql = db.drop_tables(database, tables_objects, design=None, skip_trash=skip_trash, generate_ddl_only=True).hql_query
+        sql = db.drop_tables(database, tables_objects, design=None, skip_trash=skip_trash, generate_ddl_only=True)
         job = make_notebook(
             name='Execute and watch',
             editor_type='hive',

+ 1 - 1
desktop/libs/indexer/src/indexer/views.py

@@ -99,7 +99,7 @@ def importer_prefill(request, source_type, target_type, target_path=None):
     'target_type': target_type,
     'target_path': target_path or ''
   }
-  
+
   return _importer(request, prefill)
 
 

+ 2 - 1
desktop/libs/notebook/src/notebook/connectors/hiveserver2.py

@@ -229,7 +229,8 @@ class HS2Api(Api):
 
     try:
       if statement.get('statement_id') == 0:
-        db.use(query.database)
+        if query.database:
+          db.use(query.database)
       handle = db.client.query(query, withMultipleSession=True)
     except QueryServerException, ex:
       raise QueryError(ex.message, handle=statement)