/// <summary> /// Initializes the operator resolver. /// </summary> /// <returns>The operator resolver.</returns> private static OperatorResolver InitOperatorResolver() { Mock <OperatorResolver> opResolverMock = new Mock <OperatorResolver>(); IExpressionFactory exprFactory = new ExpressionFactory( ModelResolvers.ExprResolver, ModelResolvers.RuleExprResolver, ModelResolvers.JoinExprResolver, opResolverMock.Object); JoinApplyMeasuresOperator joinApplyMeasuresOp = new JoinApplyMeasuresOperator( exprFactory, ModelResolvers.DsResolver); opResolverMock.Setup(o => o(It.IsAny <string>())) .Returns((string key) => { IOperatorDefinition op; if (key.In("count", "min", "max", "median", "sum", "avg", "stddev_pop", "stddev_samp", "var_pop", "var_samp")) { op = new AggrFunctionOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver); } else if (key == "aggr") { op = new AggrOperator(); } else if (key.In("first_value", "last_value", "lag", "rank", "ratio_to_report", "lead")) { op = new AnalyticFunctionOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver); } else if (key.In("+", "-", "*", "/")) { op = new ArithmeticOperator(joinApplyMeasuresOp); } else if (key == "between") { op = new BetweenOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver); } else if (key.In("and", "or", "xor", "not")) { op = new BooleanOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver); } else if (key == "calc") { op = new CalcOperator(ModelResolvers.DsResolver); } else if (key == "check_datapoint") { op = new CheckDatapointOperator(ModelResolvers.DsResolver, exprFactory); } else if (key.In("=", "<>", "<", "<=", ">", ">=")) { op = new ComparisonOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver); } else if (key == "comp") { op = new ComponentOperator(ModelResolvers.DsResolver, new ComponentTypeInference(ModelResolvers.DsResolver)); } else if (key == "const") { op = new ConstantOperator(ModelResolvers.DsResolver); } else if (key == "current_date") { op = new CurrentDateOperator(ModelResolvers.DsResolver); } else if (key == "exists_in") { op = new ExistsInOperator(ModelResolvers.DsResolver); } else if (key == "get") { op = new GetOperator(new Mock <IDataModelProvider>().Object); // operator tests should mock IDataModel implementation } else if (key == "if") { op = new IfThenElseOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver); } else if (key.In("in", "not_in")) { op = new InOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver); } else if (key == "isnull") { op = new IsNullOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver); } else if (key == "join") { op = new JoinOperator(ModelResolvers.DsResolver); } else if (key.In("keep", "drop")) { op = new KeepDropOperator(ModelResolvers.DsResolver); } else if (key == "match_characters") { op = new MatchCharactersOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver); } else if (key == "#") { op = new MembershipOperator(); } else if (key.In("ceil", "floor", "abs", "exp", "ln", "sqrt", "mod", "round", "power", "log", "trunc")) { op = new NumericOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver); } else if (key == "nvl") { op = new NvlOperator(joinApplyMeasuresOp); } else if (key == "opt") { op = new OptionalOperator(ModelResolvers.DsResolver); } else if (key == "period_indicator") { op = new PeriodIndicatorOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver, exprFactory); } else if (key == "pivot") { op = new PivotOperator(ModelResolvers.DsResolver); } else if (key == "ref") { op = new ReferenceOperator(); } else if (key == "rename") { op = new RenameOperator(ModelResolvers.DsResolver); } else if (key.In("union", "intersect", "setdiff", "symdiff")) { op = new SetOperator(); } else if (key.In("||", "trim", "rtrim", "ltrim", "upper", "lower", "substr", "replace", "instr", "length")) { op = new StringOperator(joinApplyMeasuresOp, ModelResolvers.DsResolver); } else if (key == "sub") { op = new SubspaceOperator(ModelResolvers.DsResolver); } else if (key.In("fill_time_series", "flow_to_stock", "stock_to_flow", "timeshift", "time_agg")) { op = new TimeOperator(); } else if (key.In("plus", "minus")) { op = new UnaryArithmeticOperator(joinApplyMeasuresOp); } else if (key == "unpivot") { op = new UnpivotOperator(ModelResolvers.DsResolver); } // --- else if (key == "calcExpr") { op = new CalcExprOperator(ModelResolvers.DsResolver); } else if (key == "collection") { op = new CollectionOperator(ModelResolvers.DsResolver); } else if (key == "datasetClause") { op = new DatasetClauseOperator(); } else if (key == "group") { op = new GroupOperator(ModelResolvers.DsResolver); } else if (key == "order") { op = new OrderOperator(ModelResolvers.DsResolver); } else if (key == "partition") { op = new PartitionOperator(ModelResolvers.DsResolver); } else if (key == "renameExpr") { op = new RenameExprOperator(ModelResolvers.DsResolver); } else if (key == "subExpr") { op = new SubspaceExprOperator(); } else if (key == "when") { op = new WhenOperator(); } else { throw new InvalidOperationException("Operator not found"); } op.Symbol = key; return(op); }); return(opResolverMock.Object); }
//中序转换成后序表达式再计算 // 如:23+56/(102-100)*((36-24)/(8-6)) // 转换成:23|56|102|100|-|/|*|36|24|-|8|6|-|/|*|+" //以便利用栈的方式都进行计算。 /// <summary> /// 计算表达式的值 /// </summary> /// <param name="Expression">表达式,传入的值可以有变量 </param> /// <param name="GetOP">计算变量值的委托</param> /// <returns>计算的结果</returns> /// <remarks> /// 这里面,GETOP委托是为了将变量转化为数值 /// 如 /// <example> /// <code> /// public string Get(String str){ /// if(Str=="A") /// return "1"; /// else if (Str=="B") /// return "2"; /// return "0"; /// } /// public void Foo(){ /// string c =new MathExpression().CalculateParenthesesExpression("A+B",new GetOperator(Get)); /// ////c = "3"; /// } /// /// </code></example> /// </remarks> public string CalculateParenthesesExpression(string Expression, GetOperator GetOP) { ArrayList operatorList = new ArrayList(); string operator1; string ExpressionString = ""; string operand3; string[] experison = Expression.Split(operators, StringSplitOptions.RemoveEmptyEntries); if (experison.Length > 0) { for (int i = 0; i < experison.Length; i++) { Expression = Expression.Replace(experison[i], GetOP(experison[i])); } } while (Expression.Length > 0) { operand3 = ""; //取数字处理 if (opRatorString.IndexOf(Expression[0]) < 0) { while (opRatorString.IndexOf(Expression[0]) < 0) { operand3 += Expression[0].ToString(); Expression = Expression.Substring(1); if (Expression == "") { break; } } ExpressionString += operand3.ToString() + "|"; } //取“(”处理 if (Expression.Length > 0 && Expression[0].ToString() == "(") { operatorList.Add("("); Expression = Expression.Substring(1); } //取“)”处理 operand3 = ""; if (Expression.Length > 0 && Expression[0].ToString() == ")") { do { if (operatorList[operatorList.Count - 1].ToString() != "(") { operand3 += operatorList[operatorList.Count - 1].ToString() + "|"; operatorList.RemoveAt(operatorList.Count - 1); } else { operatorList.RemoveAt(operatorList.Count - 1); break; } } while (true); ExpressionString += operand3; Expression = Expression.Substring(1); } //取运算符号处理 operand3 = ""; if (Expression.Length > 0 && (Expression[0].ToString() == "*" || Expression[0].ToString() == "/" || Expression[0].ToString() == "+" || Expression[0].ToString() == "-")) { operator1 = Expression[0].ToString(); if (operatorList.Count > 0) { if (operatorList[operatorList.Count - 1].ToString() == "(" || verifyOperatorPriority(operator1, operatorList[operatorList.Count - 1].ToString())) { operatorList.Add(operator1); } else { operand3 += operatorList[operatorList.Count - 1].ToString() + "|"; operatorList.RemoveAt(operatorList.Count - 1); operatorList.Add(operator1); ExpressionString += operand3; } } else { operatorList.Add(operator1); } Expression = Expression.Substring(1); } } operand3 = ""; if (operatorList.Count == 0) { return(ExpressionString.Substring(0, ExpressionString.Length - 1)); } while (operatorList.Count != 0) { operand3 += operatorList[operatorList.Count - 1].ToString() + "|"; operatorList.RemoveAt(operatorList.Count - 1); } ExpressionString += operand3.Substring(0, operand3.Length - 1);; return(CalculateParenthesesExpressionEx(ExpressionString)); }