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