lib/QueryResultsSet.js
const Connect = require('./Connect.js')
const Normalize = require('./Normalize.js')
const Validations = require('./Validations.js')
const config = require('./Config');
const axios = require("axios");
module.exports = {
query_set:(options) => {
return new Promise(async (resolve,reject)=>{
try{
if(options.concurrent && options.concurrent === true){
return resolve(_concurrentQuery(options));
}
let keyAndQueryMaps = _parseQueries(options);
let keys = keyAndQueryMaps[0];
options.url = 'queryResults/?query=' + keyAndQueryMaps[1].join(";");
var response = await Connect.get(options);
if(options.debug == true){
return resolve(response);
}
let hash = {};
Normalize._printMetaCorrectly(options,response).map((arr, i) => {
if(hash[keys[i]]){
arr.map(arrResult => { hash[keys[i]].push(arrResult)})
}else{
hash[keys[i]] = arr;
}
});
return resolve(hash);
}catch(error){
if(options.debug == true || error.response === undefined){
return reject(error);
}
let finalError = Normalize._printMetaCorrectly(options,error.response.data);
return reject(finalError);
}
})
}
}
const _parseQueries = (options) => {
let validatedOptions = _validateQueries(options);
let queryArr = [];
let keyMap = [];
validatedOptions.queries.map((queryHash)=>{
keyMap.push(queryHash["key"]);
queryArr.push(queryHash["query"]);
});
return [keyMap,queryArr];
}
const _validateQueries = options => {
if(options.queries == undefined || (options.queries != undefined && options.queries.length <= 1)){
let example = "\n\nconst {Client, QueryResultsSet} = require('osvc_node');\nconst env = process.env;\n\nvar rn_client = Client({\n\tusername: env['OSC_ADMIN'],\n\tpassword: env['OSC_PASSWORD'],\n\tinterface: env['OSC_SITE'],\n});\n\n\033[32mvar multipleQueries = [\n\t{\n\t\tquery:\"DESCRIBE ANSWERS\",\n\t\tkey: \"answerSchema\"\n\t},\n\t{\n\t\tquery:\"SELECT * FROM ANSWERS LIMIT 1\",\n\t\tkey: \"answers\"\n\t},\n\t{\n\t\tquery:\"DESCRIBE SERVICECATEGORIES\",\n\t\tkey: \"categoriesSchema\"\n\t},\n];\033[0m\n\nvar options = {\n\tclient: rn_client,\n\t\033[32mqueries: multipleQueries\033[0m\n}\n\nQueryResultsSet.query_set(options).then(data=>{\n\tconsole.log(data.answerSchema);\n\tconsole.log(data.answers);\n\tconsole.log(data.categoriesSchema);\n\tconsole.log(data.categories);\n\tconsole.log(data.productsSchema);\n\tconsole.log(data.products);\n})";
return Validations.customError("QueryResultsSet must have a 'queries' property defined with a minimum of two queries in the options object",example);
}
return options;
}
const _concurrentQuery = (options) =>{
return new Promise( async (resolve,reject) =>{
try{
const keyAndQueryMaps = _parseQueries(options);
const keys = keyAndQueryMaps[0];
let concurrentQueries = keyAndQueryMaps[1].map(query => {
options.url = 'queryResults/?query=' + query;
let axiosConfig = config.optionsFinalize("get",options);
return axios(axiosConfig);
});
let results = await axios.all(concurrentQueries);
let finalResults = {};
for(var i = 0; i < results.length; i ++){
let returnedResults = options.debug === true ? results[i] : Normalize._printMetaCorrectly(options,results[i].data);
if(finalResults[keys[i]]){
returnedResults.map(res => { finalResults[keys[i]].push(res) });
}else{
finalResults[keys[i]] = returnedResults;
}
}
return resolve(finalResults);
}catch(err){
return reject(err);
}
})
}