mirror of https://github.com/nocodb/nocodb
Browse Source
first cut, not getting invoked yet with apis however unit tests are testing the logic of new file.pull/8/head
oof1lab
7 years ago
3 changed files with 517 additions and 1 deletions
@ -0,0 +1,228 @@
|
||||
'use strict'; |
||||
|
||||
function replaceWhereParamsToQMarks(openParentheses, str) { |
||||
|
||||
let converted = '' |
||||
|
||||
if (openParentheses) { |
||||
for (var i = 0; i < str.length; ++i) { |
||||
if (str[i] === '(') { |
||||
converted += '(' |
||||
} else { |
||||
converted += '??' |
||||
break; |
||||
} |
||||
} |
||||
} else { |
||||
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 'like': |
||||
return ' like ' |
||||
break; |
||||
|
||||
case 'nlike': |
||||
return ' not like ' |
||||
break; |
||||
|
||||
// case 'in':
|
||||
// return ' in '
|
||||
// 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.getWhereClause = function (whereInQueryParams, whereQuery, 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); |
||||
return |
||||
} |
||||
|
||||
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(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]) |
||||
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
|
||||
variableValue = result[2].match(/(.*?)\)/) |
||||
if (!variableValue || variableValue.length !== 2) { |
||||
grammarErr = 1; |
||||
break; |
||||
} |
||||
whereParams.push(variableValue[1]) |
||||
|
||||
// then replace the variableName with ?
|
||||
temp = replaceWhereParamsToQMarks(false, result[2]) |
||||
if (!temp) { |
||||
grammarErr = 1; |
||||
break; |
||||
} |
||||
whereQuery += temp |
||||
|
||||
// only
|
||||
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 |
||||
|
||||
|
||||
} |
Loading…
Reference in new issue