AMBARI-18496. Include an option to download the saved query in hive view. (Anita Gnanamalar Jebaraj via dipayanb)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/8813b1f9 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/8813b1f9 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/8813b1f9 Branch: refs/heads/branch-feature-AMBARI-18456 Commit: 8813b1f9295f052a0f28ac622fdd214964cec7c6 Parents: e7074ec Author: Dipayan Bhowmick <dipayan.bhowm...@gmail.com> Authored: Sat Oct 8 01:16:16 2016 +0530 Committer: Dipayan Bhowmick <dipayan.bhowm...@gmail.com> Committed: Sat Oct 8 01:17:39 2016 +0530 ---------------------------------------------------------------------- .../savedQueries/SavedQueryService.java | 47 +++++++++++++++++-- .../ui/hive-web/app/controllers/queries.js | 24 +++++++++- .../ui/hive-web/app/initializers/i18n.js | 5 ++ .../savedQueries/SavedQueryService.java | 48 +++++++++++++++++--- .../ui/hive-web/app/controllers/queries.js | 22 ++++++++- .../ui/hive-web/app/initializers/i18n.js | 5 +- .../savedQueries/SavedQueryServiceTest.java | 16 +++++-- 7 files changed, 149 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/8813b1f9/contrib/views/hive-next/src/main/java/org/apache/ambari/view/hive2/resources/savedQueries/SavedQueryService.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive-next/src/main/java/org/apache/ambari/view/hive2/resources/savedQueries/SavedQueryService.java b/contrib/views/hive-next/src/main/java/org/apache/ambari/view/hive2/resources/savedQueries/SavedQueryService.java index ccc4512..9b844d6 100644 --- a/contrib/views/hive-next/src/main/java/org/apache/ambari/view/hive2/resources/savedQueries/SavedQueryService.java +++ b/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) { http://git-wip-us.apache.org/repos/asf/ambari/blob/8813b1f9/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/queries.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/queries.js b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/queries.js index cbf6b42..4438c5a 100644 --- a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/controllers/queries.js +++ b/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 () { @@ -92,6 +93,25 @@ export default Ember.ArrayController.extend(FilterableMixin, { }); 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; } }, http://git-wip-us.apache.org/repos/asf/ambari/blob/8813b1f9/contrib/views/hive-next/src/main/resources/ui/hive-web/app/initializers/i18n.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/initializers/i18n.js b/contrib/views/hive-next/src/main/resources/ui/hive-web/app/initializers/i18n.js index f7f7706..cc789e8 100644 --- a/contrib/views/hive-next/src/main/resources/ui/hive-web/app/initializers/i18n.js +++ b/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', http://git-wip-us.apache.org/repos/asf/ambari/blob/8813b1f9/contrib/views/hive/src/main/java/org/apache/ambari/view/hive/resources/savedQueries/SavedQueryService.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/java/org/apache/ambari/view/hive/resources/savedQueries/SavedQueryService.java b/contrib/views/hive/src/main/java/org/apache/ambari/view/hive/resources/savedQueries/SavedQueryService.java index 9ea19c6..4a5872c 100644 --- a/contrib/views/hive/src/main/java/org/apache/ambari/view/hive/resources/savedQueries/SavedQueryService.java +++ b/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) { http://git-wip-us.apache.org/repos/asf/ambari/blob/8813b1f9/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/queries.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/queries.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/queries.js index cbf6b42..4d82ae0 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/queries.js +++ b/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 () { @@ -92,6 +93,25 @@ export default Ember.ArrayController.extend(FilterableMixin, { }); 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; } }, http://git-wip-us.apache.org/repos/asf/ambari/blob/8813b1f9/contrib/views/hive/src/main/resources/ui/hive-web/app/initializers/i18n.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/initializers/i18n.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/initializers/i18n.js index f7f7706..aca366f 100644 --- a/contrib/views/hive/src/main/resources/ui/hive-web/app/initializers/i18n.js +++ b/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', http://git-wip-us.apache.org/repos/asf/ambari/blob/8813b1f9/contrib/views/hive/src/test/java/org/apache/ambari/view/hive/resources/savedQueries/SavedQueryServiceTest.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive/src/test/java/org/apache/ambari/view/hive/resources/savedQueries/SavedQueryServiceTest.java b/contrib/views/hive/src/test/java/org/apache/ambari/view/hive/resources/savedQueries/SavedQueryServiceTest.java index d55858f..68cb0c8 100644 --- a/contrib/views/hive/src/test/java/org/apache/ambari/view/hive/resources/savedQueries/SavedQueryServiceTest.java +++ b/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()); + } }