Example #1
0
        protected override object EvaluateOperation(object left, object right)
        {
            if (left == null)
            {
                return(right);
            }

            if (right == null)
            {
                return(left);
            }

            if ((left is string) ||
                (right is string))
            {
                return(left.ToString() + right);
            }

            if (left is DateTime && right is int)
            {
                return(((DateTime)left).AddDays((int)right));
            }

            if (left is DateTime && right is TimeSpan)
            {
                return(((DateTime)left).Add((TimeSpan)right));
            }

            var nLeft  = TypeNormalizer.EnsureType <double>(left);
            var nRight = TypeNormalizer.EnsureType <double>(right);

            return(nLeft + nRight);
        }
        public static object Sum(ScriptThread thread, AstNode[] childNodes)
        {
            double sum       = 0;
            var    fieldName = childNodes[0].Evaluate(thread).ToString();

            var dataSource = thread.GetDataSource();

            var grouped = ImportAggregateHelper.IsGrouped(dataSource);

            if (grouped != null)
            {
                foreach (var element in grouped)
                {
                    var s = element.Sum(o => {
                        var v = ReadValueFromObject(fieldName, o);
                        return(TypeNormalizer.EnsureType <double>(v));
                    });
                    sum = sum + s;
                }
            }
            else
            {
                if (ImportAggregateHelper.FieldExist(dataSource.FirstOrDefault(), fieldName))
                {
                    sum = dataSource.Sum(o => {
                        var v = ReadValueFromObject(fieldName, o);
                        return(TypeNormalizer.EnsureType <double>(v));
                    });
                }
            }
            return(sum.ToString());
        }
Example #3
0
        static double TimeSpanSum(string fromField, object current)
        {
            var value    = ReadValueFromObject(fromField, current);
            var timeSpan = (TimeSpan)value;

            return(TypeNormalizer.EnsureType <double>(timeSpan.Ticks));
        }
Example #4
0
        protected override void AggregateValue(object value, AggregationState aggregationState, params object[] args)
        {
            var sum     = aggregationState.GetValue <double>("value");
            var nextVal = TypeNormalizer.EnsureType <double>(value);

            aggregationState["value"] = sum + nextVal;
        }
        protected sealed override double EvaluateOperation(object left, object right)
        {
            var dLeft  = TypeNormalizer.EnsureType <double>(left);
            var dRight = TypeNormalizer.EnsureType <double>(right);

            return(EvaluateOperation(dLeft, dRight));
        }
        protected sealed override bool EvaluateOperation(object left, object right)
        {
            var bLeft  = TypeNormalizer.EnsureType <bool>(left);
            var bRight = TypeNormalizer.EnsureType <bool>(right);

            return(EvaluateOperation(bLeft, bRight));
        }
Example #7
0
 protected override void AggregateValue(object value, AggregationState aggregationState, object[] args)
 {
     var val = TypeNormalizer.EnsureType<bool>(value);
     aggregationState["value"] = val;
     if (val == false)
         aggregationState.CanReturn = true;
 }
Example #8
0
 protected override void AggregateValue(object value, AggregationState aggregationState, params object[] args)
 {
     bool val = TypeNormalizer.EnsureType<bool>(value);
     if (val)
     {
         var count = aggregationState.GetValue<int>("count");
         aggregationState["count"] = count + 1;
     }
 }
Example #9
0
        protected override void AggregateValue(object value, AggregationState aggregationState, params object[] args)
        {
            var index = TypeNormalizer.EnsureType <int>(value);

            if (index == aggregationState.CurrentIndex)
            {
                aggregationState["found"]  = true;
                aggregationState.CanReturn = true;
            }
        }
        protected sealed override T EvaluateFunction(object[] args)
        {
            var left  = args[0];
            var right = args[1];

            if (AutoNormalizeArguments)
            {
                TypeNormalizer.NormalizeTypes(ref left, ref right);
            }

            return(EvaluateOperation(left, right));
        }
Example #11
0
        protected override void AggregateValue(object value, AggregationState aggregationState, object[] args)
        {
            if (!aggregationState.ContainsKey("results"))
            {
                aggregationState["results"] = new List <object>();
            }

            var pass = TypeNormalizer.EnsureType <bool>(value);

            if (pass && aggregationState.DataItem != null)
            {
                aggregationState.GetValue <List <object> >("results").Add(aggregationState.DataItem);
            }
        }
Example #12
0
        protected override object EvaluateFunction(object[] args)
        {
            var bCondition = TypeNormalizer.EnsureType <bool>(args[0]);

            if (bCondition)
            {
                return(args[1]);
            }

            if (args.Length > 2)
            {
                return(args[2]);
            }

            return(null);
        }
