lib/queries.api.28.io.js
/*jshint -W069 */
/**
* <p>These resources can be used to manage and execute queries. The endpoint of these resources is based on your project name. For instance, if your 28.io project is named <code>myproject</code>, your endpoint for this API will be: <code>http://myproject.28.io/v1/_queries</code>.</p>
* @class Queries
* @param {(string|object)} [domainOrOptions] - The project domain or options object. If object, see the object's optional properties.
* @param {string} [domainOrOptions.domain] - The project domain
* @param {object} [domainOrOptions.token] - auth token - object with value property and optional headerOrQueryName and isQuery properties
*/
var Queries = (function() {
'use strict';
var request = require('request');
var Q = require('q');
function Queries(options) {
var domain = (typeof options === 'object') ? options.domain : options;
this.domain = domain ? domain : 'http://portal.28.io/v1';
if (this.domain.length === 0) {
throw new Error('Domain parameter must be specified as a string.');
}
}
/**
* Lists public and/or private queries
* @method
* @name Queries#listQueries
* @param {string} visibility - The query visibility.
* @param {string} token - A project token.
*
*/
Queries.prototype.listQueries = function(parameters) {
if (parameters === undefined) {
parameters = {};
}
var deferred = Q.defer();
var domain = this.domain;
var path = '/_queries/{visibility}';
var body;
var queryParameters = {};
var headers = {};
var form = {};
path = path.replace('{visibility}', parameters['visibility']);
if (parameters['visibility'] === undefined) {
deferred.reject(new Error('Missing required path parameter: visibility'));
return deferred.promise;
}
if (parameters['token'] !== undefined) {
queryParameters['token'] = parameters['token'];
}
if (parameters['token'] === undefined) {
deferred.reject(new Error('Missing required query parameter: token'));
return deferred.promise;
}
if (parameters.$queryParameters) {
Object.keys(parameters.$queryParameters)
.forEach(function(parameterName) {
var parameter = parameters.$queryParameters[parameterName];
queryParameters[parameterName] = parameter;
});
}
var req = {
method: 'GET',
uri: domain + path,
qs: queryParameters,
headers: headers,
body: body
};
if (Object.keys(form).length > 0) {
req.form = form;
}
if (typeof(body) === 'object' && !body instanceof Buffer) {
req.json = true;
}
request(req, function(error, response, body) {
if (error) {
deferred.reject(error);
} else {
if (/^application\/(.*\\+)?json/.test(response.headers['content-type'])) {
try {
body = JSON.parse(body);
} catch (e) {
}
}
if (response.statusCode >= 200 && response.statusCode <= 299) {
deferred.resolve({
response: response,
body: body
});
} else {
deferred.reject({
response: response,
body: body
});
}
}
});
return deferred.promise;
};
/**
* Executes a non-side-effecting query
* @method
* @name Queries#executeSimpleQuery
* @param {string} Accept - Value of the Accept header.
* @param {string} queryPath - The query path. It starts with <code>public</code> or <code>private</code> and can contain slashes.
* @param {string} format - The serialization method to use for the results of the executed query. When choosing a serialization method, this parameter has a lower priority than the <code>Accept</code> header.
* @param {boolean} trace - Whether to enable the output of trace#2.
* @param {string} token - A project token.
*
*/
Queries.prototype.executeSimpleQuery = function(parameters) {
if (parameters === undefined) {
parameters = {};
}
var deferred = Q.defer();
var domain = this.domain;
var path = '/_queries/{query-path}{format}';
var body;
var queryParameters = {};
var headers = {};
var form = {};
if (parameters['Accept'] !== undefined) {
headers['Accept'] = parameters['Accept'];
}
path = path.replace('{query-path}', parameters['queryPath']);
if (parameters['queryPath'] === undefined) {
deferred.reject(new Error('Missing required path parameter: queryPath'));
return deferred.promise;
}
path = path.replace('{format}', parameters['format']);
if (parameters['trace'] !== undefined) {
queryParameters['trace'] = parameters['trace'];
}
if (parameters['token'] !== undefined) {
queryParameters['token'] = parameters['token'];
}
if (parameters.$queryParameters) {
Object.keys(parameters.$queryParameters)
.forEach(function(parameterName) {
var parameter = parameters.$queryParameters[parameterName];
queryParameters[parameterName] = parameter;
});
}
var req = {
method: 'GET',
uri: domain + path,
qs: queryParameters,
headers: headers,
body: body
};
if (Object.keys(form).length > 0) {
req.form = form;
}
if (typeof(body) === 'object' && !body instanceof Buffer) {
req.json = true;
}
request(req, function(error, response, body) {
if (error) {
deferred.reject(error);
} else {
if (/^application\/(.*\\+)?json/.test(response.headers['content-type'])) {
try {
body = JSON.parse(body);
} catch (e) {
}
}
if (response.statusCode >= 200 && response.statusCode <= 299) {
deferred.resolve({
response: response,
body: body
});
} else {
deferred.reject({
response: response,
body: body
});
}
}
});
return deferred.promise;
};
/**
* Executes a query
* @method
* @name Queries#executeQuery
* @param {string} Accept - Value of the Accept header.
* @param {string} queryPath - The query path. It starts with <code>public</code> or <code>private</code> and can contain slashes.
* @param {string} format - The serialization method to use for the results of the executed query. When choosing a serialization method, this parameter has a lower priority than the <code>Accept</code> header.
* @param {boolean} async - Whether to execute the query asynchronously or not.
* @param {string} outputCollection - The output collection when runnng the query asynchronously.
* @param {boolean} trace - Whether to enable the output trace#2.
* @param {string} token - A project token.
*
*/
Queries.prototype.executeQuery = function(parameters) {
if (parameters === undefined) {
parameters = {};
}
var deferred = Q.defer();
var domain = this.domain;
var path = '/_queries/{query-path}{format}';
var body;
var queryParameters = {};
var headers = {};
var form = {};
if (parameters['Accept'] !== undefined) {
headers['Accept'] = parameters['Accept'];
}
path = path.replace('{query-path}', parameters['queryPath']);
if (parameters['queryPath'] === undefined) {
deferred.reject(new Error('Missing required path parameter: queryPath'));
return deferred.promise;
}
path = path.replace('{format}', parameters['format']);
if (parameters['async'] !== undefined) {
queryParameters['async'] = parameters['async'];
}
if (parameters['outputCollection'] !== undefined) {
queryParameters['output-collection'] = parameters['outputCollection'];
}
if (parameters['trace'] !== undefined) {
queryParameters['trace'] = parameters['trace'];
}
if (parameters['token'] !== undefined) {
queryParameters['token'] = parameters['token'];
}
if (parameters.$queryParameters) {
Object.keys(parameters.$queryParameters)
.forEach(function(parameterName) {
var parameter = parameters.$queryParameters[parameterName];
queryParameters[parameterName] = parameter;
});
}
var req = {
method: 'POST',
uri: domain + path,
qs: queryParameters,
headers: headers,
body: body
};
if (Object.keys(form).length > 0) {
req.form = form;
}
if (typeof(body) === 'object' && !body instanceof Buffer) {
req.json = true;
}
request(req, function(error, response, body) {
if (error) {
deferred.reject(error);
} else {
if (/^application\/(.*\\+)?json/.test(response.headers['content-type'])) {
try {
body = JSON.parse(body);
} catch (e) {
}
}
if (response.statusCode >= 200 && response.statusCode <= 299) {
deferred.resolve({
response: response,
body: body
});
} else {
deferred.reject({
response: response,
body: body
});
}
}
});
return deferred.promise;
};
/**
* Retrieves a query source code
* @method
* @name Queries#getQuery
* @param {string} queryPath - The query path. It starts with "public" or "private" and contains slashes.
* @param {string} token - A project token.
*
*/
Queries.prototype.getQuery = function(parameters) {
if (parameters === undefined) {
parameters = {};
}
var deferred = Q.defer();
var domain = this.domain;
var path = '/_queries/{query-path}/metadata/source';
var body;
var queryParameters = {};
var headers = {};
var form = {};
path = path.replace('{query-path}', parameters['queryPath']);
if (parameters['queryPath'] === undefined) {
deferred.reject(new Error('Missing required path parameter: queryPath'));
return deferred.promise;
}
if (parameters['token'] !== undefined) {
queryParameters['token'] = parameters['token'];
}
if (parameters['token'] === undefined) {
deferred.reject(new Error('Missing required query parameter: token'));
return deferred.promise;
}
if (parameters.$queryParameters) {
Object.keys(parameters.$queryParameters)
.forEach(function(parameterName) {
var parameter = parameters.$queryParameters[parameterName];
queryParameters[parameterName] = parameter;
});
}
var req = {
method: 'GET',
uri: domain + path,
qs: queryParameters,
headers: headers,
body: body
};
if (Object.keys(form).length > 0) {
req.form = form;
}
if (typeof(body) === 'object' && !body instanceof Buffer) {
req.json = true;
}
request(req, function(error, response, body) {
if (error) {
deferred.reject(error);
} else {
if (/^application\/(.*\\+)?json/.test(response.headers['content-type'])) {
try {
body = JSON.parse(body);
} catch (e) {
}
}
if (response.statusCode >= 200 && response.statusCode <= 299) {
deferred.resolve({
response: response,
body: body
});
} else {
deferred.reject({
response: response,
body: body
});
}
}
});
return deferred.promise;
};
/**
* Creates a new query
* @method
* @name Queries#createQuery
* @param {string} queryPath - The query path. It starts with "public" or "private" and contains slashes.
* @param {string} token - A project token.
* @param {string} compile - The kind of compilation to perform. The default is none.
* @param {string} queryBody - The source code of the query
*
*/
Queries.prototype.createQuery = function(parameters) {
if (parameters === undefined) {
parameters = {};
}
var deferred = Q.defer();
var domain = this.domain;
var path = '/_queries/{query-path}/metadata/source';
var body;
var queryParameters = {};
var headers = {};
var form = {};
path = path.replace('{query-path}', parameters['queryPath']);
if (parameters['queryPath'] === undefined) {
deferred.reject(new Error('Missing required path parameter: queryPath'));
return deferred.promise;
}
if (parameters['token'] !== undefined) {
queryParameters['token'] = parameters['token'];
}
if (parameters['token'] === undefined) {
deferred.reject(new Error('Missing required query parameter: token'));
return deferred.promise;
}
if (parameters['compile'] !== undefined) {
queryParameters['compile'] = parameters['compile'];
}
if (parameters['queryBody'] !== undefined) {
body = parameters['queryBody'];
}
if (parameters['queryBody'] === undefined) {
deferred.reject(new Error('Missing required body parameter: queryBody'));
return deferred.promise;
}
headers['Content-Type'] = 'text/plain; charset=utf-8';
if (parameters.$queryParameters) {
Object.keys(parameters.$queryParameters)
.forEach(function(parameterName) {
var parameter = parameters.$queryParameters[parameterName];
queryParameters[parameterName] = parameter;
});
}
var req = {
method: 'POST',
uri: domain + path,
qs: queryParameters,
headers: headers,
body: body
};
if (Object.keys(form).length > 0) {
req.form = form;
}
if (typeof(body) === 'object' && !body instanceof Buffer) {
req.json = true;
}
request(req, function(error, response, body) {
if (error) {
deferred.reject(error);
} else {
if (/^application\/(.*\\+)?json/.test(response.headers['content-type'])) {
try {
body = JSON.parse(body);
} catch (e) {
}
}
if (response.statusCode >= 200 && response.statusCode <= 299) {
deferred.resolve({
response: response,
body: body
});
} else {
deferred.reject({
response: response,
body: body
});
}
}
});
return deferred.promise;
};
/**
* Creates or updates a query
* @method
* @name Queries#saveQuery
* @param {string} queryPath - The query path. It starts with "public" or "private" and contains slashes.
* @param {string} token - A project token.
* @param {string} compile - The kind of compilation to perform. The default is none.
* @param {string} queryBody - The query source code
*
*/
Queries.prototype.saveQuery = function(parameters) {
if (parameters === undefined) {
parameters = {};
}
var deferred = Q.defer();
var domain = this.domain;
var path = '/_queries/{query-path}/metadata/source';
var body;
var queryParameters = {};
var headers = {};
var form = {};
path = path.replace('{query-path}', parameters['queryPath']);
if (parameters['queryPath'] === undefined) {
deferred.reject(new Error('Missing required path parameter: queryPath'));
return deferred.promise;
}
if (parameters['token'] !== undefined) {
queryParameters['token'] = parameters['token'];
}
if (parameters['token'] === undefined) {
deferred.reject(new Error('Missing required query parameter: token'));
return deferred.promise;
}
if (parameters['compile'] !== undefined) {
queryParameters['compile'] = parameters['compile'];
}
if (parameters['queryBody'] !== undefined) {
body = parameters['queryBody'];
}
headers['Content-Type'] = 'text/plain; charset=utf-8';
if (parameters.$queryParameters) {
Object.keys(parameters.$queryParameters)
.forEach(function(parameterName) {
var parameter = parameters.$queryParameters[parameterName];
queryParameters[parameterName] = parameter;
});
}
var req = {
method: 'PUT',
uri: domain + path,
qs: queryParameters,
headers: headers,
body: body
};
if (Object.keys(form).length > 0) {
req.form = form;
}
if (typeof(body) === 'object' && !body instanceof Buffer) {
req.json = true;
}
request(req, function(error, response, body) {
if (error) {
deferred.reject(error);
} else {
if (/^application\/(.*\\+)?json/.test(response.headers['content-type'])) {
try {
body = JSON.parse(body);
} catch (e) {
}
}
if (response.statusCode >= 200 && response.statusCode <= 299) {
deferred.resolve({
response: response,
body: body
});
} else {
deferred.reject({
response: response,
body: body
});
}
}
});
return deferred.promise;
};
/**
* Removes a query
* @method
* @name Queries#removeQuery
* @param {string} queryPath - The query path. It starts with "public" or "private" and contains slashes.
* @param {string} token - A project token.
*
*/
Queries.prototype.removeQuery = function(parameters) {
if (parameters === undefined) {
parameters = {};
}
var deferred = Q.defer();
var domain = this.domain;
var path = '/_queries/{query-path}/metadata/source';
var body;
var queryParameters = {};
var headers = {};
var form = {};
path = path.replace('{query-path}', parameters['queryPath']);
if (parameters['queryPath'] === undefined) {
deferred.reject(new Error('Missing required path parameter: queryPath'));
return deferred.promise;
}
if (parameters['token'] !== undefined) {
queryParameters['token'] = parameters['token'];
}
if (parameters['token'] === undefined) {
deferred.reject(new Error('Missing required query parameter: token'));
return deferred.promise;
}
if (parameters.$queryParameters) {
Object.keys(parameters.$queryParameters)
.forEach(function(parameterName) {
var parameter = parameters.$queryParameters[parameterName];
queryParameters[parameterName] = parameter;
});
}
var req = {
method: 'DELETE',
uri: domain + path,
qs: queryParameters,
headers: headers,
body: body
};
if (Object.keys(form).length > 0) {
req.form = form;
}
if (typeof(body) === 'object' && !body instanceof Buffer) {
req.json = true;
}
request(req, function(error, response, body) {
if (error) {
deferred.reject(error);
} else {
if (/^application\/(.*\\+)?json/.test(response.headers['content-type'])) {
try {
body = JSON.parse(body);
} catch (e) {
}
}
if (response.statusCode >= 200 && response.statusCode <= 299) {
deferred.resolve({
response: response,
body: body
});
} else {
deferred.reject({
response: response,
body: body
});
}
}
});
return deferred.promise;
};
/**
* Retrieves a query execution plan
* @method
* @name Queries#getQueryPlan
* @param {string} queryPath - The query path. It starts with "public" or "private" and contains slashes.
* @param {string} token - A project token.
*
*/
Queries.prototype.getQueryPlan = function(parameters) {
if (parameters === undefined) {
parameters = {};
}
var deferred = Q.defer();
var domain = this.domain;
var path = '/_queries/{query-path}/metadata/plan';
var body;
var queryParameters = {};
var headers = {};
var form = {};
path = path.replace('{query-path}', parameters['queryPath']);
if (parameters['queryPath'] === undefined) {
deferred.reject(new Error('Missing required path parameter: queryPath'));
return deferred.promise;
}
if (parameters['token'] !== undefined) {
queryParameters['token'] = parameters['token'];
}
if (parameters['token'] === undefined) {
deferred.reject(new Error('Missing required query parameter: token'));
return deferred.promise;
}
if (parameters.$queryParameters) {
Object.keys(parameters.$queryParameters)
.forEach(function(parameterName) {
var parameter = parameters.$queryParameters[parameterName];
queryParameters[parameterName] = parameter;
});
}
var req = {
method: 'GET',
uri: domain + path,
qs: queryParameters,
headers: headers,
body: body
};
if (Object.keys(form).length > 0) {
req.form = form;
}
if (typeof(body) === 'object' && !body instanceof Buffer) {
req.json = true;
}
request(req, function(error, response, body) {
if (error) {
deferred.reject(error);
} else {
if (/^application\/(.*\\+)?json/.test(response.headers['content-type'])) {
try {
body = JSON.parse(body);
} catch (e) {
}
}
if (response.statusCode >= 200 && response.statusCode <= 299) {
deferred.resolve({
response: response,
body: body
});
} else {
deferred.reject({
response: response,
body: body
});
}
}
});
return deferred.promise;
};
/**
* Precompiles a query
* @method
* @name Queries#compileQuery
* @param {string} queryPath - The query path. It starts with "public" or "private" and contains slashes.
* @param {string} token - A project token.
*
*/
Queries.prototype.compileQuery = function(parameters) {
if (parameters === undefined) {
parameters = {};
}
var deferred = Q.defer();
var domain = this.domain;
var path = '/_queries/{query-path}/metadata/plan';
var body;
var queryParameters = {};
var headers = {};
var form = {};
path = path.replace('{query-path}', parameters['queryPath']);
if (parameters['queryPath'] === undefined) {
deferred.reject(new Error('Missing required path parameter: queryPath'));
return deferred.promise;
}
if (parameters['token'] !== undefined) {
queryParameters['token'] = parameters['token'];
}
if (parameters['token'] === undefined) {
deferred.reject(new Error('Missing required query parameter: token'));
return deferred.promise;
}
if (parameters.$queryParameters) {
Object.keys(parameters.$queryParameters)
.forEach(function(parameterName) {
var parameter = parameters.$queryParameters[parameterName];
queryParameters[parameterName] = parameter;
});
}
var req = {
method: 'PUT',
uri: domain + path,
qs: queryParameters,
headers: headers,
body: body
};
if (Object.keys(form).length > 0) {
req.form = form;
}
if (typeof(body) === 'object' && !body instanceof Buffer) {
req.json = true;
}
request(req, function(error, response, body) {
if (error) {
deferred.reject(error);
} else {
if (/^application\/(.*\\+)?json/.test(response.headers['content-type'])) {
try {
body = JSON.parse(body);
} catch (e) {
}
}
if (response.statusCode >= 200 && response.statusCode <= 299) {
deferred.resolve({
response: response,
body: body
});
} else {
deferred.reject({
response: response,
body: body
});
}
}
});
return deferred.promise;
};
return Queries;
})();
exports.Queries = Queries;