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);
        }
Exemple #2
0
 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);
 }
Exemple #3
0
        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");
        }
Exemple #4
0
        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));
        }
Exemple #5
0
 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");
        }