blob: 9e3cc45b8d3571127ef7e6fec4cf6bad80784c7f [file] [log] [blame]
/**
* 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 Promise from 'bluebird';
import BaseAdapter from './BaseAdapter';
import Config from 'config.json';
let baseUrl = Config.baseURL;
let urls = {
getDatabases: 'metastore/databases',
setDatabases: 'metastore/databases/current',
getCubes: 'metastore/cubes',
query: 'queryapi/queries', // POST on this to execute, GET to fetch all
getTables: 'metastore/nativetables',
getSavedQueries: 'queryapi/savedqueries',
parameters: 'queryapi/savedqueries/parameters',
saveQuery: 'queryapi/savedqueries', // POST to save, PUT to update, {id} for GET
runSavedQuery: 'queryapi/savedqueries'
};
let AdhocQueryAdapter = {
getDatabases (secretToken) {
let url = baseUrl + urls.getDatabases;
return BaseAdapter.get(url + '?sessionid=' + secretToken);
},
setDatabase (secretToken, database) {
let url = baseUrl + urls.setDatabases;
return BaseAdapter.put(url + '?sessionid=' + secretToken, database, {
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});
},
getCubes (secretToken) {
let url = baseUrl + urls.getCubes;
let postURL = "?";
if (Config.cubes_type) {
postURL += "type=" + Config.cubes_type + "&"
}
postURL += "sessionid=" + secretToken;
return BaseAdapter.get(url + postURL);
},
getCubeDetails (secretToken, cubeName) {
let url = baseUrl + urls.getCubes + '/' + cubeName;
return BaseAdapter.get(url + '?sessionid=' + secretToken);
},
executeQuery (secretToken, query, queryName) {
let url = baseUrl + urls.query;
let formData = new FormData();
formData.append('sessionid', secretToken);
formData.append('query', query);
formData.append('operation', 'EXECUTE');
formData.append('conf',
'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><conf></conf>');
if (queryName) formData.append('queryName', queryName);
return BaseAdapter.post(url, formData, {
headers: {
'Accept': 'application/json'
}
});
},
saveQuery (secretToken, user, query, options) {
let queryToBeSaved = {
savedQuery: {
name: options.name || '',
query: query,
description: options.description || '',
parameters: options.parameters || []
}
};
let url = baseUrl + urls.saveQuery + '?sessionid=' + secretToken;
return BaseAdapter.post(url, JSON.stringify(queryToBeSaved), {
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});
},
updateSavedQuery (secretToken, user, query, options, id) {
let url = baseUrl + urls.saveQuery + '/' + id;
let queryToBeSaved = {
savedQuery: {
owner: user,
name: options.name || '',
query: query,
description: options.description || '',
parameters: options.parameters || []
}
};
return BaseAdapter.put(url, JSON.stringify(queryToBeSaved), {
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});
},
getQuery (secretToken, handle) {
let url = baseUrl + urls.query + '/' + handle;
return BaseAdapter.get(url + '?sessionid=' + secretToken);
},
getQueries (secretToken, email, options) {
let queryOptions = {};
queryOptions.sessionid = secretToken;
queryOptions.user = email;
var state;
if (options && options.state) {
state = options.state.toUpperCase();
}
let handlesUrl = baseUrl + urls.query + '?sessionid=' + secretToken + '&user=' +
email;
if (state) handlesUrl += '&state=' + state;
return BaseAdapter.get(handlesUrl)
.then(function (queryHandles) {
// FIXME limiting to 10 for now
// let handles = queryHandles.slice(0, 10);
return Promise.all(queryHandles.map((q) => {
let queryUrl = baseUrl + urls.query + '/' + q.queryHandle.handleId +
'?sessionid=' + secretToken + '&queryHandle=' + q.queryHandle.handleId;
return BaseAdapter.get(queryUrl);
}));
});
},
getQueryHandles (secretToken, email, options) {
let queryOptions = {};
queryOptions.sessionid = secretToken;
queryOptions.user = email;
var state;
if (options && options.state) {
state = options.state.toUpperCase();
}
let handlesUrl = baseUrl + urls.query + '?sessionid=' + secretToken + '&user=' +
email;
if (state) handlesUrl += '&state=' + state;
if (options.fromDate) handlesUrl += "&fromDate="+options.fromDate;
if (options.toDate) handlesUrl += "&toDate="+options.toDate;
return BaseAdapter.get(handlesUrl);
},
getQueriesDetails (secretToken, handles) {
let url = baseUrl + urls.query + '?sessionid=' + secretToken;
return Promise.all(handles.map((handle) => {
let queryUrl = baseUrl + urls.query + '/' + handle +
'?sessionid=' + secretToken + '&queryHandle=' + handle;
return BaseAdapter.get(queryUrl);
}));
},
getQueryResult (secretToken, handle, queryMode) {
// on page refresh, the store won't have queryMode so fetch query
// this is needed as we won't know in which mode the query was fired
if (!queryMode) {
this.getQuery(secretToken, handle).then((query) => {
queryMode = query.isPersistent;
queryMode = queryMode ? 'PERSISTENT' : 'INMEMORY';
return this._inMemoryOrPersistent(secretToken, handle, queryMode);
});
} else {
return this._inMemoryOrPersistent(secretToken, handle, queryMode);
}
},
_inMemoryOrPersistent (secretToken, handle, queryMode) {
return queryMode === 'PERSISTENT' ?
this.getDownloadURL(secretToken, handle) :
this.getInMemoryResults(secretToken, handle);
},
getTables (secretToken, database) {
let url = baseUrl + urls.getTables;
return BaseAdapter.get(url + '?sessionid=' + secretToken + '&dbName=' + database);
},
getTableDetails (secretToken, tableName, database) {
let url = baseUrl + urls.getTables + '/' + database + '.' + tableName;
return BaseAdapter.get(url + '?sessionid=' + secretToken);
},
cancelQuery (secretToken, handle) {
let url = baseUrl + urls.query + '/' + handle + '?sessionid=' + secretToken;
return BaseAdapter.delete(url);
},
getDownloadURL (secretToken, handle) {
let downloadURL = baseUrl + urls.query + '/' + handle +
'/httpresultset?sessionid=' + secretToken;
return Promise.resolve(downloadURL);
},
getSavedQueryById (secretToken, id) {
let url = baseUrl + urls.saveQuery + '/' + id;
return BaseAdapter.get(url + '?sessionid=' + secretToken);
},
getInMemoryResults (secretToken, handle) {
let resultUrl = baseUrl + urls.query + '/' + handle + '/resultset';
let results = BaseAdapter.get(resultUrl + '?sessionid=' + secretToken);
let metaUrl = baseUrl + urls.query + '/' + handle + '/resultsetmetadata';
let meta = BaseAdapter.get(metaUrl + '?sessionid=' + secretToken);
return Promise.all([results, meta]);
},
getSavedQueries (secretToken, user, options = {}) {
let url = baseUrl + urls.getSavedQueries;
return BaseAdapter.get(
url + '?user=' + user + '&sessionid=' + secretToken + '&start=' +
(options.offset || 0) + '&count=' + (options.pageSize || 10)
);
},
getParams (secretToken, query) {
let url = baseUrl + urls.parameters + '?sessionid=' + secretToken;
let formData = new FormData();
formData.append('query', query);
return BaseAdapter.post(url, formData);
},
runSavedQuery (secretToken, id, params) {
let queryParamString = BaseAdapter.jsonToQueryParams(params);
let url = baseUrl + urls.runSavedQuery + '/' + id + queryParamString;
let formData = new FormData();
formData.append('sessionid', secretToken);
formData.append('conf',
'<?xml version="1.0" encoding="UTF-8" standalone="yes"?><conf></conf>');
return BaseAdapter.post(url, formData);
}
};
export default AdhocQueryAdapter;