Example #13
0
        protected override void AggregateValue(object value, AggregationState aggregationState, params object[] args)
        {
            var val = TypeNormalizer.EnsureType <double>(value);

            if (!aggregationState.ContainsKey("value"))
            {
                aggregationState["value"] = val;
            }
            else
            {
                var min = aggregationState.GetValue <double>("value");

                if (val < min)
                {
                    min = val;
                }

                aggregationState["value"] = min;
            }
        }
Example #14
0
        protected override TimeSpan EvaluateFunction(object[] args)
        {
            args[0] = args[0] == null ? DateTime.Today : TypeNormalizer.EnsureType(args[0], typeof(DateTime));

            args[1] = args[1] == null ? DateTime.Today : TypeNormalizer.EnsureType(args[1], typeof(DateTime));

            var endDate = (DateTime)args[0];

            if (endDate == DateTime.MinValue)
            {
                endDate = DateTime.Today;
            }
            var startDate = (DateTime)args[1];

            if (startDate == DateTime.MinValue)
            {
                startDate = DateTime.Today;
            }

            return(endDate.Subtract(startDate));
        }
Example #15
0
        protected override DateTime EvaluateFunction(object[] args)
        {
            args[0] = args[0] == null ? DateTime.Today : TypeNormalizer.EnsureType(args[0], typeof(DateTime));

            args[1] = args[1].ToString().ToUpper();
            args[2] = TypeNormalizer.EnsureType(args[2], typeof(Int32));

            var startDate = (DateTime)args[0];

            if (startDate == DateTime.MinValue)
            {
                startDate = DateTime.Today;
            }

            string code = args[1].ToString();

            ValidatePeriodCode(code);

            var distance = (int)args[2];

            switch (code)
            {
            case "D":
                return(startDate.AddDays(distance));

            case "W":
                return(startDate.AddDays(distance * 7));

            case "M":
                return(startDate.AddMonths(distance));

            case "Y":
                return(startDate.AddYears(distance));

            default:
                return(startDate.AddDays(distance));
            }
        }
Example #16
0
        protected virtual IExpression CompileExpressionNode(IExpressionNodeFactory factory, ParseNode astNode)
        {
            switch (astNode.Token.Type)
            {
            case TokenType.Atom:
                if (astNode.Nodes[0].Token.Type == TokenType.BROPEN)
                {
                    return(CompileExpressionNode(factory, astNode.Nodes[1]));
                }
                return(CompileExpressionNode(factory, astNode.Nodes[0]));

            case TokenType.NUMBER:
            case TokenType.INTEGER:
                var num = TypeNormalizer.EnsureType <double>(astNode.Token.Text);
                return(factory.CreateLiteral(num));

            case TokenType.STRING:
                var str = TypeNormalizer.EnsureType <string>(astNode.Token.Text.Replace("\"", String.Empty));
                return(factory.CreateLiteral(str));

            case TokenType.TRUE:
            case TokenType.FALSE:
                var bln = TypeNormalizer.EnsureType <bool>(astNode.Token.Text);
                return(factory.CreateLiteral(bln));

            case TokenType.NULL:
                return(null);

            case TokenType.BooleanExpr:
            case TokenType.CompareExpr:
            case TokenType.AddExpr:
            case TokenType.MultExpr:
            case TokenType.PowerExpr:
                return(CompileBinaryOperator(factory, astNode));

            case TokenType.QualifiedName:
                return(CompileQualifiedName(factory, null, Select(astNode.Nodes, TokenType.Identifier), 0));

            case TokenType.Conditional:
                var         pieces    = Select(astNode.Nodes, TokenType.BooleanExpr);
                IExpression condition = CompileExpressionNode(factory, pieces[0]);
                IExpression trueExpr  = CompileExpressionNode(factory, pieces[1]);
                IExpression falseExpr = (pieces.Count == 3) ? CompileExpressionNode(factory, pieces[2]) : null;
                var         func      = new IfThen();
                if (falseExpr != null)
                {
                    func.AcceptArguments(condition, trueExpr, falseExpr);
                }
                else
                {
                    func.AcceptArguments(condition, trueExpr);
                }
                return(func);

            case TokenType.UnaryExpr:
                string      token = astNode.Nodes[0].Token.Text;
                IExpression left  = CompileBinaryOperator(factory, astNode.Nodes[1]);
                return(factory.CreateUnaryOperator(token, left));
            }
            return(null);
        }
