internal static dynamic EvaluateExpressionTree()

in objectModel/CSharp/Microsoft.CommonDataModel.ObjectModel/ResolvedModel/ExpressionParser/ExpressionTree.cs [239:343]


        internal static dynamic EvaluateExpressionTree(Node top, InputValues inputValues)
        {
            if (top == null)
            {
                return false;
            }

            dynamic leftReturn = false, rightReturn = false;

            if (top.Left != null)
            {
                leftReturn = EvaluateExpressionTree(top.Left, inputValues);
            }

            if (top.Right != null)
            {
                rightReturn = EvaluateExpressionTree(top.Right, inputValues);
            }

            if (top.ValueType == PredefinedType.Custom)
            {
                // check if number and return number
                int num;
                if (int.TryParse(top.Value, out num))
                {
                    return num;
                }

                // check if bool and return bool
                bool bl = false;
                if (bool.TryParse(top.Value, out bl))
                {
                    return bl;
                }
            }

            if (!textToTokenHash.ContainsKey(top.Value))
            {
                return top.Value;
            }
            else
            {
                switch (textToTokenHash[top.Value])
                {
                    case PredefinedTokenEnum.AND:
                        return (leftReturn == null || rightReturn == null) ? false : leftReturn && rightReturn;
                    case PredefinedTokenEnum.NOT:
                        return (rightReturn == null) ? false : !rightReturn;
                    case PredefinedTokenEnum.OR:
                        return (leftReturn == null || rightReturn == null) ? false : leftReturn || rightReturn;

                    case PredefinedTokenEnum.GT:
                        return (leftReturn == null || rightReturn == null) ? false : leftReturn > rightReturn;
                    case PredefinedTokenEnum.LT:
                        return (leftReturn == null || rightReturn == null) ? false : leftReturn < rightReturn;
                    case PredefinedTokenEnum.GE:
                        return (leftReturn == null || rightReturn == null) ? false : leftReturn >= rightReturn;
                    case PredefinedTokenEnum.LE:
                        return (leftReturn == null || rightReturn == null) ? false : leftReturn <= rightReturn;
                    case PredefinedTokenEnum.EQ:
                        return (leftReturn == null || rightReturn == null) ? false : leftReturn == rightReturn;
                    case PredefinedTokenEnum.NE:
                        return (leftReturn == null || 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 inputValues.NextDepth;
                    case PredefinedTokenEnum.MAXDEPTH:
                        return inputValues.MaxDepth;

                    case PredefinedTokenEnum.ISARRAY:
                        return inputValues.IsArray;
                    case PredefinedTokenEnum.NOMAXDEPTH:
                        return inputValues.NoMaxDepth;

                    case PredefinedTokenEnum.MINCARDINALITY:
                        return inputValues.MinCardinality;
                    case PredefinedTokenEnum.MAXCARDINALITY:
                        return inputValues.MaxCardinality;

                    case PredefinedTokenEnum.NORMALIZED:
                        return inputValues.Normalized;
                    case PredefinedTokenEnum.REFERENCEONLY:
                        return inputValues.ReferenceOnly;
                    case PredefinedTokenEnum.STRUCTURED:
                        return inputValues.Structured;
                    case PredefinedTokenEnum.VIRTUAL:
                        return inputValues.IsVirtual;

                    case PredefinedTokenEnum.ALWAYS:
                        return true;

                    default:
                        return top.Value;
                }
            }
        }