|
@@ -86,18 +86,17 @@ class AdvancedFilter {
|
|
constructor() {
|
|
constructor() {
|
|
this._dep = new Tracker.Dependency();
|
|
this._dep = new Tracker.Dependency();
|
|
this._filter = '';
|
|
this._filter = '';
|
|
- this._lastValide={};
|
|
|
|
|
|
+ this._lastValide = {};
|
|
}
|
|
}
|
|
|
|
|
|
- set(str)
|
|
|
|
- {
|
|
|
|
|
|
+ set(str) {
|
|
this._filter = str;
|
|
this._filter = str;
|
|
this._dep.changed();
|
|
this._dep.changed();
|
|
}
|
|
}
|
|
|
|
|
|
reset() {
|
|
reset() {
|
|
this._filter = '';
|
|
this._filter = '';
|
|
- this._lastValide={};
|
|
|
|
|
|
+ this._lastValide = {};
|
|
this._dep.changed();
|
|
this._dep.changed();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -106,103 +105,89 @@ class AdvancedFilter {
|
|
return this._filter !== '';
|
|
return this._filter !== '';
|
|
}
|
|
}
|
|
|
|
|
|
- _filterToCommands(){
|
|
|
|
|
|
+ _filterToCommands() {
|
|
const commands = [];
|
|
const commands = [];
|
|
let current = '';
|
|
let current = '';
|
|
let string = false;
|
|
let string = false;
|
|
let wasString = false;
|
|
let wasString = false;
|
|
let ignore = false;
|
|
let ignore = false;
|
|
- for (let i = 0; i < this._filter.length; i++)
|
|
|
|
- {
|
|
|
|
|
|
+ for (let i = 0; i < this._filter.length; i++) {
|
|
const char = this._filter.charAt(i);
|
|
const char = this._filter.charAt(i);
|
|
- if (ignore)
|
|
|
|
- {
|
|
|
|
|
|
+ if (ignore) {
|
|
ignore = false;
|
|
ignore = false;
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
- if (char === '\'')
|
|
|
|
- {
|
|
|
|
|
|
+ if (char === '\'') {
|
|
string = !string;
|
|
string = !string;
|
|
if (string) wasString = true;
|
|
if (string) wasString = true;
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
- if (char === '\\')
|
|
|
|
- {
|
|
|
|
|
|
+ if (char === '\\') {
|
|
ignore = true;
|
|
ignore = true;
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
- if (char === ' ' && !string)
|
|
|
|
- {
|
|
|
|
- commands.push({'cmd':current, 'string':wasString});
|
|
|
|
|
|
+ if (char === ' ' && !string) {
|
|
|
|
+ commands.push({ 'cmd': current, 'string': wasString });
|
|
wasString = false;
|
|
wasString = false;
|
|
current = '';
|
|
current = '';
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
current += char;
|
|
current += char;
|
|
}
|
|
}
|
|
- if (current !== '')
|
|
|
|
- {
|
|
|
|
- commands.push({'cmd':current, 'string':wasString});
|
|
|
|
|
|
+ if (current !== '') {
|
|
|
|
+ commands.push({ 'cmd': current, 'string': wasString });
|
|
}
|
|
}
|
|
return commands;
|
|
return commands;
|
|
}
|
|
}
|
|
|
|
|
|
- _fieldNameToId(field)
|
|
|
|
- {
|
|
|
|
- const found = CustomFields.findOne({'name':field});
|
|
|
|
|
|
+ _fieldNameToId(field) {
|
|
|
|
+ const found = CustomFields.findOne({ 'name': field });
|
|
return found._id;
|
|
return found._id;
|
|
}
|
|
}
|
|
|
|
|
|
- _arrayToSelector(commands)
|
|
|
|
- {
|
|
|
|
|
|
+ _arrayToSelector(commands) {
|
|
try {
|
|
try {
|
|
//let changed = false;
|
|
//let changed = false;
|
|
this._processSubCommands(commands);
|
|
this._processSubCommands(commands);
|
|
}
|
|
}
|
|
- catch (e){return this._lastValide;}
|
|
|
|
- this._lastValide = {$or: commands};
|
|
|
|
- return {$or: commands};
|
|
|
|
|
|
+ catch (e) { return this._lastValide; }
|
|
|
|
+ this._lastValide = { $or: commands };
|
|
|
|
+ return { $or: commands };
|
|
}
|
|
}
|
|
|
|
|
|
- _processSubCommands(commands)
|
|
|
|
- {
|
|
|
|
|
|
+ _processSubCommands(commands) {
|
|
const subcommands = [];
|
|
const subcommands = [];
|
|
let level = 0;
|
|
let level = 0;
|
|
let start = -1;
|
|
let start = -1;
|
|
- for (let i = 0; i < commands.length; i++)
|
|
|
|
- {
|
|
|
|
- if (commands[i].cmd)
|
|
|
|
- {
|
|
|
|
- switch (commands[i].cmd)
|
|
|
|
- {
|
|
|
|
|
|
+ for (let i = 0; i < commands.length; i++) {
|
|
|
|
+ if (commands[i].cmd) {
|
|
|
|
+ switch (commands[i].cmd) {
|
|
case '(':
|
|
case '(':
|
|
- {
|
|
|
|
- level++;
|
|
|
|
- if (start === -1) start = i;
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
|
|
+ {
|
|
|
|
+ level++;
|
|
|
|
+ if (start === -1) start = i;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
case ')':
|
|
case ')':
|
|
- {
|
|
|
|
- level--;
|
|
|
|
- commands.splice(i, 1);
|
|
|
|
- i--;
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
- default:
|
|
|
|
- {
|
|
|
|
- if (level > 0)
|
|
|
|
{
|
|
{
|
|
- subcommands.push(commands[i]);
|
|
|
|
|
|
+ level--;
|
|
commands.splice(i, 1);
|
|
commands.splice(i, 1);
|
|
i--;
|
|
i--;
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
+ default:
|
|
|
|
+ {
|
|
|
|
+ if (level > 0) {
|
|
|
|
+ subcommands.push(commands[i]);
|
|
|
|
+ commands.splice(i, 1);
|
|
|
|
+ i--;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if (start !== -1)
|
|
|
|
- {
|
|
|
|
|
|
+ if (start !== -1) {
|
|
this._processSubCommands(subcommands);
|
|
this._processSubCommands(subcommands);
|
|
if (subcommands.length === 1)
|
|
if (subcommands.length === 1)
|
|
commands.splice(start, 0, subcommands[0]);
|
|
commands.splice(start, 0, subcommands[0]);
|
|
@@ -213,154 +198,146 @@ class AdvancedFilter {
|
|
this._processLogicalOperators(commands);
|
|
this._processLogicalOperators(commands);
|
|
}
|
|
}
|
|
|
|
|
|
- _processConditions(commands)
|
|
|
|
- {
|
|
|
|
- for (let i = 0; i < commands.length; i++)
|
|
|
|
- {
|
|
|
|
- if (!commands[i].string && commands[i].cmd)
|
|
|
|
- {
|
|
|
|
- switch (commands[i].cmd)
|
|
|
|
- {
|
|
|
|
|
|
+ _processConditions(commands) {
|
|
|
|
+ for (let i = 0; i < commands.length; i++) {
|
|
|
|
+ if (!commands[i].string && commands[i].cmd) {
|
|
|
|
+ switch (commands[i].cmd) {
|
|
case '=':
|
|
case '=':
|
|
case '==':
|
|
case '==':
|
|
case '===':
|
|
case '===':
|
|
- {
|
|
|
|
- const field = commands[i-1].cmd;
|
|
|
|
- const str = commands[i+1].cmd;
|
|
|
|
- commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value':str};
|
|
|
|
- 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': str };
|
|
|
|
+ commands.splice(i - 1, 1);
|
|
|
|
+ commands.splice(i, 1);
|
|
|
|
+ //changed = true;
|
|
|
|
+ i--;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
case '!=':
|
|
case '!=':
|
|
case '!==':
|
|
case '!==':
|
|
- {
|
|
|
|
- const field = commands[i-1].cmd;
|
|
|
|
- const str = commands[i+1].cmd;
|
|
|
|
- commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value': { $not: str }};
|
|
|
|
- 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': { $not: str } };
|
|
|
|
+ commands.splice(i - 1, 1);
|
|
|
|
+ commands.splice(i, 1);
|
|
|
|
+ //changed = true;
|
|
|
|
+ i--;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
case '>':
|
|
case '>':
|
|
case 'gt':
|
|
case 'gt':
|
|
case 'Gt':
|
|
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;
|
|
|
|
- }
|
|
|
|
|
|
+ {
|
|
|
|
+ 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 '>==':
|
|
case '>==':
|
|
case 'gte':
|
|
case 'gte':
|
|
case 'Gte':
|
|
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;
|
|
|
|
- }
|
|
|
|
|
|
+ {
|
|
|
|
+ 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 '<':
|
|
case 'lt':
|
|
case 'lt':
|
|
case 'Lt':
|
|
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;
|
|
|
|
- }
|
|
|
|
|
|
+ {
|
|
|
|
+ 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 '<==':
|
|
case '<==':
|
|
case 'lte':
|
|
case 'lte':
|
|
case 'Lte':
|
|
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;
|
|
|
|
- }
|
|
|
|
|
|
+ {
|
|
|
|
+ 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;
|
|
|
|
+ }
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- _processLogicalOperators(commands)
|
|
|
|
- {
|
|
|
|
- for (let i = 0; i < commands.length; i++)
|
|
|
|
- {
|
|
|
|
- if (!commands[i].string && commands[i].cmd)
|
|
|
|
- {
|
|
|
|
- switch (commands[i].cmd)
|
|
|
|
- {
|
|
|
|
|
|
+ _processLogicalOperators(commands) {
|
|
|
|
+ for (let i = 0; i < commands.length; i++) {
|
|
|
|
+ if (!commands[i].string && commands[i].cmd) {
|
|
|
|
+ switch (commands[i].cmd) {
|
|
case 'or':
|
|
case 'or':
|
|
case 'Or':
|
|
case 'Or':
|
|
case 'OR':
|
|
case 'OR':
|
|
case '|':
|
|
case '|':
|
|
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 'And':
|
|
case 'AND':
|
|
case 'AND':
|
|
case '&':
|
|
case '&':
|
|
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 'Not':
|
|
case 'NOT':
|
|
case 'NOT':
|
|
case '!':
|
|
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;
|
|
|
|
+ }
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -412,12 +389,10 @@ Filter = {
|
|
this._fields.forEach((fieldName) => {
|
|
this._fields.forEach((fieldName) => {
|
|
const filter = this[fieldName];
|
|
const filter = this[fieldName];
|
|
if (filter._isActive()) {
|
|
if (filter._isActive()) {
|
|
- if (filter.subField !== '')
|
|
|
|
- {
|
|
|
|
|
|
+ if (filter.subField !== '') {
|
|
filterSelector[`${fieldName}.${filter.subField}`] = filter._getMongoSelector();
|
|
filterSelector[`${fieldName}.${filter.subField}`] = filter._getMongoSelector();
|
|
}
|
|
}
|
|
- else
|
|
|
|
- {
|
|
|
|
|
|
+ else {
|
|
filterSelector[fieldName] = filter._getMongoSelector();
|
|
filterSelector[fieldName] = filter._getMongoSelector();
|
|
}
|
|
}
|
|
emptySelector[fieldName] = filter._getEmptySelector();
|
|
emptySelector[fieldName] = filter._getEmptySelector();
|
|
@@ -427,7 +402,7 @@ Filter = {
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
|
|
- const exceptionsSelector = {_id: {$in: this._exceptions}};
|
|
|
|
|
|
+ const exceptionsSelector = { _id: { $in: this._exceptions } };
|
|
this._exceptionsDep.depend();
|
|
this._exceptionsDep.depend();
|
|
|
|
|
|
const selectors = [exceptionsSelector];
|
|
const selectors = [exceptionsSelector];
|
|
@@ -438,7 +413,7 @@ Filter = {
|
|
if (includeEmptySelectors) selectors.push(emptySelector);
|
|
if (includeEmptySelectors) selectors.push(emptySelector);
|
|
if (this.advanced._isActive()) selectors.push(this.advanced._getMongoSelector());
|
|
if (this.advanced._isActive()) selectors.push(this.advanced._getMongoSelector());
|
|
|
|
|
|
- return {$or: selectors};
|
|
|
|
|
|
+ return { $or: selectors };
|
|
},
|
|
},
|
|
|
|
|
|
mongoSelector(additionalSelector) {
|
|
mongoSelector(additionalSelector) {
|
|
@@ -446,7 +421,7 @@ Filter = {
|
|
if (_.isUndefined(additionalSelector))
|
|
if (_.isUndefined(additionalSelector))
|
|
return filterSelector;
|
|
return filterSelector;
|
|
else
|
|
else
|
|
- return {$and: [filterSelector, additionalSelector]};
|
|
|
|
|
|
+ return { $and: [filterSelector, additionalSelector] };
|
|
},
|
|
},
|
|
|
|
|
|
reset() {
|
|
reset() {
|