Преглед на файлове

AMBARI-18496. Include an option to download the saved query in hive view. (Anita Gnanamalar Jebaraj via dipayanb)

Dipayan Bhowmick преди 9 години
родител
ревизия
13d3b8b061

+ 42 - 5
contrib/views/hive-next/src/main/java/org/apache/ambari/view/hive2/resources/savedQueries/SavedQueryService.java

@@ -37,7 +37,16 @@ import javax.ws.rs.*;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.core.StreamingOutput;
 import javax.ws.rs.core.UriInfo;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
 import java.util.List;
 
 /**
@@ -73,12 +82,40 @@ public class SavedQueryService extends BaseService {
   @GET
   @Path("{queryId}")
   @Produces(MediaType.APPLICATION_JSON)
-  public Response getOne(@PathParam("queryId") String queryId) {
+  public Response getOne(@PathParam("queryId") String queryId,
+		         @QueryParam("op") String operation) {
     try {
-      SavedQuery savedQuery = getResourceManager().read(queryId);
-      JSONObject object = new JSONObject();
-      object.put("savedQuery", savedQuery);
-      return Response.ok(object).build();
+      final SavedQuery savedQuery = getResourceManager().read(queryId);    
+      if(operation.equals("download")) {
+    	StreamingOutput stream = new StreamingOutput() {
+    	@Override
+    	public void write(OutputStream os) throws IOException, WebApplicationException {
+    	  Writer writer = new BufferedWriter(new OutputStreamWriter(os));
+    	  try { 
+            BufferedReader br=new BufferedReader(new InputStreamReader(getSharedObjectsFactory().getHdfsApi().open(savedQuery.getQueryFile())));
+	    String line;
+    	    line=br.readLine();
+    	    while (line != null){
+    	      writer.write(line+"\n");  
+    	      line = br.readLine();
+            }
+            writer.flush();
+    	  } catch (InterruptedException e) {
+	    e.printStackTrace();
+	  } finally {
+	    writer.close();
+    	  }
+    	}
+    	};
+    	return Response.ok(stream).
+               type(MediaType.TEXT_PLAIN).
+    	       build();
+      }
+      else {
+    	 JSONObject object = new JSONObject();
+         object.put("savedQuery", savedQuery);
+         return Response.ok(object).build();
+      }
     } catch (WebApplicationException ex) {
       throw ex;
     } catch (ItemNotFound itemNotFound) {

+ 22 - 2
contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/queries.js

@@ -1,4 +1,4 @@
-/**
+/*
  * 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
@@ -60,7 +60,8 @@ export default Ember.ArrayController.extend(FilterableMixin, {
   //row buttons
   links: [
     "buttons.history",
-    "buttons.delete"
+    "buttons.delete",
+    "buttons.downloadQuery"
   ],
 
   model: function () {
@@ -91,6 +92,25 @@ export default Ember.ArrayController.extend(FilterableMixin, {
             self.get('openQueries').updatedDeletedQueryTab(savedQuery);
           });
 
+          break;
+        case "buttons.downloadQuery":
+          var self = this,
+          defer = Ember.RSVP.defer();
+          this.send('openModal', 
+                    'modal-save', 
+                    {
+                       heading: "modals.downloadQuery.heading",
+                       text: savedQuery.get('title')+".hql",
+                       defer: defer
+                    });
+          defer.promise.then(function (text) {
+            var adapter = self.container.lookup('adapter:application').buildURL();
+            var a = document.createElement('a');
+            a.href = adapter + '/savedQueries/' + savedQuery.get('id') + '?op=download';
+            a.download = text;
+            document.body.appendChild(a);
+            a.click();
+          });
           break;
       }
     },

+ 5 - 0
contrib/views/hive-next/src/main/resources/ui/hive-web/app/initializers/i18n.js

@@ -96,6 +96,10 @@ TRANSLATIONS = {
       hdfs: 'Please enter save path and name'
     },
 
+    downloadQuery: {
+      heading: 'Download Query'
+    },
+
     changeTitle: {
       heading: 'Rename worksheet'
     },
@@ -189,6 +193,7 @@ TRANSLATIONS = {
     explain: 'Explain',
     saveAs: 'Save as...',
     save: 'Save',
+    downloadQuery: 'Download',
     newQuery: 'New Worksheet',
     newUdf: 'New UDF',
     history: 'History',

+ 42 - 6
contrib/views/hive/src/main/java/org/apache/ambari/view/hive/resources/savedQueries/SavedQueryService.java

@@ -37,7 +37,15 @@ import javax.ws.rs.*;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.core.StreamingOutput;
 import javax.ws.rs.core.UriInfo;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
 import java.util.List;
 
 /**
@@ -73,12 +81,40 @@ public class SavedQueryService extends BaseService {
   @GET
   @Path("{queryId}")
   @Produces(MediaType.APPLICATION_JSON)
-  public Response getOne(@PathParam("queryId") String queryId) {
-    try {
-      SavedQuery savedQuery = getResourceManager().read(queryId);
-      JSONObject object = new JSONObject();
-      object.put("savedQuery", savedQuery);
-      return Response.ok(object).build();
+  public Response getOne(@PathParam("queryId") String queryId,
+                         @QueryParam("op") String operation) {
+  try {
+    final SavedQuery savedQuery = getResourceManager().read(queryId);
+    if(operation.equals("download")) {
+      StreamingOutput stream = new StreamingOutput() {
+      @Override
+      public void write(OutputStream os) throws IOException, WebApplicationException {
+        Writer writer = new BufferedWriter(new OutputStreamWriter(os));
+        try {
+          BufferedReader br=new BufferedReader(new InputStreamReader(getSharedObjectsFactory().getHdfsApi().open(savedQuery.getQueryFile())));
+          String line;
+          line=br.readLine();
+          while (line != null){
+            writer.write(line+"\n");
+            line = br.readLine();
+          }
+          writer.flush();
+        } catch (InterruptedException e) {
+          e.printStackTrace();
+        } finally {
+          writer.close();
+        }
+        }
+      };
+      return Response.ok(stream).
+             type(MediaType.TEXT_PLAIN).
+             build();
+    }
+    else {
+       JSONObject object = new JSONObject();
+       object.put("savedQuery", savedQuery);
+       return Response.ok(object).build();
+    }
     } catch (WebApplicationException ex) {
       throw ex;
     } catch (ItemNotFound itemNotFound) {

+ 21 - 1
contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/queries.js

@@ -60,7 +60,8 @@ export default Ember.ArrayController.extend(FilterableMixin, {
   //row buttons
   links: [
     "buttons.history",
-    "buttons.delete"
+    "buttons.delete",
+    "buttons.downloadQuery"
   ],
 
   model: function () {
@@ -91,6 +92,25 @@ export default Ember.ArrayController.extend(FilterableMixin, {
             self.get('openQueries').updatedDeletedQueryTab(savedQuery);
           });
 
+          break;
+        case "buttons.downloadQuery":
+          var self = this,
+          defer = Ember.RSVP.defer();
+          this.send('openModal', 
+                    'modal-save', 
+                    {
+                       heading: "modals.downloadQuery.heading",
+                       text: savedQuery.get('title') + ".hql",
+                       defer: defer
+                    });
+          defer.promise.then(function (text) {
+            var adapter  = self.container.lookup('adapter:application').buildURL();
+            var a = document.createElement('a');
+            a.href = adapter + '/savedQueries/' + savedQuery.get('id') + '?op=download';
+            a.download = text;
+            document.body.appendChild(a);
+            a.click();
+          });
           break;
       }
     },

+ 4 - 1
contrib/views/hive/src/main/resources/ui/hive-web/app/initializers/i18n.js

@@ -95,7 +95,9 @@ TRANSLATIONS = {
       csv: 'Download results as CSV',
       hdfs: 'Please enter save path and name'
     },
-
+    downloadQuery: {
+      heading: 'Download Query'
+    },
     changeTitle: {
       heading: 'Rename worksheet'
     },
@@ -189,6 +191,7 @@ TRANSLATIONS = {
     explain: 'Explain',
     saveAs: 'Save as...',
     save: 'Save',
+    downloadQuery: 'Download',
     newQuery: 'New Worksheet',
     newUdf: 'New UDF',
     history: 'History',

+ 13 - 3
contrib/views/hive/src/test/java/org/apache/ambari/view/hive/resources/savedQueries/SavedQueryServiceTest.java

@@ -122,7 +122,7 @@ public class SavedQueryServiceTest extends HDFSTest {
   @Test
   public void notFound() {
     thrown.expect(NotFoundFormattedException.class);
-    savedQueryService.getOne("4242");
+    savedQueryService.getOne("4242", null);
   }
 
   @Test
@@ -137,7 +137,7 @@ public class SavedQueryServiceTest extends HDFSTest {
     Response response = savedQueryService.update(request, String.valueOf(createdId));
     Assert.assertEquals(204, response.getStatus());
 
-    Response response2 = savedQueryService.getOne(String.valueOf(createdId));
+    Response response2 = savedQueryService.getOne(String.valueOf(createdId), "");
     Assert.assertEquals(200, response2.getStatus());
 
     JSONObject obj = ((JSONObject) response2.getEntity());
@@ -154,7 +154,7 @@ public class SavedQueryServiceTest extends HDFSTest {
     Assert.assertEquals(204, response.getStatus());
 
     thrown.expect(NotFoundFormattedException.class);
-    savedQueryService.getOne(String.valueOf(createdId));
+    savedQueryService.getOne(String.valueOf(createdId),null);
   }
 
   @Test
@@ -178,4 +178,14 @@ public class SavedQueryServiceTest extends HDFSTest {
         containsTitle = containsTitle || item.getTitle().compareTo("Title 2") == 0;
     Assert.assertTrue(containsTitle);
   }
+  @Test
+  public void downloadQuery() {
+    Response created = doCreateSavedQuery();
+    Object createdId = ((SavedQuery) ((JSONObject) created.getEntity()).get("savedQuery")).getId();
+    SavedQueryService.SavedQueryRequest request = new SavedQueryService.SavedQueryRequest();
+    request.savedQuery = new SavedQuery();
+    request.savedQuery.setTitle("Download Query");
+    Response response = savedQueryService.getOne(String.valueOf(createdId), "download");
+    Assert.assertEquals(200, response.getStatus());
+  }
 }