Ver Fonte

HUE-6083 [metastore] Convert drop partition action to a task

Romain Rigaux há 8 anos atrás
pai
commit
a84ba9c

+ 10 - 5
apps/beeswax/src/beeswax/server/dbms.py

@@ -843,17 +843,22 @@ class HiveServer2Dbms(object):
     return self.client.get_table(db_name, table_name, partition_spec=partition_spec)
 
 
-  def drop_partitions(self, db_name, table_name, partition_specs, design):
+  def drop_partitions(self, db_name, table_name, partition_specs, design=None, generate_ddl_only=False):
     hql = []
 
     for partition_spec in partition_specs:
       hql.append("ALTER TABLE `%s`.`%s` DROP IF EXISTS PARTITION (%s) PURGE" % (db_name, table_name, partition_spec))
 
-    query = hql_query(';'.join(hql), db_name)
-    design.data = query.dumps()
-    design.save()
+    hql = ';'.join(hql)
+    query = hql_query(hql, db_name)
 
-    return self.execute_query(query, design)
+    if generate_ddl_only:
+      return hql
+    else:
+      design.data = query.dumps()
+      design.save()
+
+      return self.execute_query(query, design)
 
 
   def get_indexes(self, db_name, table_name):

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

@@ -773,11 +773,13 @@ ${ components.menubar(is_embeddable) }
     <span data-bind="visible: !values().length" style="display: none;">${ _('The partition does not contain any values') }</span>
     <!-- /ko -->
   </div>
+
   % if has_write_access:
   <div id="dropPartition" class="modal hide fade">
     % if is_embeddable:
       <form data-bind="attr: { 'action': '/metastore/table/' + $parent.database.name + '/' + $parent.name + '/partitions/drop' }, submit: dropAndWatch" method="POST">
         <input type="hidden" name="is_embeddable" value="true"/>
+        <input type="hidden" name="format" value="json"/>
     % else:
       <form data-bind="attr: { 'action': '/metastore/table/' + $parent.database.name + '/' + $parent.name + '/partitions/drop' }" method="POST">
     % endif
@@ -796,10 +798,9 @@ ${ components.menubar(is_embeddable) }
     % endif
   <!-- /ko -->
 
-
-
 </script>
 
+
 <script type="text/html" id="metastore-sample-tab">
   <!-- ko with: samples -->
   <!-- ko if: loading -->
@@ -1295,7 +1296,9 @@ ${ components.menubar(is_embeddable) }
 
       huePubSub.subscribe('metastore.clear.selection', function () {
         viewModel.selectedDatabases.removeAll();
-        viewModel.selectedTables.removeAll();
+        if (viewModel.database()) {
+          viewModel.database().selectedTables.removeAll();
+        }
       }, 'metastore');
 
       viewModel.currentTab.subscribe(function(tab){

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

@@ -598,11 +598,24 @@ def drop_partition(request, database, table):
     partition_specs = request.POST.getlist('partition_selection')
     partition_specs = [spec for spec in partition_specs]
     try:
-      design = SavedQuery.create_empty(app_name='beeswax', owner=request.user, data=hql_query('').dumps())
-      query_history = db.drop_partitions(database, table, partition_specs, design)
-      url = reverse('beeswax:watch_query_history', kwargs={'query_history_id': query_history.id}) + '?on_success_url=' + \
-            reverse('metastore:describe_partitions', kwargs={'database': database, 'table': table})
-      return redirect(url)
+      if request.REQUEST.get("format", "html") == "json":
+        sql = db.drop_partitions(database, table, partition_specs, design=None, generate_ddl_only=True)
+        job = make_notebook(
+            name=_('Drop partition %s') % ', '.join(partition_specs)[:100],
+            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:
+        design = SavedQuery.create_empty(app_name='beeswax', owner=request.user, data=hql_query('').dumps())
+        query_history = db.drop_partitions(database, table, partition_specs, design)
+        url = reverse('beeswax:watch_query_history', kwargs={'query_history_id': query_history.id}) + '?on_success_url=' + \
+              reverse('metastore:describe_partitions', kwargs={'database': database, 'table': table})
+        return redirect(url)
     except Exception, ex:
       error_message, log = dbms.expand_exception(ex, db)
       error = _("Failed to remove %(partition)s.  Error: %(error)s") % {'partition': '\n'.join(partition_specs), 'error': error_message}