More conditions and logic Operators, Also Brackets.

This commit is contained in:
IgnatzHome 2018-05-20 11:15:57 +02:00
parent c3044a6b8b
commit 1c0c5bde0f

View file

@ -158,15 +158,61 @@ class AdvancedFilter {
console.log('Parts: ', JSON.stringify(commands));
try {
//let changed = false;
this._processConditions(commands);
console.log('Conditions: ', JSON.stringify(commands));
this._processLogicalOperators(commands);
console.log('Operator: ', JSON.stringify(commands));
this._processSubCommands(commands);
}
catch (e){return { $in: [] };}
return {$or: commands};
}
_processSubCommands(commands)
{
console.log('SubCommands: ', JSON.stringify(commands));
const subcommands = [];
let level = 0;
let start = -1;
for (let i = 0; i < commands.length; i++)
{
if (!commands[i].string && commands[i].cmd)
{
switch (commands[i].cmd)
{
case '(':
{
level++;
if (start === -1) start = i;
continue;
}
case ')':
{
level--;
commands.splice(i, 1);
i--;
continue;
}
default:
{
if (level > 0)
{
subcommands.push(commands[i]);
commands.splice(i, 1);
i--;
continue;
}
}
}
}
}
if (start !== -1)
{
this._processSubCommands(subcommands);
commands.splice(start, 0, subcommands);
}
this._processConditions(commands);
console.log('Conditions: ', JSON.stringify(commands));
this._processLogicalOperators(commands);
console.log('Operator: ', JSON.stringify(commands));
}
_processConditions(commands)
{
for (let i = 0; i < commands.length; i++)
@ -188,6 +234,76 @@ class AdvancedFilter {
i--;
break;
}
case '!=':
case '!==':
{
const field = commands[i-1].cmd;
const str = commands[i+1].cmd;
commands[i] = {$not: {'customFields._id':this._fieldNameToId(field), 'customFields.value':str}};
commands.splice(i-1, 1);
commands.splice(i, 1);
//changed = true;
i--;
break;
}
case '>':
case 'gt':
case 'Gt':
case 'GT':
{
const field = commands[i-1].cmd;
const str = commands[i+1].cmd;
commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value': { $gt: str } };
commands.splice(i-1, 1);
commands.splice(i, 1);
//changed = true;
i--;
break;
}
case '>=':
case '>==':
case 'gte':
case 'Gte':
case 'GTE':
{
const field = commands[i-1].cmd;
const str = commands[i+1].cmd;
commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value': { $gte: str } };
commands.splice(i-1, 1);
commands.splice(i, 1);
//changed = true;
i--;
break;
}
case '<':
case 'lt':
case 'Lt':
case 'LT':
{
const field = commands[i-1].cmd;
const str = commands[i+1].cmd;
commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value': { $lt: str } };
commands.splice(i-1, 1);
commands.splice(i, 1);
//changed = true;
i--;
break;
}
case '<=':
case '<==':
case 'lte':
case 'Lte':
case 'LTE':
{
const field = commands[i-1].cmd;
const str = commands[i+1].cmd;
commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value': { $lte: str } };
commands.splice(i-1, 1);
commands.splice(i, 1);
//changed = true;
i--;
break;
}
}
}
@ -217,6 +333,34 @@ class AdvancedFilter {
i--;
break;
}
case 'and':
case 'And':
case 'AND':
case '&':
case '&&':
{
const op1 = commands[i-1];
const op2 = commands[i+1];
commands[i] = {$and: [op1, op2]};
commands.splice(i-1, 1);
commands.splice(i, 1);
//changed = true;
i--;
break;
}
case 'not':
case 'Not':
case 'NOT':
case '!':
{
const op1 = commands[i+1];
commands[i] = {$not: op1};
commands.splice(i+1, 1);
//changed = true;
i--;
break;
}
}
}