Example #17
0
        protected virtual IExpression CompileExpressionNode(IExpressionNodeFactory factory, ParseTreeNode astNode)
        {
            switch (astNode.Term.Name)
            {
            case "Number":
                var num = TypeNormalizer.EnsureType <double>(astNode.Token.Value);
                return(factory.CreateLiteral(num));

            case "String":
                var str = TypeNormalizer.EnsureType <string>(astNode.Token.Value);
                return(factory.CreateLiteral(str));

            case "Boolean":
                var bln = TypeNormalizer.EnsureType <bool>(astNode.Token.Value);
                return(factory.CreateLiteral(bln));

            case "Identifier":
                var variable = astNode.Token.Value;
                if (variable != null)
                {
                    return(factory.CreateVariable(variable.ToString()));
                }
                break;

            case "Expr":
                if (astNode.ChildNodes.Count == 3 &&
                    astNode.ChildNodes[1].Term is SymbolTerminal)
                {
                    IExpression left  = CompileExpressionNode(factory, astNode.ChildNodes[0]);
                    IExpression right = CompileExpressionNode(factory, astNode.ChildNodes[2]);
                    return(factory.CreateBinaryOperator(astNode.ChildNodes[1].Term.Name, left, right));
                }
                if (astNode.ChildNodes.Count == 2 &&
                    astNode.ChildNodes[0].Term is SymbolTerminal)
                {
                    IExpression arg = CompileExpressionNode(factory, astNode.ChildNodes[1]);
                    return(factory.CreateUnaryOperator(astNode.ChildNodes[0].Term.Name, arg));
                }
                if (astNode.ChildNodes.Count == 2 &&
                    astNode.ChildNodes[1].Term is SymbolTerminal)
                {
                    IExpression arg = CompileExpressionNode(factory, astNode.ChildNodes[0]);
                    return(factory.CreateUnaryOperator(astNode.ChildNodes[1].Term.Name, arg));
                }
                break;

            case "QualifiedName":
                var parts = new List <string>();

                if (astNode.ChildNodes.Count == 2)
                {
                    return(new QualifiedName(new[] { astNode.ChildNodes[1].Token.ValueString }));
                }

                //Condition ought to be impossible
                if (astNode.ChildNodes.Count != 3)
                {
                    throw new Exception("Malformed QualifiedName - should have 3 child nodes");
                }

                ExtractQualifiedName(astNode, parts);
                return(new QualifiedName(parts.ToArray()));

            case "FunctionExpression":
                string functionName = (astNode.ChildNodes[0].Token.ValueString);
                var    args         = new IExpression[astNode.ChildNodes[1].ChildNodes.Count];
                for (int i = 0; i < astNode.ChildNodes[1].ChildNodes.Count; i++)
                {
                    args[i] = CompileExpressionNode(factory, astNode.ChildNodes[1].ChildNodes[i]);
                }

                return(factory.CreateFunction(functionName, args));

            case "IfThen":
                IExpression condition = CompileExpressionNode(factory, astNode.ChildNodes[1]);
                IExpression trueExpr  = CompileExpressionNode(factory, astNode.ChildNodes[3]);
                IExpression falseExpr = null;
                if (astNode.ChildNodes.Count == 6)
                {
                    falseExpr = CompileExpressionNode(factory, astNode.ChildNodes[5]);
                }
                var func = new IfThen();
                if (falseExpr != null)
                {
                    func.AcceptArguments(condition, trueExpr, falseExpr);
                }
                else
                {
                    func.AcceptArguments(condition, trueExpr);
                }
                return(func);

            case "ArrayExpression":
                IExpression context = CompileExpressionNode(factory, astNode.ChildNodes[0]);
                IExpression index   = CompileExpressionNode(factory, astNode.ChildNodes[1]);
                var         indexer = new ItemAtIndex();
                indexer.AcceptArguments(context, index);
                return(indexer);
            }
            return(null);
        }
Example #18
0
        protected override bool EvaluateOperation(object arg)
        {
            var val = TypeNormalizer.EnsureType <bool>(arg);

            return(!val);
        }
