def _evaluate_expression_tree()

in objectModel/Python/cdm/resolvedmodel/expression_parser/expression_tree.py [0:0]


    def _evaluate_expression_tree(top: 'Node', input_values: 'InputValues') -> Union[str, bool, int]:
        """Given an expression tree, evaluate the expression"""
        if top is None:
            return False

        left_return = False
        right_return = False

        if top._left is not None:
            left_return = ExpressionTree._evaluate_expression_tree(top._left, input_values)

        if top._right is not None:
            right_return = ExpressionTree._evaluate_expression_tree(top._right, input_values)

        if top._value_type == PredefinedType.CUSTOM:
            # check if number and return number
            try:
                num = int(top._value)
                return num
            except ValueError:
                pass

            # check if bool and return bool
            if top._value.strip().lower() == 'true':
                return True
            elif top._value.strip().lower() == 'false':
                return False

        if top._value not in ExpressionTree._text_to_token_hash:
            return top._value
        else:
            token = ExpressionTree._text_to_token_hash[top._value]
            if token == PredefinedTokenEnum.AND:
                return False if left_return is None or right_return is None else left_return and right_return
            elif token == PredefinedTokenEnum.NOT:
                return False if right_return is None else not right_return
            elif token == PredefinedTokenEnum.OR:
                return False if left_return is None or right_return is None else left_return or right_return
            elif token == PredefinedTokenEnum.GT:
                return False if left_return is None or right_return is None else left_return > right_return
            elif token == PredefinedTokenEnum.LT:
                return False if left_return is None or right_return is None else left_return < right_return
            elif token == PredefinedTokenEnum.GE:
                return False if left_return is None or right_return is None else left_return >= right_return
            elif token == PredefinedTokenEnum.LE:
                return False if left_return is None or right_return is None else left_return <= right_return
            elif token == PredefinedTokenEnum.EQ:
                return False if left_return is None or right_return is None else left_return == right_return
            elif token == PredefinedTokenEnum.NE:
                return False if left_return is None or right_return is None else left_return != right_return
            elif token == PredefinedTokenEnum.TRUE:
                return True
            elif token == PredefinedTokenEnum.FALSE:
                return False
            elif token == PredefinedTokenEnum.OPENPAREN or token == PredefinedTokenEnum.CLOSEPAREN:
                return True
            elif token == PredefinedTokenEnum.DEPTH:
                return input_values.next_depth
            elif token == PredefinedTokenEnum.MAXDEPTH:
                return input_values.max_depth
            elif token == PredefinedTokenEnum.ISARRAY:
                return input_values.is_array
            elif token == PredefinedTokenEnum.NOMAXDEPTH:
                return input_values.no_max_depth
            elif token == PredefinedTokenEnum.MINCARDINALITY:
                return input_values.min_cardinality
            elif token == PredefinedTokenEnum.MAXCARDINALITY:
                return input_values.max_cardinality
            elif token == PredefinedTokenEnum.NORMALIZED:
                return input_values.normalized
            elif token == PredefinedTokenEnum.REFERENCEONLY:
                return input_values.reference_only
            elif token == PredefinedTokenEnum.STRUCTURED:
                return input_values.structured
            elif token == PredefinedTokenEnum.VIRTUAL:
                return input_values.is_virtual
            elif token == PredefinedTokenEnum.ALWAYS:
                return True
            else:
                return top._value