public static evaluateExpressionTree()

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;
            }
        }
    }