fix: RegExp operand's in logic to evaluator. (#293)
* fix: RegExp operand's in logic to evaluator. * Add <> operator comparison.pull/3759/head
							parent
							
								
									e4729a4841
								
							
						
					
					
						commit
						c51f09c745
					
				|  | @ -4,7 +4,7 @@ | |||
| // logic := {|}|{&}<br>
 | ||||
| // context := any global or window context <br>
 | ||||
| // value := strings or numbers<br>
 | ||||
| // logic operators	:= AND or OR with the previous result from left to right <br>
 | ||||
| // logic operators  := AND or OR with the previous result from left to right <br>
 | ||||
| // operand := eq{=}, gt{>}, le{<}, not{~^!} <br>
 | ||||
| // Examples: <br>
 | ||||
| // @AD_Table_ID@=14 | @Language@!GERGER <br>
 | ||||
|  | @ -17,7 +17,7 @@ class evaluator { | |||
|    * @param {string} parentUuid Parent (Window / Process / Smart Browser) | ||||
|    */ | ||||
|   static evaluateLogic(objectToEvaluate) { | ||||
|     var defaultUndefined = false | ||||
|     let defaultUndefined = false | ||||
|     if (objectToEvaluate.type === 'displayed') { | ||||
|       defaultUndefined = true | ||||
|     } | ||||
|  | @ -27,22 +27,19 @@ class evaluator { | |||
|       objectToEvaluate.logic.trim() === '') { | ||||
|       return defaultUndefined | ||||
|     } | ||||
|     var st = objectToEvaluate.logic.trim().replace('\n', '') | ||||
|     let st = objectToEvaluate.logic.trim().replace('\n', '') | ||||
|     st = st.replace('|', '~') | ||||
|     var expr = /(~|&)/ | ||||
|     var stList = st.split(expr) | ||||
|     var it = stList.length | ||||
|     const expr = /(~|&)/ | ||||
|     const stList = st.split(expr) | ||||
|     const it = stList.length | ||||
| 
 | ||||
|     if (((it / 2) - ((it + 1) / 2)) === 0) { | ||||
|       console.info( | ||||
|         'Logic does not comply with format "<expression> [<logic> <expression>]"' + | ||||
|         '  -->  ' + objectToEvaluate.logic | ||||
|       ) | ||||
|       console.info(`Logic does not comply with format "<expression> [<logic> <expression>]"  -->  ${objectToEvaluate.logic}`) | ||||
|       return defaultUndefined | ||||
|     } | ||||
| 
 | ||||
|     var retValue = null | ||||
|     var logOp = '' | ||||
|     let retValue = null | ||||
|     let logOp = '' | ||||
|     stList.forEach(function(element) { | ||||
|       if (element === '~' || element === '&') { | ||||
|         logOp = element | ||||
|  | @ -63,7 +60,7 @@ class evaluator { | |||
|             conditional: element | ||||
|           }) | ||||
|         } else { | ||||
|           console.info("Logic operant '|' or '&' expected  -->  " + objectToEvaluate.logic) | ||||
|           console.info(`Logic operant '|' or '&' expected  -->  ${objectToEvaluate.logic}`) | ||||
|           return defaultUndefined | ||||
|         } | ||||
|       } | ||||
|  | @ -78,83 +75,74 @@ class evaluator { | |||
|    * @return {boolean} | ||||
|    */ | ||||
|   static evaluateLogicTuples(objectToEvaluate) { | ||||
|     var _defaultUndefined = false | ||||
|     let _defaultUndefined = false | ||||
|     if (objectToEvaluate.type === 'displayed') { | ||||
|       _defaultUndefined = true | ||||
|     } | ||||
|     var logic = objectToEvaluate.conditional | ||||
|     const logic = objectToEvaluate.conditional | ||||
|     // not context info, not logic
 | ||||
|     if (logic === undefined) { | ||||
|       return _defaultUndefined | ||||
|     } | ||||
|     var expr = /^(['"@#$a-zA-Z0-9\-_\s]){0,}((!*={1})|(!{1})|(<{1})|(>{1}))([\s"'@#$a-zA-Z0-9\-_]){0,}$/i | ||||
|     var st = expr.test(logic) | ||||
|     let expr = /^(['"@#$a-zA-Z0-9\-_\s]){0,}((<>|<=|<|=|>=|>|!=|!|\^){1,2})([\s"'@#$a-zA-Z0-9\-_]){0,}$/i | ||||
|     let st = expr.test(logic) | ||||
| 
 | ||||
|     if (!st) { | ||||
|       console.info( | ||||
|         ".Logic tuple does not comply with format '@context@=value' where operand" + | ||||
|         " could be one of '=!^><'  -->  " + logic | ||||
|       ) | ||||
|       console.info(`.Logic tuple does not comply with format '@context@=value' where operand could be one of '=!^><'  -->  ${logic}`) | ||||
|       return _defaultUndefined | ||||
|     } | ||||
|     expr = /(!{1}|={1})/ | ||||
| 
 | ||||
|     expr = /(<>|<=|<|=|>=|>|!=|!|\^){1,2}/i | ||||
|     st = logic.split(expr) | ||||
|     if (st.length === 1) { | ||||
|       expr = /(<{1})/ | ||||
|       st = logic.split(expr) | ||||
|     } | ||||
|     if (st.length === 1) { | ||||
|       expr = /(>)/ | ||||
|       st = logic.split(expr) | ||||
|     } | ||||
| 
 | ||||
|     // First Part (or column name)
 | ||||
|     var first = st[0].trim() | ||||
|     var firstEval = first | ||||
|     let first = st[0].trim() | ||||
|     let firstEval = first | ||||
|     let isCountable = false | ||||
|     let isGlobal = false | ||||
|     expr = /@/ | ||||
|     if (expr.test(first)) { | ||||
|       first = first.replace(/@/g, '').trim() | ||||
|       var isGlobal = first.startsWith('#') | ||||
|       var isCountable = first.startsWith('$') | ||||
|       var value = objectToEvaluate.context.getContext({ | ||||
|       isGlobal = first.startsWith('#') | ||||
|       isCountable = first.startsWith('$') | ||||
|       const value = objectToEvaluate.context.getContext({ | ||||
|         parentUuid: (isGlobal || isCountable) ? '' : objectToEvaluate.parentUuid, | ||||
|         containerUuid: (isGlobal || isCountable) ? '' : objectToEvaluate.containerUuid, | ||||
|         columnName: first | ||||
|       }) | ||||
|       // in context exists this column name
 | ||||
|       if (value === null || value === undefined) { | ||||
|         console.info( | ||||
|           '.The column ' + first + ' not exists in context.' | ||||
|         ) | ||||
|         console.info(`.The column ${first} not exists in context.`) | ||||
|         return _defaultUndefined | ||||
|       } | ||||
|       firstEval = value	// replace with it's value
 | ||||
|       firstEval = value // replace with it's value
 | ||||
|     } | ||||
| 
 | ||||
|     if (firstEval === null || firstEval === undefined) { | ||||
|       return _defaultUndefined | ||||
|     } | ||||
|     if (typeof firstEval === 'string') { | ||||
|       firstEval = firstEval.replace(/['"]/g, '').trim()	// strip ' and "
 | ||||
|       firstEval = firstEval.replace(/['"]/g, '').trim() // strip ' and "
 | ||||
|     } | ||||
| 
 | ||||
|     //	Operator
 | ||||
|     var operand = st[1] | ||||
|     //	Second Part
 | ||||
|     var second = st[2].trim() | ||||
|     var secondEval = second.trim() | ||||
|     //  Operator
 | ||||
|     const operand = st[1] | ||||
|     //  Second Part
 | ||||
|     let second = st[2].trim() | ||||
|     let secondEval = second.trim() | ||||
|     if (expr.test(second)) { | ||||
|       second = second.replace(/@/g, ' ').trim() // strip tag
 | ||||
|       secondEval = objectToEvaluate.context.getContext({ | ||||
|         parentUuid: (isGlobal || isCountable) ? null : objectToEvaluate.parentUuid, | ||||
|         containerUuid: (isGlobal || isCountable) ? null : objectToEvaluate.containerUuid, | ||||
|         columnName: first | ||||
|       })	//	replace with it's value
 | ||||
|       }) //  replace with it's value
 | ||||
|     } | ||||
|     if (typeof secondEval === 'string') { | ||||
|       secondEval = secondEval.replace(/['"]/g, '').trim()	//	strip ' and " for string values
 | ||||
|       secondEval = secondEval.replace(/['"]/g, '').trim() //  strip ' and " for string values
 | ||||
|     } | ||||
| 
 | ||||
|     //	Handling of ID compare (null => 0)
 | ||||
|     //  Handling of ID compare (null => 0)
 | ||||
|     if (first.includes('_ID') && firstEval.length === 0) { | ||||
|       firstEval = '0' | ||||
|     } | ||||
|  | @ -162,8 +150,8 @@ class evaluator { | |||
|       secondEval = '0' | ||||
|     } | ||||
| 
 | ||||
|     //	Logical Comparison
 | ||||
|     var result = this.evaluateLogicTuple(firstEval, operand, secondEval) | ||||
|     //  Logical Comparison
 | ||||
|     const result = this.evaluateLogicTuple(firstEval, operand, secondEval) | ||||
| 
 | ||||
|     return result | ||||
|   } | ||||
|  | @ -190,19 +178,42 @@ class evaluator { | |||
|       value2 = false | ||||
|     } | ||||
| 
 | ||||
|     if (value1 == null || operand == null || value2 == null) { | ||||
|     if ([value1, operand, value2].includes(null)) { | ||||
|       return false | ||||
|     } | ||||
|     if (operand === '=') { | ||||
|       return value1 === value2 | ||||
|     } else if (operand === '<') { | ||||
|       return value1 < value2 | ||||
|     } else if (operand === '>') { | ||||
|       return value1 > value2 | ||||
|     } else { | ||||
|       //	interpreted as not
 | ||||
|       return value1 !== value2 | ||||
| 
 | ||||
|     let isValueLogic | ||||
|     // TODO: Add '^' operand comparison
 | ||||
|     switch (operand) { | ||||
|       case '=': | ||||
|       case '==': | ||||
|         isValueLogic = value1 === value2 | ||||
|         break | ||||
| 
 | ||||
|       case '<': | ||||
|         isValueLogic = value1 < value2 | ||||
|         break | ||||
| 
 | ||||
|       case '<=': | ||||
|         isValueLogic = value1 <= value2 | ||||
|         break | ||||
| 
 | ||||
|       case '>': | ||||
|         isValueLogic = value1 > value2 | ||||
|         break | ||||
| 
 | ||||
|       case '>=': | ||||
|         isValueLogic = value1 >= value2 | ||||
|         break | ||||
| 
 | ||||
|       case '!': | ||||
|       case '!=': | ||||
|       case '<>': | ||||
|       default: | ||||
|         isValueLogic = value1 !== value2 | ||||
|         break | ||||
|     } | ||||
|     return isValueLogic | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|  | @ -211,7 +222,7 @@ class evaluator { | |||
|    * @return {array} | ||||
|    */ | ||||
|   static parseDepends(parseString) { | ||||
|     var listFields = [] | ||||
|     const listFields = [] | ||||
|     if (parseString === null || parseString === undefined) { | ||||
|       // return array empty
 | ||||
|       return listFields | ||||
|  | @ -228,7 +239,7 @@ class evaluator { | |||
|       pos = string.indexOf('@') | ||||
|       if (pos === -1) { | ||||
|         continue | ||||
|       }	//	error number of @@ not correct
 | ||||
|       } //  error number of @@ not correct
 | ||||
| 
 | ||||
|       // remove second @: ExampleColumn@ = ExampleColumn
 | ||||
|       const value = string.substring(0, pos) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 EdwinBetanc0urt
						EdwinBetanc0urt