"use strict"; /** * * @param input : 1,2,3,4 * @returns obj.query = (?,?,?,?) obj.params = [1,2,3,4] */ function prepareInClauseParams(input) { let inElems = input.split(","); let obj = {}; obj.whereQuery = ""; obj.whereParams = []; for (var j = 0; j < inElems.length; ++j) { if (j === 0) { //enclose with open parenthesis obj.whereQuery += "("; } if (j) { obj.whereQuery += ","; } // add q mark and push the variable obj.whereQuery += "?"; obj.whereParams.push(inElems[j]); if (j === inElems.length - 1) { //enclose with closing parenthesis obj.whereQuery += ")"; } } //console.log(obj); return obj; } function prepareLikeValue(value) { //return value.replace("~", "%"); return value.replace(/~/g, "%"); } function prepareIsValue(value) { //return value.replace("~", "%"); if (value === "null") { return null; } else if (value === "true") { return true; } else if (value === "false") { return false; } else { return null; } } function prepareBetweenValue(value) { let values = value.split(","); let obj = {}; obj.whereQuery = ""; obj.whereParams = []; if (values.length === 2) { obj.whereQuery = " ? and ? "; obj.whereParams.push(values[0]); obj.whereParams.push(values[1]); } //console.log('prepareBetweenValue', obj); return obj; } function replaceWhereParamsToQMarks( openParentheses, str, comparisonOperator, condType ) { let converted = ""; if (openParentheses) { for (var i = 0; i < str.length; ++i) { if (str[i] === "(") { converted += "("; } else { converted += "??"; break; } } } else { if ( comparisonOperator !== " in " && comparisonOperator !== " between " && condType !== " on " ) { converted = "?"; } else if (condType === " on ") { converted = "??"; } for (var i = str.length - 1; i >= 0; --i) { if (str[i] === ")") { converted += ")"; } else { break; } } } return converted; } function getComparisonOperator(operator) { switch (operator) { case "eq": return "="; break; case "ne": return "!="; break; case "lt": return "<"; break; case "lte": return "<="; break; case "gt": return ">"; break; case "gte": return ">="; break; case "is": return " is "; break; case "isnot": return " is not "; break; // case 'isnull': // return ' is NULL ' // break; // case 'isnnull': // return ' is not NULL ' // break; case "like": return " like "; break; case "nlike": return " not like "; break; case "in": return " in "; break; case "bw": return " between "; break; default: return null; break; } } function getLogicalOperator(operator) { switch (operator) { case "~or": return "or"; break; case "~and": return "and"; break; // case '~not': // return 'not' // break; case "~xor": return "xor"; break; default: return null; break; } } exports.getConditionClause = function(whereInQueryParams, condType = "where") { let whereQuery = ""; let whereParams = []; let grammarErr = 0; let numOfConditions = whereInQueryParams.split(/~or|~and|~not|~xor/); let logicalOperatorsInClause = whereInQueryParams.match( /(~or|~and|~not|~xor)/g ); if ( numOfConditions && logicalOperatorsInClause && numOfConditions.length !== logicalOperatorsInClause.length + 1 ) { console.log( "conditions and logical operators mismatch", numOfConditions.length, logicalOperatorsInClause.length ); } else { //console.log('numOfConditions',numOfConditions,whereInQueryParams); //console.log('logicalOperatorsInClause',logicalOperatorsInClause); for (var i = 0; i < numOfConditions.length; ++i) { let variable = ""; let comparisonOperator = ""; let logicalOperator = ""; let variableValue = ""; let temp = ""; // split on commas var arr = numOfConditions[i].split(","); // consider first two splits only var result = arr.splice(0, 2); // join to make only 3 array elements result.push(arr.join(",")); // variable, operator, variablevalue if (result.length !== 3) { grammarErr = 1; break; } /**************** START : variable ****************/ //console.log('variable, operator, variablevalue',result); variable = result[0].match(/\(+(.*)/); //console.log('variable',variable); if (!variable || variable.length !== 2) { grammarErr = 1; break; } // get the variableName and push whereParams.push(variable[1]); // then replace the variable name with ?? temp = replaceWhereParamsToQMarks(true, result[0], " ignore ", condType); if (!temp) { grammarErr = 1; break; } whereQuery += temp; /**************** END : variable ****************/ /**************** START : operator and value ****************/ comparisonOperator = getComparisonOperator(result[1]); if (!comparisonOperator) { grammarErr = 1; break; } whereQuery += comparisonOperator; // get the variableValue and push to params variableValue = result[2].match(/(.*?)\)/); if (!variableValue || variableValue.length !== 2) { grammarErr = 1; break; } if (comparisonOperator === " in ") { let obj = prepareInClauseParams(variableValue[1]); whereQuery += obj.whereQuery; whereParams = whereParams.concat(obj.whereParams); } else if ( comparisonOperator === " like " || comparisonOperator === " not like " ) { whereParams.push(prepareLikeValue(variableValue[1])); } else if (comparisonOperator === " is ") { whereParams.push(prepareIsValue(variableValue[1])); } else if (comparisonOperator === " between ") { let obj = prepareBetweenValue(variableValue[1]); whereQuery += obj.whereQuery; whereParams = whereParams.concat(obj.whereParams); //console.log(whereQuery, whereParams); } else { whereParams.push(variableValue[1]); } // then replace the variableValue with ? temp = replaceWhereParamsToQMarks( false, result[2], comparisonOperator, condType ); if (!temp) { grammarErr = 1; break; } whereQuery += temp; if (numOfConditions.length !== -1 && i !== numOfConditions.length - 1) { //console.log('finding logical operator for',logicalOperatorsInClause[i]); logicalOperator = getLogicalOperator(logicalOperatorsInClause[i]); if (!logicalOperator) { grammarErr = 1; break; } whereQuery += getLogicalOperator(logicalOperatorsInClause[i]); } /**************** END : operator ****************/ } } let obj = {}; obj["query"] = ""; obj["params"] = []; obj["err"] = grammarErr; // console.log(whereInQueryParams); // console.log(whereQuery); // console.log(whereParams); // console.log(grammarErr); // console.log('= = = = = = = = ='); if (!grammarErr) { obj["query"] = whereQuery; obj["params"] = whereParams; } return obj; };