public virtual Net.Vpc.Upa.Expressions.Expression EvalObject(Net.Vpc.Upa.Expressions.Expression e, Net.Vpc.Upa.QLEvaluator evaluator, object context) { Net.Vpc.Upa.Expressions.If ife = (Net.Vpc.Upa.Expressions.If)e; int count = ife.GetArgumentsCount(); int i = 0; Net.Vpc.Upa.Expressions.Expression[] allArguments = ife.GetArguments(); while (i < count) { Net.Vpc.Upa.Expressions.Expression ee = allArguments[i]; allArguments[i] = evaluator.EvalObject(ee, context); object o = Net.Vpc.Upa.Impl.Util.UPAUtils.UnwrapLiteral(allArguments[i]); if (o is Net.Vpc.Upa.Expressions.Expression) { //just simplify don't exec return(new Net.Vpc.Upa.Expressions.If(new System.Collections.Generic.List <Net.Vpc.Upa.Expressions.Expression>(allArguments))); } bool?exprVal = (bool?)o; if ((exprVal).Value) { Net.Vpc.Upa.Expressions.Expression thenExpr = allArguments[i + 1]; allArguments[i + 1] = evaluator.EvalObject(thenExpr, context); o = Net.Vpc.Upa.Impl.Util.UPAUtils.UnwrapLiteral(allArguments[i + 1]); if (o is Net.Vpc.Upa.Expressions.Expression) { //just simplify don't exec return(new Net.Vpc.Upa.Expressions.If(new System.Collections.Generic.List <Net.Vpc.Upa.Expressions.Expression>(allArguments))); } return(new Net.Vpc.Upa.Expressions.Literal(o, null)); } else { if (i + 2 == count - 1) { //the else allArguments[i + 2] = evaluator.EvalObject(allArguments[i + 2], context); o = Net.Vpc.Upa.Impl.Util.UPAUtils.UnwrapLiteral(allArguments[i + 2]); if (o is Net.Vpc.Upa.Expressions.Expression) { //just simplify don't exec return(new Net.Vpc.Upa.Expressions.If(new System.Collections.Generic.List <Net.Vpc.Upa.Expressions.Expression>(allArguments))); } return(new Net.Vpc.Upa.Expressions.Literal(o, null)); } i += 2; } } return(Net.Vpc.Upa.Expressions.Literal.NULL); }
public virtual Net.Vpc.Upa.Expressions.Expression EvalObject(Net.Vpc.Upa.Expressions.Expression e, Net.Vpc.Upa.QLEvaluator evaluator, object context) { return(Net.Vpc.Upa.Expressions.Literal.NULL); }
public virtual Net.Vpc.Upa.Expressions.Expression EvalObject(Net.Vpc.Upa.Expressions.Expression e, Net.Vpc.Upa.QLEvaluator evaluator, object context) { Net.Vpc.Upa.Expressions.BinaryOperatorExpression eq = (Net.Vpc.Upa.Expressions.BinaryOperatorExpression)e; Net.Vpc.Upa.Expressions.Expression a0 = evaluator.EvalObject(eq.GetLeft(), context); Net.Vpc.Upa.Expressions.Expression b0 = evaluator.EvalObject(eq.GetRight(), context); object a = Net.Vpc.Upa.Impl.Util.UPAUtils.UnwrapLiteral(a0); object b = Net.Vpc.Upa.Impl.Util.UPAUtils.UnwrapLiteral(b0); if ((a is Net.Vpc.Upa.Expressions.Expression) || (b is Net.Vpc.Upa.Expressions.Expression)) { //could not simplify // if(!(a instanceof Expression)){ // a=new Literal(a,null); // } // if(!(b instanceof Expression)){ // b=new Literal(a,null); // } return(Net.Vpc.Upa.Impl.Uql.Util.UQLUtils.CreateBinaryExpr(eq.GetOperator(), a0, b0)); } switch (eq.GetOperator()) { case Net.Vpc.Upa.Expressions.BinaryOperator.AND: { if ((!(((bool?)a)).Value).Value) { return(Net.Vpc.Upa.Expressions.Literal.FALSE); } return(((bool?)b) ? Net.Vpc.Upa.Expressions.Literal.TRUE : Net.Vpc.Upa.Expressions.Literal.FALSE); } case Net.Vpc.Upa.Expressions.BinaryOperator.OR: { if ((((bool?)a)).Value) { return(Net.Vpc.Upa.Expressions.Literal.TRUE); } return(((bool?)b) ? Net.Vpc.Upa.Expressions.Literal.TRUE : Net.Vpc.Upa.Expressions.Literal.FALSE); } case Net.Vpc.Upa.Expressions.BinaryOperator.EQ: { return((Net.Vpc.Upa.Impl.Util.UPAUtils.Equals(a, b) || Net.Vpc.Upa.Impl.Util.UPAUtils.Equals(a == null ? "" : a.ToString(), b == null ? "" : b.ToString())) ? Net.Vpc.Upa.Expressions.Literal.TRUE : Net.Vpc.Upa.Expressions.Literal.FALSE); } case Net.Vpc.Upa.Expressions.BinaryOperator.DIFF: { return((!Net.Vpc.Upa.Impl.Util.UPAUtils.Equals(a, b) && !Net.Vpc.Upa.Impl.Util.UPAUtils.Equals(a == null ? "" : a.ToString(), b == null ? "" : b.ToString())) ? Net.Vpc.Upa.Expressions.Literal.TRUE : Net.Vpc.Upa.Expressions.Literal.FALSE); } case Net.Vpc.Upa.Expressions.BinaryOperator.GE: { Net.Vpc.Upa.Impl.Util.XNumber na = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumberOrError(a); Net.Vpc.Upa.Impl.Util.XNumber nb = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumberOrError(b); return((Net.Vpc.Upa.Impl.Util.XNumber.Compare(na, nb) >= 0) ? Net.Vpc.Upa.Expressions.Literal.TRUE : Net.Vpc.Upa.Expressions.Literal.FALSE); } case Net.Vpc.Upa.Expressions.BinaryOperator.GT: { Net.Vpc.Upa.Impl.Util.XNumber na = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumberOrError(a); Net.Vpc.Upa.Impl.Util.XNumber nb = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumberOrError(b); return((Net.Vpc.Upa.Impl.Util.XNumber.Compare(na, nb) > 0) ? Net.Vpc.Upa.Expressions.Literal.TRUE : Net.Vpc.Upa.Expressions.Literal.FALSE); } case Net.Vpc.Upa.Expressions.BinaryOperator.LE: { Net.Vpc.Upa.Impl.Util.XNumber na = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumberOrError(a); Net.Vpc.Upa.Impl.Util.XNumber nb = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumberOrError(b); return((Net.Vpc.Upa.Impl.Util.XNumber.Compare(na, nb) <= 0) ? Net.Vpc.Upa.Expressions.Literal.TRUE : Net.Vpc.Upa.Expressions.Literal.FALSE); } case Net.Vpc.Upa.Expressions.BinaryOperator.LT: { Net.Vpc.Upa.Impl.Util.XNumber na = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumberOrError(a); Net.Vpc.Upa.Impl.Util.XNumber nb = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumberOrError(b); return((Net.Vpc.Upa.Impl.Util.XNumber.Compare(na, nb) < 0) ? Net.Vpc.Upa.Expressions.Literal.TRUE : Net.Vpc.Upa.Expressions.Literal.FALSE); } case Net.Vpc.Upa.Expressions.BinaryOperator.PLUS: { if (a is string || b is string) { return(new Net.Vpc.Upa.Expressions.Literal(FormatResult(a) + FormatResult(b))); } Net.Vpc.Upa.Impl.Util.XNumber na = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumberOrError(a); Net.Vpc.Upa.Impl.Util.XNumber nb = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumberOrError(b); if (na == null) { return(new Net.Vpc.Upa.Expressions.Literal(nb, null)); } if (nb == null) { return(new Net.Vpc.Upa.Expressions.Literal(na, null)); } return(new Net.Vpc.Upa.Expressions.Literal(na.Add(nb).ToNumber(), null)); } case Net.Vpc.Upa.Expressions.BinaryOperator.MINUS: { Net.Vpc.Upa.Impl.Util.XNumber na = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumberOrError(a); Net.Vpc.Upa.Impl.Util.XNumber nb = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumberOrError(b); if (na == null) { return(new Net.Vpc.Upa.Expressions.Literal(nb.Negate(), null)); } if (nb == null) { return(new Net.Vpc.Upa.Expressions.Literal(na, null)); } return(new Net.Vpc.Upa.Expressions.Literal(na.Subtract(nb).ToNumber(), null)); } case Net.Vpc.Upa.Expressions.BinaryOperator.DIV: { Net.Vpc.Upa.Impl.Util.XNumber na = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumberOrError(a); Net.Vpc.Upa.Impl.Util.XNumber nb = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumberOrError(b); if (na == null) { return(Net.Vpc.Upa.Expressions.Literal.ZERO); } if (nb == null) { return(new Net.Vpc.Upa.Expressions.Literal(System.Double.NaN)); } return(new Net.Vpc.Upa.Expressions.Literal(na.Divide(nb).ToNumber(), null)); } case Net.Vpc.Upa.Expressions.BinaryOperator.MUL: { Net.Vpc.Upa.Impl.Util.XNumber na = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumberOrError(a); Net.Vpc.Upa.Impl.Util.XNumber nb = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumberOrError(b); if (na == null) { return(Net.Vpc.Upa.Expressions.Literal.ZERO); } if (nb == null) { return(Net.Vpc.Upa.Expressions.Literal.ZERO); } return(new Net.Vpc.Upa.Expressions.Literal(na.Multiply(nb).ToNumber(), null)); } case Net.Vpc.Upa.Expressions.BinaryOperator.LIKE: { if (a == null) { a = ""; } if (b == null) { b = ""; } a = FormatResult(a); b = FormatResult(b); string val = (string)a; string pattern = ((string)b).Replace('%', '*'); return(Net.Vpc.Upa.Impl.Util.StringUtils.MatchesSimpleExpression(val, pattern, Net.Vpc.Upa.Impl.Util.PatternType.ANY) ? Net.Vpc.Upa.Expressions.Literal.TRUE : Net.Vpc.Upa.Expressions.Literal.FALSE); } } //TODO other binary operators throw new System.ArgumentException("Not supported"); }
public Net.Vpc.Upa.Expressions.Expression EvalObject(Net.Vpc.Upa.Expressions.Expression e, Net.Vpc.Upa.QLEvaluator evaluator, object context) { Net.Vpc.Upa.Expressions.FunctionExpression f = (Net.Vpc.Upa.Expressions.FunctionExpression)e; Net.Vpc.Upa.Expressions.Expression[] arguments = f.GetArguments(); object[] oarguments = new object[arguments.Length]; bool evaluatable = true; for (int i = 0; i < arguments.Length; i++) { Net.Vpc.Upa.Expressions.Expression expr = evaluator.EvalObject(arguments[i], context); arguments[i] = expr; object oo = Net.Vpc.Upa.Impl.Util.UPAUtils.UnwrapLiteral(expr); if (oo is Net.Vpc.Upa.Expressions.Expression) { evaluatable = false; } else { oarguments[i] = oo; } } if (!evaluatable) { return(Net.Vpc.Upa.Impl.Uql.Parser.Syntax.FunctionFactory.CreateFunction(f.GetName(), new System.Collections.Generic.List <Net.Vpc.Upa.Expressions.Expression>(arguments))); } object v = this.evaluator.Eval(new Net.Vpc.Upa.EvalContext(f.GetName(), oarguments, null)); return(new Net.Vpc.Upa.Expressions.Literal(v, null)); }
public virtual Net.Vpc.Upa.Expressions.Expression EvalObject(Net.Vpc.Upa.Expressions.Expression e, Net.Vpc.Upa.QLEvaluator evaluator, object context) { Net.Vpc.Upa.Expressions.FunctionExpression fct = (Net.Vpc.Upa.Expressions.FunctionExpression)e; Net.Vpc.Upa.QLTypeEvaluator fe = Net.Vpc.Upa.Impl.FwkConvertUtils.GetMapValue <string, Net.Vpc.Upa.QLTypeEvaluator>(functionsEvaluators, fct.GetName().ToLower()); if (fe == null) { throw new System.Exception("function not found " + fct.GetName()); } return(fe.EvalObject(fct, evaluator, context)); }
public virtual Net.Vpc.Upa.Expressions.Expression EvalObject(Net.Vpc.Upa.Expressions.Expression e, Net.Vpc.Upa.QLEvaluator evaluator, object context) { Net.Vpc.Upa.Expressions.UnaryOperatorExpression eq = (Net.Vpc.Upa.Expressions.UnaryOperatorExpression)e; Net.Vpc.Upa.Expressions.Expression expr = evaluator.EvalObject(eq.GetExpression(), context); object a = Net.Vpc.Upa.Impl.Util.UPAUtils.UnwrapLiteral(expr); if (a is Net.Vpc.Upa.Expressions.Expression) { return(Net.Vpc.Upa.Impl.Uql.Util.UQLUtils.CreateUnaryExpr(eq.GetOperator(), expr)); } switch (eq.GetOperator()) { case Net.Vpc.Upa.Expressions.UnaryOperator.POSITIVE: { return(expr); } case Net.Vpc.Upa.Expressions.UnaryOperator.NEGATIVE: { Net.Vpc.Upa.Impl.Util.XNumber na = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumberOrError(a); if (na == null) { return(Net.Vpc.Upa.Expressions.Literal.NULL); } return(new Net.Vpc.Upa.Expressions.Literal(na.Negate().ToNumber(), null)); } case Net.Vpc.Upa.Expressions.UnaryOperator.COMPLEMENT: { Net.Vpc.Upa.Impl.Util.XNumber na = Net.Vpc.Upa.Impl.Util.UPAUtils.ToNumber(a); if (na == null) { return(Net.Vpc.Upa.Expressions.Literal.NULL); } return(new Net.Vpc.Upa.Expressions.Literal(na.Complement().ToNumber(), null)); } case Net.Vpc.Upa.Expressions.UnaryOperator.NOT: { if (a is bool?) { return(Net.Vpc.Upa.Expressions.Literal.ValueOf((!(((bool?)a)).Value).Value)); } if (a is object) { return(Net.Vpc.Upa.Expressions.Literal.ValueOf(System.Convert.ToDouble(((object)a)) == 0)); } if (a is string) { return(Net.Vpc.Upa.Expressions.Literal.ValueOf(!((string)a).Equals("true", System.StringComparison.InvariantCultureIgnoreCase))); } return(Net.Vpc.Upa.Expressions.Literal.ValueOf(a == null)); } } throw new System.ArgumentException("Not supported"); }