Repository: ambari Updated Branches: refs/heads/trunk fad8f2745 -> 316d33a9b
AMBARI-20076. Hive View 2: Results of one query reflected in other (pallavkul) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/316d33a9 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/316d33a9 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/316d33a9 Branch: refs/heads/trunk Commit: 316d33a9b7f95610dc2f603c3140e1dda695ed04 Parents: fad8f27 Author: pallavkul <[email protected]> Authored: Mon Feb 20 14:30:52 2017 +0530 Committer: pallavkul <[email protected]> Committed: Mon Feb 20 14:30:52 2017 +0530 ---------------------------------------------------------------------- .../src/main/resources/ui/app/adapters/query.js | 6 +- .../ui/app/components/query-result-table.js | 8 +- .../resources/ui/app/configs/result-tabs.js | 48 ++ .../main/resources/ui/app/models/worksheet.js | 8 +- .../hive20/src/main/resources/ui/app/router.js | 6 +- .../resources/ui/app/routes/queries/query.js | 450 ++++++++++--------- .../ui/app/routes/queries/query/loading.js | 24 + .../ui/app/routes/queries/query/log.js | 104 +++++ .../ui/app/routes/queries/query/results.js | 59 +++ .../ui/app/routes/queries/query/tez-ui.js | 45 ++ .../app/routes/queries/query/visual-explain.js | 56 +++ .../src/main/resources/ui/app/services/query.js | 4 +- .../templates/components/query-result-table.hbs | 20 +- .../app/templates/components/visual-explain.hbs | 1 - .../ui/app/templates/queries/query.hbs | 64 +-- .../ui/app/templates/queries/query/loading.hbs | 21 + .../ui/app/templates/queries/query/log.hbs | 29 ++ .../ui/app/templates/queries/query/results.hbs | 49 ++ .../ui/app/templates/queries/query/tez-ui.hbs | 19 + .../templates/queries/query/visual-explain.hbs | 33 ++ .../src/main/resources/ui/config/environment.js | 2 +- 21 files changed, 743 insertions(+), 313 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/adapters/query.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/adapters/query.js b/contrib/views/hive20/src/main/resources/ui/app/adapters/query.js index e519e64..f878230 100644 --- a/contrib/views/hive20/src/main/resources/ui/app/adapters/query.js +++ b/contrib/views/hive20/src/main/resources/ui/app/adapters/query.js @@ -29,13 +29,13 @@ export default ApplicationAdapter.extend({ let postURL = this.buildURL(); return this.ajax(postURL , 'POST', { data: {job: payload} }); }, - getJob(jobId, dateSubmitted, firstCall){ + getJob(jobId, firstCall){ let url = ''; if(firstCall){ - url = this.buildURL() + jobId + '/results?first=true&_='+ dateSubmitted; + url = this.buildURL() + jobId + '/results?first=true'; }else { - url = this.buildURL() + jobId + '/results?_='+ dateSubmitted; + url = this.buildURL() + jobId + '/results'; } return this.ajax(url, 'GET') http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/components/query-result-table.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/components/query-result-table.js b/contrib/views/hive20/src/main/resources/ui/app/components/query-result-table.js index 0373f72..ea6dbc9 100644 --- a/contrib/views/hive20/src/main/resources/ui/app/components/query-result-table.js +++ b/contrib/views/hive20/src/main/resources/ui/app/components/query-result-table.js @@ -82,11 +82,11 @@ export default Ember.Component.extend({ onColumnClick(column) { //console.log('I am in onColumnClick'); }, - goNextPage(){ - this.sendAction('goNextPage'); + goNextPage(payloadTitle){ + this.sendAction('goNextPage', payloadTitle); }, - goPrevPage(){ - this.sendAction('goPrevPage'); + goPrevPage(payloadTitle){ + this.sendAction('goPrevPage', payloadTitle); }, expandQueryResultPanel(){ this.sendAction('expandQueryResultPanel'); http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/configs/result-tabs.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/configs/result-tabs.js b/contrib/views/hive20/src/main/resources/ui/app/configs/result-tabs.js new file mode 100644 index 0000000..f48dcd8 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/configs/result-tabs.js @@ -0,0 +1,48 @@ +/** + * 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 + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Ember from 'ember'; + +let resultsTabs = [ + Ember.Object.create({ + name: 'results', + label: 'RESULTS', + link: 'queries.query.results', + faIcon: 'paper-plane' + }), + Ember.Object.create({ + name: 'log', + label: 'LOG', + link: 'queries.query.log', + faIcon: 'paper-plane' + }), + Ember.Object.create({ + name: 'visual-explain', + label: 'VISUAL EXPLAIN', + link: 'queries.query.visual-explain', + faIcon: 'paper-plane' + }), + Ember.Object.create({ + name: 'tez-ui', + label: 'TEZ UI', + link: 'queries.query.tez-ui', + faIcon: 'paper-plane' + }) +]; + +export default resultsTabs; http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/models/worksheet.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/models/worksheet.js b/contrib/views/hive20/src/main/resources/ui/app/models/worksheet.js index 1787cc7..4b3e1f9 100644 --- a/contrib/views/hive20/src/main/resources/ui/app/models/worksheet.js +++ b/contrib/views/hive20/src/main/resources/ui/app/models/worksheet.js @@ -30,13 +30,15 @@ export default DS.Model.extend({ selected: DS.attr('boolean', {transient: true, defaultValue: false}), jobData: DS.attr({defaultValue: []}), currentJobData: DS.attr({defaultValue: null}), - hidePreviousButton: DS.attr('boolean', { defaultValue: true}), + hasNext: DS.attr('boolean', { defaultValue: false}), + hasPrevious: DS.attr('boolean', { defaultValue: false}), selectedTablesModels: DS.attr(), selectedMultiDb: DS.attr(), queryFile: DS.attr('string', {defaultValue: ""}), logFile: DS.attr('string', {defaultValue: ""}), logResults: DS.attr('string', {defaultValue: ""}), isQueryRunning: DS.attr('boolean', {defaultValue: false}), - isQueryResultContainer: DS.attr('boolean', {defaultValue: false}) - + isQueryResultContainer: DS.attr('boolean', {defaultValue: false}), + visualExplainJson: DS.attr({defaultValue: null}), + lastResultRoute: DS.attr({defaultValue: ""}) }); http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/router.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/router.js b/contrib/views/hive20/src/main/resources/ui/app/router.js index ffb0f83..250f945 100644 --- a/contrib/views/hive20/src/main/resources/ui/app/router.js +++ b/contrib/views/hive20/src/main/resources/ui/app/router.js @@ -66,7 +66,11 @@ Router.map(function() { this.route('queries', function() { this.route('new'); this.route('query', {path: '/:worksheetId'}, function() { - + this.route('results'); + this.route('log'); + this.route('visual-explain'); + this.route('tez-ui'); + this.route('loading'); }); }); }); http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query.js b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query.js index 88202ff..04bb1da 100644 --- a/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query.js +++ b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query.js @@ -17,17 +17,19 @@ */ import Ember from 'ember'; +import tabs from '../../configs/result-tabs'; +import UILoggerMixin from '../../mixins/ui-logger'; -export default Ember.Route.extend({ - +export default Ember.Route.extend(UILoggerMixin, { query: Ember.inject.service(), jobs: Ember.inject.service(), savedQueries: Ember.inject.service(), - isQueryEdidorPaneExpanded: false, isQueryResultPanelExpanded: false, + globalSettings: '', - beforeModel(){ + beforeModel(params){ + console.log('worksheetId', params.params['queries.query'].worksheetId); let existingWorksheets = this.store.peekAll('worksheet'); existingWorksheets.setEach('selected', false); }, @@ -48,17 +50,36 @@ export default Ember.Route.extend({ }; fileResourceList.push(localFileResource); }); - this.controller.set('fileResourceList', fileResourceList); + }); + this.store.findAll('setting').then((data) => { + let localStr = ''; + data.forEach(x => { + localStr = localStr + 'set '+ x.get('key')+ '='+ x.get('value') + '\n'; + }); + this.set('globalSettings', localStr); }); + //lastResultRoute + console.log('lastResultRoute:: ', model.get('lastResultRoute')); + let lastResultRoute = model.get('lastResultRoute'); + if(Ember.isEmpty(lastResultRoute)){ + if(model.get('jobData').length > 0){ + this.transitionTo('queries.query.results'); + } else { + this.transitionTo('queries.query'); + } + } else { + this.transitionTo('queries.query' + lastResultRoute); + } }, model(params) { let selectedWs = this.store.peekAll('worksheet').filterBy('title', params.worksheetId).get('firstObject'); + if(selectedWs) { selectedWs.set('selected', true); return selectedWs; @@ -71,13 +92,8 @@ export default Ember.Route.extend({ this._super(...arguments); - controller.set('showWorksheetModal',false); - controller.set('worksheetModalSuccess',false); - controller.set('worksheetModalFail',false); - let self = this; let alldatabases = this.store.findAll('database'); - controller.set('alldatabases',alldatabases); let selecteDBName = model.get('selectedDb'); @@ -96,14 +112,14 @@ export default Ember.Route.extend({ selectedMultiDb.pushObject(selecteDBName); controller.set('worksheet', model); - controller.set('selectedTablesModels',model.get('selectedTablesModels') || selectedTablesModels ); + controller.set('selectedTablesModels',model.get('selectedTablesModels') || selectedTablesModels ); controller.set('selectedMultiDb', model.get('selectedMultiDb') || selectedMultiDb); + controller.set('isQueryRunning', model.get('isQueryRunning')); controller.set('currentQuery', model.get('query')); - controller.set('queryResult', model.get('queryResult')); controller.set('currentJobId', null); - + controller.set('queryResult', model.get('queryResult')); controller.set('isJobSuccess', false); controller.set('isExportResultSuccessMessege', false); @@ -111,24 +127,36 @@ export default Ember.Route.extend({ controller.set('showSaveHdfsModal', false); controller.set('logResults', model.get('logResults') || ''); - controller.set('showQueryEditorLog', false); - controller.set('showQueryEditorResult', !controller.get('showQueryEditorLog')); controller.set('isVisualExplainQuery', false); - controller.set('visualExplainJson', null); + controller.set('visualExplainJson', model.get('visualExplainJson')); - }, + controller.set('showWorksheetModal',false); + controller.set('worksheetModalSuccess',false); + controller.set('worksheetModalFail',false); + controller.set('tabs', tabs); + + }, actions: { - createQuery(udfName, udfClassname, fileResourceName, fileResourcePath){ - let query = "add jar "+ fileResourcePath + ";\ncreate temporary function " + udfName + " as '"+ udfClassname+ "';"; - this.get('controller').set('currentQuery', query); - this.get('controller.model').set('query', query ); + + resetDefaultWorksheet(){ + this.get('controller.model').set('queryResult',{'schema' :[], 'rows' :[]}); + this.get('controller.model').set('currentPage',0); + this.get('controller.model').set('previousPage',-1); + this.get('controller.model').set('nextPage',1); + //this.get('controller.model').set('selected',false); + this.get('controller.model').set('jobData',[]); + this.get('controller.model').set('currentJobData',null); + this.get('controller.model').set('queryFile',""); + this.get('controller.model').set('logFile',""); + this.get('controller.model').set('logResults',""); + this.get('controller.model').set('isQueryRunning',false); + this.get('controller.model').set('isQueryResultContainer',false); }, changeDbHandler(selectedDBs){ - let self = this; let selectedTablesModels =[]; let selectedMultiDb = []; @@ -142,7 +170,6 @@ export default Ember.Route.extend({ } ) selectedMultiDb.pushObject(db); - }); this.get('controller').set('selectedTablesModels', selectedTablesModels ); @@ -150,7 +177,6 @@ export default Ember.Route.extend({ this.get('controller').set('selectedMultiDb', selectedMultiDb ); this.get('controller.model').set('selectedMultiDb', selectedMultiDb ); - }, showQueryResultContainer(){ @@ -159,8 +185,7 @@ export default Ember.Route.extend({ showTables(db){ let self = this; - //should we do this by writing a seperate component. - $('#' + db).toggle(); + Ember.$('#' + db).toggle(); this.get('controller.model').set('selectedDb', db); }, @@ -169,51 +194,63 @@ export default Ember.Route.extend({ this.send('executeQuery'); }, - executeQuery(isFirstCall){ + updateQuery(query){ + this.get('controller').set('currentQuery', query); + this.get('controller.model').set('query', query); + }, + + executeQuery(){ let self = this; this.get('controller').set('currentJobId', null); - //let queryInput = this.get('controller').get('currentQuery'); let isVisualExplainQuery = this.get('controller').get('isVisualExplainQuery'); - let queryInput = (isVisualExplainQuery) ? 'explain formatted ' + this.get('controller').get('currentQuery') : this.get('controller').get('currentQuery') ; + let queryInput = this.get('controller').get('currentQuery'); + + if (isVisualExplainQuery) { + queryInput = ""; + let queries = this.get('controller').get('currentQuery').split(";").filter(function (query) { + if (query && query.trim()) return true; + }); + + for (let i = 0; i < queries.length; i++) { + if (i == queries.length - 1) { + if(queries[i].toLowerCase().startsWith("explain formatted ")){ + queryInput += queries[i] + ";"; + } else{ + queryInput += "explain formatted " + queries[i] + ";"; + } + } else { + queryInput += queries[i] + ";"; + } + } + } this.get('controller.model').set('query', queryInput); let dbid = this.get('controller.model').get('selectedDb'); let worksheetTitle = this.get('controller.model').get('title'); - self.get('controller.model').set('jobData', []); - self.get('controller.model').set('isQueryRunning', true); + this.get('controller.model').set('jobData', []); + this.get('controller.model').set('isQueryRunning', true); + + this.get('controller').set('queryResult', self.get('controller').get('queryResult')); + this.get('controller.model').set('queryResult', self.get('controller').get('queryResult')); - //Making the result set emply every time query runs. - self.get('controller').set('queryResult', self.get('controller').get('queryResult')); - self.get('controller.model').set('queryResult', self.get('controller').get('queryResult')); + let globalSettings = this.get('globalSettings'); - self.send('showQueryResultContainer'); + this.send('showQueryResultContainer'); let payload ={ "title":worksheetTitle, - "hiveQueryId":null, - "queryFile":null, - "owner":null, "dataBase":dbid, - "status":null, - "statusMessage":null, - "dateSubmitted":null, "forcedContent":queryInput, - "logFile":null, - "dagName":null, - "dagId":null, - "sessionTag":null, - "statusDir":null, "referrer":"job", - "confFile":null, - "globalSettings":""}; + "globalSettings":globalSettings}; - this.get('query').createJob(payload).then(function(data) { + this.get('query').createJob(payload).then(function(data) { self.get('controller.model').set('currentJobData', data); self.get('controller.model').set('queryFile', data.job.queryFile); self.get('controller.model').set('logFile', data.job.logFile); @@ -221,116 +258,81 @@ export default Ember.Route.extend({ self.get('jobs').waitForJobToComplete(data.job.id, 2 * 1000, false) .then((status) => { - - self.get('controller').set('isJobSuccess', true); - - self.send('getJob', data); - - //Last log - self.send('fetchLogs'); - + self.get('controller').set('isJobSuccess', true); + self.send('getJobResult', data, payload.title); }, (error) => { - Ember.run.later(() => { - // TODO: handle error - }, 2 * 1000); + console.log('error', error); + self.get('logger').danger('Failed to execute query.', self.extractError(error)); + self.send('resetDefaultWorksheet'); }); - self.send('getLogsTillJobSuccess', data.job.id); - - }, function(reason) { - console.log(reason); + }, function(error) { + console.log(error); + self.get('logger').danger('Failed to execute query.', self.extractError(error)); + self.send('resetDefaultWorksheet'); }); }, - getLogsTillJobSuccess(jobId){ + getJobResult(data, payloadTitle){ let self = this; - this.get('jobs').waitForJobStatus(jobId) - .then((status) => { - console.log('status', status); - if(status !== "succeeded"){ - self.send('fetchLogs'); - Ember.run.later(() => { - self.send('getLogsTillJobSuccess',jobId ) - }, 5 * 1000); - } else { - self.send('fetchLogs'); - } - }, (error) => { - console.log('error',error); - }); - }, - - fetchLogs(){ - let self = this; - - let logFile = this.get('controller.model').get('logFile'); - this.get('query').retrieveQueryLog(logFile).then(function(data) { - self.get('controller.model').set('logResults', data.file.fileContent); - }, function(error){ - console.log('error', error); - }); - }, - - showVisualExplain(){ - let self = this; - let jobId = this.get('controller').get('currentJobId'); - this.get('query').getVisualExplainJson(jobId).then(function(data) { - console.log('Successful getVisualExplainJson', data); - - self.get('controller').set('visualExplainJson', data.rows[0][0]); - - }, function(error){ - console.log('error getVisualExplainJson', error); - }); - }, - - getJob(data){ - - var self = this; - var data = data; let isVisualExplainQuery = this.get('controller').get('isVisualExplainQuery'); let jobId = data.job.id; - let dateSubmitted = data.job.dateSubmitted; let currentPage = this.get('controller.model').get('currentPage'); let previousPage = this.get('controller.model').get('previousPage'); let nextPage = this.get('controller.model').get('nextPage'); - this.get('query').getJob(jobId, dateSubmitted, true).then(function(data) { - // on fulfillment - console.log('getJob route', data ); + this.get('query').getJob(jobId, true).then(function(data) { + + let existingWorksheets = self.get('store').peekAll('worksheet'); + let myWs = null; + if(existingWorksheets.get('length') > 0) { + myWs = existingWorksheets.filterBy('title', payloadTitle).get('firstObject'); + } - self.get('controller').set('queryResult', data); - self.get('controller.model').set('queryResult', data); - self.get('controller.model').set('isQueryRunning', false); + myWs.set('queryResult', data); + myWs.set('isQueryRunning', false); + myWs.set('hasNext', data.hasNext); - let localArr = self.get('controller.model').get("jobData"); + let localArr = myWs.get("jobData"); localArr.push(data); - self.get('controller.model').set('jobData', localArr); - self.get('controller.model').set('currentPage', currentPage+1); - self.get('controller.model').set('previousPage', previousPage + 1 ); - self.get('controller.model').set('nextPage', nextPage + 1); + myWs.set('jobData', localArr); + myWs.set('currentPage', currentPage+1); + myWs.set('previousPage', previousPage + 1 ); + myWs.set('nextPage', nextPage + 1); if(isVisualExplainQuery){ - Ember.run.later(() => { - self.send('showVisualExplain'); - }, 500); + self.send('showVisualExplain', payloadTitle); } - }, function(reason) { - // on rejection - console.log('reason' , reason); + if( self.paramsFor('queries.query').worksheetId == payloadTitle){ + self.transitionTo('queries.query.results'); + } + + }, function(error) { + console.log('error' , error); }); }, - updateQuery(query){ - this.get('controller').set('currentQuery', query); - this.get('controller.model').set('query', query); + showVisualExplain(payloadTitle){ + let self = this; + let jobId = this.get('controller').get('currentJobId'); + this.get('query').getVisualExplainJson(jobId).then(function(data) { + console.log('Successful getVisualExplainJson', data); + self.get('controller.model').set('visualExplainJson', data.rows[0][0]); + + if( self.paramsFor('queries.query').worksheetId == payloadTitle){ + self.transitionTo('queries.query.visual-explain'); + } + + }, function(error){ + console.log('error getVisualExplainJson', error); + }); }, - goNextPage(){ + goNextPage(payloadTitle){ let currentPage = this.get('controller.model').get('currentPage'); let previousPage = this.get('controller.model').get('previousPage'); @@ -341,15 +343,12 @@ export default Ember.Route.extend({ var self = this; var data = this.get('controller.model').get('currentJobData'); let jobId = data.job.id; - let dateSubmitted = data.job.dateSubmitted; - this.get('query').getJob(jobId, dateSubmitted, false).then(function(data) { - // on fulfillment - console.log('getJob route', data ); - self.get('controller').set('queryResult', data); + this.get('query').getJob(jobId, false).then(function(data) { self.get('controller.model').set('queryResult', data); self.get('controller.model').set('isQueryRunning', false); - self.get('controller.model').set('hidePreviousButton', false); + self.get('controller.model').set('hasNext', data.hasNext); + self.get('controller.model').set('hasPrevious', true); let localArr = self.get('controller.model').get("jobData"); localArr.push(data); @@ -358,21 +357,33 @@ export default Ember.Route.extend({ self.get('controller.model').set('currentPage', currentPage+1); self.get('controller.model').set('previousPage', previousPage + 1 ); self.get('controller.model').set('nextPage', nextPage + 1); - }, function(reason) { - // on rejection - console.log('reason' , reason); + }, function(error) { + console.log('error' , error); }); - } else { //Pages from cache object + } else { + //Pages from cache object this.get('controller.model').set('currentPage', currentPage+1); this.get('controller.model').set('previousPage', previousPage + 1 ); this.get('controller.model').set('nextPage', nextPage + 1); - this.get('controller.model').set('hidePreviousButton', false); - this.get('controller').set('queryResult', this.get('controller.model').get("jobData")[this.get('controller.model').get('currentPage')-1] ); + this.get('controller.model').set('hasNext', this.get('controller.model').get('jobData')[this.get('controller.model').get('currentPage')-1].hasNext); + this.get('controller.model').set('hasPrevious', (this.get('controller.model').get('currentPage') > 1) ? true : false ); this.get('controller.model').set('queryResult', this.get('controller.model').get("jobData")[this.get('controller.model').get('currentPage')-1] ); } + + let existingWorksheets = this.get('store').peekAll('worksheet'); + let myWs = null; + if(existingWorksheets.get('length') > 0) { + myWs = existingWorksheets.filterBy('title', payloadTitle).get('firstObject'); + } + + this.transitionTo('queries.query.loading'); + + Ember.run.later(() => { + this.transitionTo('queries.query.results', myWs); + }, 1 * 1000); }, - goPrevPage(){ + goPrevPage(payloadTitle){ let currentPage = this.get('controller.model').get('currentPage'); let previousPage = this.get('controller.model').get('previousPage'); let nextPage = this.get('controller.model').get('nextPage'); @@ -382,64 +393,25 @@ export default Ember.Route.extend({ this.get('controller.model').set('currentPage', currentPage-1 ); this.get('controller.model').set('previousPage', previousPage - 1 ); this.get('controller.model').set('nextPage', nextPage-1); - this.get('controller').set('queryResult', this.get('controller.model').get("jobData")[this.get('controller.model').get('currentPage') -1 ]); this.get('controller.model').set('queryResult', this.get('controller.model').get("jobData")[this.get('controller.model').get('currentPage') -1 ]); - } else { - this.get('controller.model').set('hidePreviousButton', true); + this.get('controller.model').set('hasNext', true); + this.get('controller.model').set('hasPrevious', (this.get('controller.model').get('currentPage') > 1) ? true : false ); } - }, - - expandQueryEdidorPanel(){ - if(!this.get('isQueryEdidorPaneExpanded')){ - this.set('isQueryEdidorPaneExpanded', true); - } else { - this.set('isQueryEdidorPaneExpanded', false); + let existingWorksheets = this.get('store').peekAll('worksheet'); + let myWs = null; + if(existingWorksheets.get('length') > 0) { + myWs = existingWorksheets.filterBy('title', payloadTitle).get('firstObject'); } - Ember.$('.query-editor-panel').toggleClass('query-editor-full-width'); - Ember.$('.database-panel').toggleClass("hide"); - - }, - - expandQueryResultPanel(){ - - if(!this.get('isQueryResultPanelExpanded')){ - - if(!this.get('isQueryEdidorPaneExpanded')){ - Ember.$('.query-editor-container').addClass("hide"); - Ember.$('.database-panel').addClass("hide"); - Ember.$('.query-editor-panel').addClass('query-editor-full-width'); - } else { - - Ember.$('.query-editor-container').addClass("hide"); - } - this.set('isQueryResultPanelExpanded', true); - - } else { - if(!this.get('isQueryEdidorPaneExpanded')){ - Ember.$('.query-editor-container').removeClass("hide"); - Ember.$('.database-panel').removeClass("hide"); - Ember.$('.query-editor-panel').removeClass('query-editor-full-width'); - } else { + this.transitionTo('queries.query.loading'); - Ember.$('.query-editor-container').removeClass("hide"); + Ember.run.later(() => { + this.transitionTo('queries.query.results', myWs); + }, 1 * 1000); - } - this.set('isQueryResultPanelExpanded', false); - - } - - }, - adjustPanelSize(){ - let isFullHeight = ($(window).height() ==(parseInt(Ember.$('.ember-light-table').css('height'), 10)) ) || false; - if(!isFullHeight){ - Ember.$('.ember-light-table').css('height', '100vh'); - }else { - Ember.$('.ember-light-table').css('height', '70vh'); - } }, openWorksheetModal(){ @@ -463,22 +435,27 @@ export default Ember.Route.extend({ "queryFile" : queryFile, "logFile" : logFile}; - this.get('savedQueries').saveQuery(payload) - .then((data) => { - console.log('Created saved query.', data); - this.get('controller.model').set('title', newTitle); - this.get('controller').set('worksheetModalSuccess', true); + let newSaveQuery = this.get('store').createRecord('saved-query', + { dataBase:selectedDb, + title:newTitle, + queryFile: queryFile, + owner: owner, + shortQuery: (currentQuery.length > 0) ? currentQuery : ";" + }); - Ember.run.later(() => { - this.get('controller').set('showWorksheetModal', false); - }, 2 * 1000); - }, (error) => { - console.log("Error encountered", error); - Ember.run.later(() => { - this.get('controller').set('worksheetModalFail', true); - }, 2 * 1000); - }); + newSaveQuery.save().then((data) => { + console.log('saved query saved'); + + this.get('controller.model').set('title', newTitle); + this.get('controller').set('worksheetModalSuccess', true); + + Ember.run.later(() => { + this.get('controller').set('showWorksheetModal', false); + }, 2 * 1000); + + }); + }, closeWorksheetModal(){ @@ -524,29 +501,54 @@ export default Ember.Route.extend({ }, - showQueryEditorLog(){ - this.get('controller').set('showQueryEditorLog', true); - this.get('controller').set('showQueryEditorResult', false); + expandQueryEdidorPanel(){ + if(!this.get('isQueryEdidorPaneExpanded')){ + this.set('isQueryEdidorPaneExpanded', true); + } else { + this.set('isQueryEdidorPaneExpanded', false); + } + Ember.$('.query-editor-panel').toggleClass('query-editor-full-width'); + Ember.$('.database-panel').toggleClass("hide"); + }, + + expandQueryResultPanel(){ + if(!this.get('isQueryResultPanelExpanded')){ + if(!this.get('isQueryEdidorPaneExpanded')){ + Ember.$('.query-editor-container').addClass("hide"); + Ember.$('.database-panel').addClass("hide"); + Ember.$('.query-editor-panel').addClass('query-editor-full-width'); + } else { - $('.log-list-anchor').addClass('active'); - $('.log-list').addClass('active'); - $('.editor-result-list-anchor').removeClass('active'); - $('.editor-result-list').removeClass('active'); + Ember.$('.query-editor-container').addClass("hide"); + } + this.set('isQueryResultPanelExpanded', true); + } else { + if(!this.get('isQueryEdidorPaneExpanded')){ + Ember.$('.query-editor-container').removeClass("hide"); + Ember.$('.database-panel').removeClass("hide"); + Ember.$('.query-editor-panel').removeClass('query-editor-full-width'); + } else { + Ember.$('.query-editor-container').removeClass("hide"); + } + this.set('isQueryResultPanelExpanded', false); + } }, - showQueryEditorResult(){ - this.get('controller').set('showQueryEditorLog', false); - this.get('controller').set('showQueryEditorResult', true); + adjustPanelSize(){ + let isFullHeight = ($(window).height() ==(parseInt(Ember.$('.ember-light-table').css('height'), 10)) ) || false; + if(!isFullHeight){ + Ember.$('.ember-light-table').css('height', '100vh'); + }else { + Ember.$('.ember-light-table').css('height', '70vh'); + } + }, - $('.log-list-anchor').removeClass('active'); - $('.log-list').removeClass('active'); - $('.editor-result-list-anchor').addClass('active'); - $('.editor-result-list').addClass('active'); + createQuery(udfName, udfClassname, fileResourceName, fileResourcePath){ + let query = "add jar "+ fileResourcePath + ";\ncreate temporary function " + udfName + " as '"+ udfClassname+ "';"; + this.get('controller').set('currentQuery', query); + this.get('controller.model').set('query', query ); } - }, - showQueryResultContainer(){ - this.get('controller.model').set('isQueryResultContainer', true); } }); http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/loading.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/loading.js b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/loading.js new file mode 100644 index 0000000..b5070bc --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/loading.js @@ -0,0 +1,24 @@ +/** + * 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 + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Ember from 'ember'; + +export default Ember.Route.extend({ + beforeModel() { + } +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/log.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/log.js b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/log.js new file mode 100644 index 0000000..52f8dcc --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/log.js @@ -0,0 +1,104 @@ +/** + * 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 + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Ember from 'ember'; + +export default Ember.Route.extend({ + + jobs: Ember.inject.service(), + query: Ember.inject.service(), + + model(){ + return this.modelFor('queries.query'); + }, + + getLogsTillJobSuccess(jobId, model, controller){ + let self = this; + this.get('jobs').waitForJobStatus(jobId) + .then((status) => { + console.log('status', status); + if(status !== "succeeded"){ + + self.fetchLogs(model).then((logFileContent) => { + controller.set('logResults', logFileContent ); + }, (error) => { + console.log('error',error); + }); + + Ember.run.later(() => { + self.getLogsTillJobSuccess(jobId, model, controller); + }, 5 * 1000); + + } else { + + self.fetchLogs(model).then((logFileContent) => { + controller.set('logResults', logFileContent ); + }, (error) => { + console.log('error',error); + }); + + } + }, (error) => { + console.log('error',error); + }); + }, + + fetchLogs(model){ + let logFile = model.get('logFile'); + return new Promise( (resolve, reject) => { + this.get('query').retrieveQueryLog(logFile).then(function(data) { + resolve(data.file.fileContent); + }, function(error){ + reject(error); + }); + }); + }, + + jobStatus(jobId){ + return new Promise( (resolve, reject) => { + this.get('jobs').waitForJobStatus(jobId).then(function(status) { + resolve(status); + }, function(error){ + reject(error); + }); + }); + + }, + + setupController(controller, model){ + this._super(...arguments); + + model.set('lastResultRoute', ".log"); + + if(!Ember.isEmpty(model.get('currentJobData'))){ + let jobId = model.get('currentJobData').job.id; + this.controller.set('jobId', jobId); + this.controller.set('logResults', model.get('logResults')); + this.getLogsTillJobSuccess(jobId, model, controller); + this.controller.set('hasJobAssociated', true); + + } else { + this.controller.set('hasJobAssociated', false); + } + }, + + actions:{ + + } + +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/results.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/results.js b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/results.js new file mode 100644 index 0000000..4b59a13 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/results.js @@ -0,0 +1,59 @@ +/** + * 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 + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Ember from 'ember'; + +export default Ember.Route.extend({ + + jobs: Ember.inject.service(), + query: Ember.inject.service(), + + beforeModel() { + }, + + model(){ + return this.modelFor('queries.query'); + }, + + setupController(controller, model){ + this._super(...arguments); + + model.set('lastResultRoute', ".results"); + + if(!Ember.isEmpty(model.get('currentJobData'))){ + + let jobId = model.get('currentJobData').job.id; + this.controller.set('jobId', jobId); + this.controller.set('payloadTitle', model.get('currentJobData').job.title); + this.controller.set('isQueryRunning', model.get('isQueryRunning')); + this.controller.set('previousPage', model.get('previousPage')); + this.controller.set('hasNext', model.get('hasNext')); + this.controller.set('hasPrevious', model.get('hasPrevious')); + this.controller.set('queryResult', model.get('queryResult')); + this.controller.set('hasJobAssociated', true); + } else { + this.controller.set('hasJobAssociated', false); + } + + }, + + actions:{ + + } + +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/tez-ui.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/tez-ui.js b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/tez-ui.js new file mode 100644 index 0000000..daf142b --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/tez-ui.js @@ -0,0 +1,45 @@ +/** + * 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 + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Ember from 'ember'; + +export default Ember.Route.extend({ + + jobs: Ember.inject.service(), + query: Ember.inject.service(), + + beforeModel() { + }, + + model(){ + return this.modelFor('queries.query'); + }, + + setupController(controller, model){ + this._super(...arguments); + + model.set('lastResultRoute', ".tez-ui"); + + + }, + + actions:{ + + } + +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/visual-explain.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/visual-explain.js b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/visual-explain.js new file mode 100644 index 0000000..ff3832d --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/routes/queries/query/visual-explain.js @@ -0,0 +1,56 @@ +/** + * 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 + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Ember from 'ember'; + +export default Ember.Route.extend({ + + jobs: Ember.inject.service(), + query: Ember.inject.service(), + + beforeModel() { + }, + + model(){ + return this.modelFor('queries.query'); + }, + + setupController(controller, model){ + this._super(...arguments); + + model.set('lastResultRoute', ".visual-explain"); + + if(!Ember.isEmpty(model.get('currentJobData'))){ + + let jobId = model.get('currentJobData').job.id; + this.controller.set('jobId', jobId); + this.controller.set('payloadTitle', model.get('currentJobData').job.title); + this.controller.set('isQueryRunning', model.get('isQueryRunning')); + this.controller.set('visualExplainJson', model.get('visualExplainJson')); + + this.controller.set('hasJobAssociated', true); + } else { + this.controller.set('hasJobAssociated', false); + } + }, + + actions:{ + + } + +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/services/query.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/services/query.js b/contrib/views/hive20/src/main/resources/ui/app/services/query.js index 42d4fb0..3bf10c0 100644 --- a/contrib/views/hive20/src/main/resources/ui/app/services/query.js +++ b/contrib/views/hive20/src/main/resources/ui/app/services/query.js @@ -31,10 +31,10 @@ export default Ember.Service.extend({ }); }); }, - getJob(jobId, dateSubmitted, firstCall){ + getJob(jobId, firstCall){ let self = this; return new Promise( (resolve, reject) => { - this.get('store').adapterFor('query').getJob(jobId, dateSubmitted, firstCall).then(function(data) { + this.get('store').adapterFor('query').getJob(jobId, firstCall).then(function(data) { resolve(data); }, function(err) { reject(err); http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/templates/components/query-result-table.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/templates/components/query-result-table.hbs b/contrib/views/hive20/src/main/resources/ui/app/templates/components/query-result-table.hbs index 4d8524e..2590796 100644 --- a/contrib/views/hive20/src/main/resources/ui/app/templates/components/query-result-table.hbs +++ b/contrib/views/hive20/src/main/resources/ui/app/templates/components/query-result-table.hbs @@ -16,17 +16,6 @@ * limitations under the License. }} - - -{{#if isQueryRunning}} - <div style="position:relative"> - <div style="margin: auto;position: absolute;top: 0;left: 0;bottom: 0;right: 0;text-align: center"> - {{fa-icon "spinner fa-2" spin=true}} - </div> - </div> -{{/if}} - -{{#unless isQueryRunning}} <div class="clearfix" style="text-align: right; padding-right:5px"> <span class="dropdown"> <button class="btn btn-default dropdown-toggle" title="Actions" data-toggle="dropdown">{{fa-icon "bars"}} </button> @@ -36,9 +25,10 @@ </ul> </span> - <button class="btn btn-default" title="Previous Page" {{action "goPrevPage" }} >{{fa-icon "arrow-left"}} </button> - <button class="btn btn-default" title="Next Page" {{action "goNextPage" }}>{{fa-icon "arrow-right"}} </button> + <button class="btn btn-default" title="Previous Page" {{action "goPrevPage" payloadTitle }} disabled={{not hasPrevious}} >{{fa-icon "arrow-left"}} </button> + <button class="btn btn-default" title="Next Page" {{action "goNextPage" payloadTitle}} disabled={{not hasNext}} >{{fa-icon "arrow-right"}} </button> <button class="btn btn-default" title="Expand/Collspse" {{action "expandQueryResultPanel" }}>{{fa-icon "expand"}}</button> + </div> <div class="clearfix"> @@ -66,10 +56,6 @@ {{/light-table}} </div> - -{{/unless}} - - {{#if showSaveHdfsModal}} {{export-result confirmText="OK" http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/templates/components/visual-explain.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/templates/components/visual-explain.hbs b/contrib/views/hive20/src/main/resources/ui/app/templates/components/visual-explain.hbs index e0ceaa2..905e73c 100644 --- a/contrib/views/hive20/src/main/resources/ui/app/templates/components/visual-explain.hbs +++ b/contrib/views/hive20/src/main/resources/ui/app/templates/components/visual-explain.hbs @@ -29,7 +29,6 @@ </div> {{/if}} - {{#unless isQueryRunning}} <div id="explain-container" ></div> {{/unless}} http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query.hbs b/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query.hbs index 5b2b5c2..d62c781 100644 --- a/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query.hbs +++ b/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query.hbs @@ -43,69 +43,19 @@ </ul> </div> <button class="btn btn-default" {{action "visualExplainQuery" }}>{{fa-icon "link"}} Visual Explain</button> + {{#if worksheet.isQueryRunning}} {{fa-icon "spinner fa-1-5" spin=true}} {{/if}} + </div> </div> - {{#if worksheet.isQueryResultContainer}} - <div class="query-result-container"> - <div> - <ul class="row nav nav-tabs inverse"> - <li class="editor-result-list active"> - <a href="javascript:void(0)" class="editor-result-list-anchor active" {{action 'showQueryEditorResult' }}> - {{fa-icon "file-text-o"}} RESULT - </a> - </li> - <li class="log-list"> - <a href="javascript:void(0)" class="log-list-anchor" {{action 'showQueryEditorLog' }}> - {{fa-icon "list"}} LOG - </a> - </li> - </ul> - </div> + {{#tabs-pane tabs=tabs inverse=true as |tab|}} + {{tabs-item tab=tab tabs=tabs}} + {{/tabs-pane}} - {{#if showQueryEditorLog}} - <div class="clearfix row query-editor-log"> - {{query-result-log logResults=worksheet.logResults }} - </div> - {{/if}} - {{#if showQueryEditorResult}} - <div class="clearfix row query-editor-results"> - - {{#if isVisualExplainQuery}} - {{visual-explain - expandQueryResultPanel='expandQueryResultPanel' - isQueryRunning=worksheet.isQueryRunning - visualExplainJson=visualExplainJson - }} - {{else}} - {{query-result-table - queryResult=queryResult - jobId=currentJobId - updateQuery='updateQuery' - previousPage=worksheet.previousPage - hidePreviousButton=hidePreviousButton - goNextPage='goNextPage' - goPrevPage='goPrevPage' - expandQueryResultPanel='expandQueryResultPanel' - saveToHDFS='saveToHDFS' - downloadAsCsv='downloadAsCsv' - isExportResultSuccessMessege=isExportResultSuccessMessege - isExportResultFailureMessege=isExportResultFailureMessege - showSaveHdfsModal=showSaveHdfsModal - isQueryRunning=worksheet.isQueryRunning - }} - {{/if}} - - - - </div> - {{/if}} - - </div> - {{/if}} + {{outlet}} </div> </div> @@ -181,4 +131,4 @@ {{/modal-dialog}} {{/if}} -{{outlet}} + http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/loading.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/loading.hbs b/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/loading.hbs new file mode 100644 index 0000000..b1de181 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/loading.hbs @@ -0,0 +1,21 @@ +{{! +* 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 +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +}} + +<div class="alert alert-info text-center"> + <p class="lead">Data Loading... Please wait. {{fa-icon "refresh" spin=true}}</p> +</div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/log.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/log.hbs b/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/log.hbs new file mode 100644 index 0000000..db1cea2 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/log.hbs @@ -0,0 +1,29 @@ +{{! +* 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 +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +}} + +{{#unless hasJobAssociated}} + <div>No Log avaiable.</div> +{{/unless}} + +{{#if hasJobAssociated}} + <div> + <pre class="prettyprint">{{logResults}}</pre> + </div> + +{{/if}} + http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/results.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/results.hbs b/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/results.hbs new file mode 100644 index 0000000..370e3ef --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/results.hbs @@ -0,0 +1,49 @@ +{{! +* 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 +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +}} + +{{outlet}} + +{{#unless hasJobAssociated}} + <div>No Results avaiable.</div> +{{/unless}} + +{{#if hasJobAssociated}} + {{query-result-table + queryResult=queryResult + isQueryRunning=isQueryRunning + jobId=jobId + payloadTitle=payloadTitle + previousPage=previousPage + hasNext=hasNext + hasPrevious=hasPrevious + updateQuery='updateQuery' + goNextPage='goNextPage' + goPrevPage='goPrevPage' + saveToHDFS='saveToHDFS' + downloadAsCsv='downloadAsCsv' + expandQueryResultPanel='expandQueryResultPanel' + isExportResultSuccessMessege=false + isExportResultFailureMessege=false + showSaveHdfsModal=false + }} +{{/if}} + + + + + http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/tez-ui.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/tez-ui.hbs b/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/tez-ui.hbs new file mode 100644 index 0000000..9dfa3fa --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/tez-ui.hbs @@ -0,0 +1,19 @@ +{{! +* 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 +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +}} + +<div>I am in tez-ui route.</div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/visual-explain.hbs ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/visual-explain.hbs b/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/visual-explain.hbs new file mode 100644 index 0000000..ef441b5 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/templates/queries/query/visual-explain.hbs @@ -0,0 +1,33 @@ +{{! +* 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 +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +}} + +{{outlet}} + +{{#unless hasJobAssociated}} + <div>No Visual Explain avaiable.</div> +{{/unless}} + +{{#if hasJobAssociated}} + {{#if visualExplainJson}} + {{visual-explain + expandQueryResultPanel='expandQueryResultPanel' + visualExplainJson=visualExplainJson + isQueryRunning=isQueryRunning + }} + {{/if}} +{{/if}} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/316d33a9/contrib/views/hive20/src/main/resources/ui/config/environment.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/config/environment.js b/contrib/views/hive20/src/main/resources/ui/config/environment.js index 411ee99..c891508 100644 --- a/contrib/views/hive20/src/main/resources/ui/config/environment.js +++ b/contrib/views/hive20/src/main/resources/ui/config/environment.js @@ -34,7 +34,7 @@ module.exports = function(environment) { APP: { // Here you can pass flags/options to your application instance // when it is created - SHOULD_PERFORM_SERVICE_CHECK: true + SHOULD_PERFORM_SERVICE_CHECK: false } };