Example #19
0
        // don't call base
        protected override IExpression CompileExpressionNode(IExpressionNodeFactory factory, ParseTreeNode astNode)
        {
            switch (astNode.Term.Name)
            {
            case "Number":
                var num = TypeNormalizer.EnsureType <double>(astNode.Token.Value);
                return(factory.CreateLiteral(num));

            case "String":
                var str = TypeNormalizer.EnsureType <string>(astNode.Token.Value);
                return(factory.CreateLiteral(str));

            case "Boolean":
                var bln = TypeNormalizer.EnsureType <bool>(astNode.Token.Value);
                return(factory.CreateLiteral(bln));

            case "Identifier":
                var variable = astNode.Token.Value;
                if (variable != null)
                {
                    return(factory.CreateVariable(variable.ToString()));
                }
                break;

            case "Symbol":
                var str_1 = TypeNormalizer.EnsureType <string>(astNode.Token.Value);
                return(factory.CreateLiteral(str_1));

            case "UserSectionStmt":
                return(factory.CreateFunction(astNode.ChildNodes[2].Token.Text, null));

            case "GlobalSectionStmt":
                return(factory.CreateLiteral(this.SinglePage.EvaluatePropertyPath(astNode.ChildNodes[2].Token.Text)));

            case "ParameterSectionStmt":
                return(CompileExpressionNode(factory, astNode.ChildNodes[2]));

            case "FieldsSectionStmt":
                //return CompileExpressionNode (factory,astNode.ChildNodes[2]);
                IExpression l = CompileExpressionNode(factory, astNode.ChildNodes[2]);
                return(factory.CreateFunction(astNode.ChildNodes[0].Token.Text,
                                              l));

            case "ParExpr":
                return(CompileExpressionNode(factory, astNode.ChildNodes[0]));

            case "BinExpr":
                if (astNode.ChildNodes.Count == 3 &&
                    astNode.ChildNodes[1].Term is SymbolTerminal)
                {
                    IExpression left  = CompileExpressionNode(factory, astNode.ChildNodes[0]);
                    IExpression right = CompileExpressionNode(factory, astNode.ChildNodes[2]);
                    return(factory.CreateBinaryOperator(astNode.ChildNodes[1].Term.Name, left, right));
                }
                if (astNode.ChildNodes.Count == 2 &&
                    astNode.ChildNodes[0].Term is SymbolTerminal)
                {
                    IExpression arg = CompileExpressionNode(factory, astNode.ChildNodes[1]);
                    return(factory.CreateUnaryOperator(astNode.ChildNodes[0].Term.Name, arg));
                }
                if (astNode.ChildNodes.Count == 2 &&
                    astNode.ChildNodes[1].Term is SymbolTerminal)
                {
                    IExpression arg = CompileExpressionNode(factory, astNode.ChildNodes[0]);
                    return(factory.CreateUnaryOperator(astNode.ChildNodes[1].Term.Name, arg));
                }
                break;

            case "QualifiedName":
                var parts = new List <string>();

                if (astNode.ChildNodes.Count == 2)
                {
                    return(new QualifiedName(new[] { astNode.ChildNodes[1].Token.ValueString }));
                }

                /*
                 *  //Condition ought to be impossible
                 *  if (astNode.ChildNodes.Count != 3 )
                 * throw new Exception("Malformed QualifiedName - should have 3 child nodes");
                 */
                if (astNode.ChildNodes.Count == 1)
                {
                    return(CompileExpressionNode(factory, astNode.ChildNodes[0]));
                }
                SimpleExpressionLanguageCompiler.ExtractQualifiedName(astNode, parts);

                return(new QualifiedName(parts.ToArray()));

            case "FunctionExpression":
                IExpression [] args         = null;
                string         functionName = (astNode.ChildNodes[0].ChildNodes[0].Token.ValueString);
                if (astNode.ChildNodes.Count == 1)
                {
                    args = new IExpression[astNode.ChildNodes[0].ChildNodes[0].ChildNodes.Count];
                }
                else
                {
                    args = new IExpression[astNode.ChildNodes[1].ChildNodes.Count];
                    for (int i = 0; i < astNode.ChildNodes[1].ChildNodes.Count; i++)
                    {
                        args[i] = CompileExpressionNode(factory, astNode.ChildNodes[1].ChildNodes[i]);
                    }
                }
                return(factory.CreateFunction(functionName, args));


            case "IfThen":
                IExpression condition = CompileExpressionNode(factory, astNode.ChildNodes[1].ChildNodes[0]);
                IExpression trueExpr  = CompileExpressionNode(factory, astNode.ChildNodes[3]);
//					IExpression falseExpr = CompileExpressionNode(factory, astNode.ChildNodes[3]);
                IExpression falseExpr = null;
                if (astNode.ChildNodes.Count == 6)
                {
                    falseExpr = CompileExpressionNode(factory, astNode.ChildNodes[5]);
                }
                var func = new IfThen();
                if (falseExpr != null)
                {
                    func.AcceptArguments(condition, trueExpr, falseExpr);
                }
                else
                {
                    func.AcceptArguments(condition, trueExpr);
                }
                return(func);

                /*
                 * case "ArrayExpression":
                 *  IExpression context = CompileExpressionNode(factory, astNode.ChildNodes[0]);
                 *  IExpression index = CompileExpressionNode(factory, astNode.ChildNodes[1]);
                 *  var indexer = new ItemAtIndex();
                 *  indexer.AcceptArguments(context, index);
                 *  return indexer;
                 *
                 */
            }
            return(null);
        }
Example #20
0
        protected override double EvaluateOperation(object arg)
        {
            var val = TypeNormalizer.EnsureType <double>(arg);

            return(val * -1);
        }
Example #21
0
 public override T Evaluate(IExpressionContext context)
 {
     return(TypeNormalizer.EnsureType <T>(Root.Evaluate(context)));
 }
Example #22
0
        static double SimpleSum(string fromField, object current)
        {
            var value = ReadValueFromObject(fromField, current);

            return(TypeNormalizer.EnsureType <double>(value));
        }