in objectModel/TypeScript/ResolvedModel/ExpressionParser/ExpressionTree.ts [198:295]
public static evaluateExpressionTree(top: Node, input: InputValues): any {
if (!top) {
return false;
}
let leftReturn: any = false;
let rightReturn: any = false;
if (top.left) {
leftReturn = this.evaluateExpressionTree(top.left, input);
}
if (top.right) {
rightReturn = this.evaluateExpressionTree(top.right, input);
}
if (top.valueType === PredefinedType.custom) {
// check if number and return number
const num: number = Number(top.value);
if (!isNaN(num)) {
return num;
}
// check if bool and return bool
if (typeof top.value === 'string') {
if (top.value.trim().toLowerCase() === 'true') {
return true;
} else if (top.value.trim().toLowerCase() === 'false') {
return false;
}
}
}
if (!ExpressionTree.textToTokenHash.has(top.value)) {
return top.value;
} else {
switch (ExpressionTree.textToTokenHash.get(top.value)) {
case PredefinedTokenEnum.AND:
return (leftReturn === undefined || leftReturn === null || rightReturn === undefined || rightReturn == null) ? false : leftReturn && rightReturn;
case PredefinedTokenEnum.NOT:
return (rightReturn === undefined || rightReturn == null) ? false : !rightReturn;
case PredefinedTokenEnum.OR:
return (leftReturn === undefined || leftReturn === null || rightReturn === undefined || rightReturn == null) ? false : leftReturn || rightReturn;
case PredefinedTokenEnum.GT:
return (leftReturn === undefined || leftReturn === null || rightReturn === undefined || rightReturn == null) ? false : leftReturn > rightReturn;
case PredefinedTokenEnum.LT:
return (leftReturn === undefined || leftReturn === null || rightReturn === undefined || rightReturn == null) ? false : leftReturn < rightReturn;
case PredefinedTokenEnum.GE:
return (leftReturn === undefined || leftReturn === null || rightReturn === undefined || rightReturn == null) ? false : leftReturn >= rightReturn;
case PredefinedTokenEnum.LE:
return (leftReturn === undefined || leftReturn === null || rightReturn === undefined || rightReturn == null) ? false : leftReturn <= rightReturn;
case PredefinedTokenEnum.EQ:
return (leftReturn === undefined || leftReturn === null || rightReturn === undefined || rightReturn == null) ? false : leftReturn === rightReturn;
case PredefinedTokenEnum.NE:
return (leftReturn === undefined || leftReturn === null || rightReturn === undefined || rightReturn == null) ? false : leftReturn !== rightReturn;
case PredefinedTokenEnum.TRUE:
return true;
case PredefinedTokenEnum.FALSE:
return false;
case PredefinedTokenEnum.OPENPAREN:
case PredefinedTokenEnum.CLOSEPAREN:
return true;
case PredefinedTokenEnum.DEPTH:
return input.nextDepth;
case PredefinedTokenEnum.MAXDEPTH:
return input.maxDepth;
case PredefinedTokenEnum.ISARRAY:
return input.isArray;
case PredefinedTokenEnum.NOMAXDEPTH:
return input.noMaxDepth;
case PredefinedTokenEnum.MINCARDINALITY:
return input.minCardinality;
case PredefinedTokenEnum.MAXCARDINALITY:
return input.maxCardinality;
case PredefinedTokenEnum.NORMALIZED:
return input.normalized;
case PredefinedTokenEnum.REFERENCEONLY:
return input.referenceOnly;
case PredefinedTokenEnum.STRUCTURED:
return input.structured;
case PredefinedTokenEnum.VIRTUAL:
return input.isVirtual;
case PredefinedTokenEnum.ALWAYS:
return true;
default:
return top.value;
}
}
}