|  | @@ -187,27 +187,27 @@ class AdvancedFilter {
 | 
	
		
			
				|  |  |        if (commands[i].cmd) {
 | 
	
		
			
				|  |  |          switch (commands[i].cmd) {
 | 
	
		
			
				|  |  |          case '(':
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -          level++;
 | 
	
		
			
				|  |  | -          if (start === -1) start = i;
 | 
	
		
			
				|  |  | -          continue;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            level++;
 | 
	
		
			
				|  |  | +            if (start === -1) start = i;
 | 
	
		
			
				|  |  | +            continue;
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  |          case ')':
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -          level--;
 | 
	
		
			
				|  |  | -          commands.splice(i, 1);
 | 
	
		
			
				|  |  | -          i--;
 | 
	
		
			
				|  |  | -          continue;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        default:
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -          if (level > 0) {
 | 
	
		
			
				|  |  | -            subcommands.push(commands[i]);
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            level--;
 | 
	
		
			
				|  |  |              commands.splice(i, 1);
 | 
	
		
			
				|  |  |              i--;
 | 
	
		
			
				|  |  |              continue;
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        default:
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            if (level > 0) {
 | 
	
		
			
				|  |  | +              subcommands.push(commands[i]);
 | 
	
		
			
				|  |  | +              commands.splice(i, 1);
 | 
	
		
			
				|  |  | +              i--;
 | 
	
		
			
				|  |  | +              continue;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -229,113 +229,112 @@ class AdvancedFilter {
 | 
	
		
			
				|  |  |          case '=':
 | 
	
		
			
				|  |  |          case '==':
 | 
	
		
			
				|  |  |          case '===':
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -          const field = commands[i - 1].cmd;
 | 
	
		
			
				|  |  | -          const str = commands[i + 1].cmd;
 | 
	
		
			
				|  |  | -          if (commands[i + 1].regex)
 | 
	
		
			
				|  |  |            {
 | 
	
		
			
				|  |  | -            const match = str.match(new RegExp('^/(.*?)/([gimy]*)$'));
 | 
	
		
			
				|  |  | -            let regex = null;
 | 
	
		
			
				|  |  | -            if (match.length > 2)
 | 
	
		
			
				|  |  | -              regex = new RegExp(match[1], match[2]);
 | 
	
		
			
				|  |  | +            const field = commands[i - 1].cmd;
 | 
	
		
			
				|  |  | +            const str = commands[i + 1].cmd;
 | 
	
		
			
				|  |  | +            if (commands[i + 1].regex)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +              const match = str.match(new RegExp('^/(.*?)/([gimy]*)$'));
 | 
	
		
			
				|  |  | +              let regex = null;
 | 
	
		
			
				|  |  | +              if (match.length > 2)
 | 
	
		
			
				|  |  | +                regex = new RegExp(match[1], match[2]);
 | 
	
		
			
				|  |  | +              else
 | 
	
		
			
				|  |  | +                regex = new RegExp(match[1]);
 | 
	
		
			
				|  |  | +              commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': regex };
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |              else
 | 
	
		
			
				|  |  | -              regex = new RegExp(match[1]);
 | 
	
		
			
				|  |  | -            commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': regex };
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -          else
 | 
	
		
			
				|  |  | -          {
 | 
	
		
			
				|  |  | -            commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': {$in: [this._fieldValueToId(field, str), parseInt(str, 10)]} };
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +              commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': {$in: [this._fieldValueToId(field, str), parseInt(str, 10)]} };
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            commands.splice(i - 1, 1);
 | 
	
		
			
				|  |  | +            commands.splice(i, 1);
 | 
	
		
			
				|  |  | +            //changed = true;
 | 
	
		
			
				|  |  | +            i--;
 | 
	
		
			
				|  |  | +            break;
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  | -          commands.splice(i - 1, 1);
 | 
	
		
			
				|  |  | -          commands.splice(i, 1);
 | 
	
		
			
				|  |  | -          //changed = true;
 | 
	
		
			
				|  |  | -          i--;
 | 
	
		
			
				|  |  | -          break;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  |          case '!=':
 | 
	
		
			
				|  |  |          case '!==':
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -          const field = commands[i - 1].cmd;
 | 
	
		
			
				|  |  | -          const str = commands[i + 1].cmd;
 | 
	
		
			
				|  |  | -          if (commands[i + 1].regex)
 | 
	
		
			
				|  |  |            {
 | 
	
		
			
				|  |  | -            const match = str.match(new RegExp('^/(.*?)/([gimy]*)$'));
 | 
	
		
			
				|  |  | -            let regex = null;
 | 
	
		
			
				|  |  | -            if (match.length > 2)
 | 
	
		
			
				|  |  | -              regex = new RegExp(match[1], match[2]);
 | 
	
		
			
				|  |  | +            const field = commands[i - 1].cmd;
 | 
	
		
			
				|  |  | +            const str = commands[i + 1].cmd;
 | 
	
		
			
				|  |  | +            if (commands[i + 1].regex)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +              const match = str.match(new RegExp('^/(.*?)/([gimy]*)$'));
 | 
	
		
			
				|  |  | +              let regex = null;
 | 
	
		
			
				|  |  | +              if (match.length > 2)
 | 
	
		
			
				|  |  | +                regex = new RegExp(match[1], match[2]);
 | 
	
		
			
				|  |  | +              else
 | 
	
		
			
				|  |  | +                regex = new RegExp(match[1]);
 | 
	
		
			
				|  |  | +              commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $not: regex } };
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |              else
 | 
	
		
			
				|  |  | -              regex = new RegExp(match[1]);
 | 
	
		
			
				|  |  | -            commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $not: regex } };
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -          else
 | 
	
		
			
				|  |  | -          {
 | 
	
		
			
				|  |  | -            commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $not: {$in: [this._fieldValueToId(field, str), parseInt(str, 10)]} } };
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +              commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $not: {$in: [this._fieldValueToId(field, str), parseInt(str, 10)]} } };
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            commands.splice(i - 1, 1);
 | 
	
		
			
				|  |  | +            commands.splice(i, 1);
 | 
	
		
			
				|  |  | +            //changed = true;
 | 
	
		
			
				|  |  | +            i--;
 | 
	
		
			
				|  |  | +            break;
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  | -          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: parseInt(str, 10) } };
 | 
	
		
			
				|  |  | -          commands.splice(i - 1, 1);
 | 
	
		
			
				|  |  | -          commands.splice(i, 1);
 | 
	
		
			
				|  |  | -          //changed = true;
 | 
	
		
			
				|  |  | -          i--;
 | 
	
		
			
				|  |  | -          break;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            const field = commands[i - 1].cmd;
 | 
	
		
			
				|  |  | +            const str = commands[i + 1].cmd;
 | 
	
		
			
				|  |  | +            commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $gt: parseInt(str, 10) } };
 | 
	
		
			
				|  |  | +            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:  parseInt(str, 10) } };
 | 
	
		
			
				|  |  | -          commands.splice(i - 1, 1);
 | 
	
		
			
				|  |  | -          commands.splice(i, 1);
 | 
	
		
			
				|  |  | -          //changed = true;
 | 
	
		
			
				|  |  | -          i--;
 | 
	
		
			
				|  |  | -          break;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            const field = commands[i - 1].cmd;
 | 
	
		
			
				|  |  | +            const str = commands[i + 1].cmd;
 | 
	
		
			
				|  |  | +            commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $gte:  parseInt(str, 10) } };
 | 
	
		
			
				|  |  | +            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:  parseInt(str, 10) } };
 | 
	
		
			
				|  |  | -          commands.splice(i - 1, 1);
 | 
	
		
			
				|  |  | -          commands.splice(i, 1);
 | 
	
		
			
				|  |  | -          //changed = true;
 | 
	
		
			
				|  |  | -          i--;
 | 
	
		
			
				|  |  | -          break;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            const field = commands[i - 1].cmd;
 | 
	
		
			
				|  |  | +            const str = commands[i + 1].cmd;
 | 
	
		
			
				|  |  | +            commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $lt:  parseInt(str, 10) } };
 | 
	
		
			
				|  |  | +            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:  parseInt(str, 10) } };
 | 
	
		
			
				|  |  | -          commands.splice(i - 1, 1);
 | 
	
		
			
				|  |  | -          commands.splice(i, 1);
 | 
	
		
			
				|  |  | -          //changed = true;
 | 
	
		
			
				|  |  | -          i--;
 | 
	
		
			
				|  |  | -          break;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            const field = commands[i - 1].cmd;
 | 
	
		
			
				|  |  | +            const str = commands[i + 1].cmd;
 | 
	
		
			
				|  |  | +            commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $lte:  parseInt(str, 10) } };
 | 
	
		
			
				|  |  | +            commands.splice(i - 1, 1);
 | 
	
		
			
				|  |  | +            commands.splice(i, 1);
 | 
	
		
			
				|  |  | +            //changed = true;
 | 
	
		
			
				|  |  | +            i--;
 | 
	
		
			
				|  |  | +            break;
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -350,45 +349,43 @@ class AdvancedFilter {
 | 
	
		
			
				|  |  |          case 'OR':
 | 
	
		
			
				|  |  |          case '|':
 | 
	
		
			
				|  |  |          case '||':
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -          const op1 = commands[i - 1];
 | 
	
		
			
				|  |  | -          const op2 = commands[i + 1];
 | 
	
		
			
				|  |  | -          commands[i] = { $or: [op1, op2] };
 | 
	
		
			
				|  |  | -          commands.splice(i - 1, 1);
 | 
	
		
			
				|  |  | -          commands.splice(i, 1);
 | 
	
		
			
				|  |  | -          //changed = true;
 | 
	
		
			
				|  |  | -          i--;
 | 
	
		
			
				|  |  | -          break;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            const op1 = commands[i - 1];
 | 
	
		
			
				|  |  | +            const op2 = commands[i + 1];
 | 
	
		
			
				|  |  | +            commands[i] = { $or: [op1, op2] };
 | 
	
		
			
				|  |  | +            commands.splice(i - 1, 1);
 | 
	
		
			
				|  |  | +            commands.splice(i, 1);
 | 
	
		
			
				|  |  | +            //changed = true;
 | 
	
		
			
				|  |  | +            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;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            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;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            const op1 = commands[i + 1];
 | 
	
		
			
				|  |  | +            commands[i] = { $not: op1 };
 | 
	
		
			
				|  |  | +            commands.splice(i + 1, 1);
 | 
	
		
			
				|  |  | +            //changed = true;
 | 
	
		
			
				|  |  | +            i--;
 | 
	
		
			
				|  |  | +            break;
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 |