多维表格
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

350 lines
7.5 KiB

"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;
};