コード例 #1
0
        public DynamicFormulaMeasure(string formula, IPivotData pvtData)
        {
            Parser  = new LambdaParser();
            Formula = formula;
            var formulaExpr   = Parser.Parse(formula);
            var formulaParams = LambdaParser.GetExpressionParameters(formulaExpr);

            var paramMeasureIndexes = new List <int>();
            var paramMeasureNames   = new List <string>();

            foreach (var fParam in formulaParams)
            {
                if (paramMeasureNames.Contains(fParam.Name))
                {
                    continue;                     // avoid duplicates
                }
                var paramMsrIdx = ResolveAggregatorIndex(fParam.Name, pvtData);
                if (paramMsrIdx >= 0)
                {
                    paramMeasureIndexes.Add(paramMsrIdx);
                    paramMeasureNames.Add(fParam.Name);
                }
            }

            ArgMeasureIndexes = paramMeasureIndexes.ToArray();
            ParamNameToArgIdx = new Dictionary <string, int>();
            for (int i = 0; i < paramMeasureNames.Count; i++)
            {
                ParamNameToArgIdx[paramMeasureNames[i]] = i;
            }
        }
コード例 #2
0
        public void NullComparison()
        {
            var varContext   = getContext();
            var lambdaParser = new LambdaParser();

            Assert.True((bool)lambdaParser.Eval("null == nullVar", varContext));
            Assert.True((bool)lambdaParser.Eval("5>nullVar", varContext));
            Assert.True((bool)lambdaParser.Eval("testObj!=null", varContext));
            Assert.Equal(0, LambdaParser.GetExpressionParameters(lambdaParser.Parse("20 == null")).Length);

            lambdaParser = new LambdaParser(new ValueComparer()
            {
                NullComparison = ValueComparer.NullComparisonMode.Sql
            });
            Assert.False((bool)lambdaParser.Eval("null == nullVar", varContext));
            Assert.False((bool)lambdaParser.Eval("nullVar<5", varContext));
            Assert.False((bool)lambdaParser.Eval("nullVar>5", varContext));
        }
コード例 #3
0
        public void Eval()
        {
            var lambdaParser = new LambdaParser();

            var varContext = new Dictionary <string, object>();

            varContext["pi"]      = 3.14M;
            varContext["one"]     = 1M;
            varContext["two"]     = 2M;
            varContext["test"]    = "test";
            varContext["now"]     = DateTime.Now;
            varContext["testObj"] = new TestClass();
            varContext["arr1"]    = new double[] { 1.5, 2.5 };
            varContext["NOT"]     = (Func <bool, bool>)((t) => !t);
            varContext["Yes"]     = true;
            varContext["nullVar"] = null;
            varContext["name_with_underscore"]  = "a_b";
            varContext["_name_with_underscore"] = "_a_b";

            Assert.AreEqual("st", lambdaParser.Eval("test.Substring(2)", varContext));

            Assert.AreEqual(3, lambdaParser.Eval("1+2", varContext));
            Assert.AreEqual(6, lambdaParser.Eval("1+2+3", varContext));
            Assert.AreEqual("b{0}_", lambdaParser.Eval("\"b{0}_\"", varContext));

            Assert.AreEqual(3, lambdaParser.Eval("(1+(3-1)*4)/3", varContext));

            Assert.AreEqual(1, lambdaParser.Eval("one*5*one-(-1+5*5%10)", varContext));

            Assert.AreEqual("ab", lambdaParser.Eval("\"a\"+\"b\"", varContext));

            Assert.AreEqual(4.14, lambdaParser.Eval("pi + 1", varContext));

            Assert.AreEqual(5.14, lambdaParser.Eval("2 +pi", varContext));

            Assert.AreEqual(2.14, lambdaParser.Eval("pi + -one", varContext));

            Assert.AreEqual("test1", lambdaParser.Eval("test + \"1\"", varContext));

            Assert.AreEqual("a_b_a_b", lambdaParser.Eval(" name_with_underscore + _name_with_underscore ", varContext));

            Assert.AreEqual(1, lambdaParser.Eval("true or false ? 1 : 0", varContext));

            Assert.AreEqual(true, lambdaParser.Eval("5<=3 ? false : true", varContext));

            Assert.AreEqual(5, lambdaParser.Eval("pi>one && 0<one ? (1+8)/3+1*two : 0", varContext));

            Assert.AreEqual(4, lambdaParser.Eval("pi>0 ? one+two+one : 0", varContext));

            Assert.AreEqual(DateTime.Now.Year, lambdaParser.Eval("now.Year", varContext));

            Assert.AreEqual(true, lambdaParser.Eval(" (1+testObj.IntProp)==2 ? testObj.FldTrue : false ", varContext));

            Assert.AreEqual("ab2_3", lambdaParser.Eval(" \"a\"+testObj.Format(\"b{0}_{1}\", 2, \"3\".ToString() ).ToString() ", varContext));

            Assert.AreEqual(true, lambdaParser.Eval(" testObj.Hash[\"a\"] == \"1\"", varContext));

            Assert.AreEqual(true, lambdaParser.Eval(" (testObj.Hash[\"a\"]-1)==testObj.Hash[\"b\"].Length ", varContext));

            Assert.AreEqual(4.0, lambdaParser.Eval(" arr1[0]+arr1[1] ", varContext));

            Assert.AreEqual(2, lambdaParser.Eval(" (new[]{1,2})[1] ", varContext));

            Assert.AreEqual(true, lambdaParser.Eval(" new[]{ one } == new[] { 1 } ", varContext));

            Assert.AreEqual(3, lambdaParser.Eval(" new dictionary{ {\"a\", 1}, {\"b\", 2}, {\"c\", 3} }.Count ", varContext));

            Assert.AreEqual(2, lambdaParser.Eval(" new dictionary{ {\"a\", 1}, {\"b\", 2}, {\"c\", 3} }[\"b\"] ", varContext));

            var arr = ((Array)lambdaParser.Eval(" new []{ new dictionary{{\"test\",2}}, new[] { one } }", varContext));

            Assert.AreEqual(2, ((IDictionary)arr.GetValue(0))["test"]);
            Assert.AreEqual(1, ((Array)arr.GetValue(1)).GetValue(0));

            Assert.AreEqual("str", lambdaParser.Eval(" testObj.GetDelegNoParam()() ", varContext));
            Assert.AreEqual("zzz", lambdaParser.Eval(" testObj.GetDelegOneParam()(\"zzz\") ", varContext));

            Assert.AreEqual(false, lambdaParser.Eval("(testObj.FldTrue and false) || (testObj.FldTrue && false)", varContext));
            Assert.AreEqual(true, lambdaParser.Eval("false or testObj.FldTrue", varContext));
            Assert.AreEqual("True", lambdaParser.Eval("testObj.BoolParam(true)", varContext));

            Assert.IsTrue((bool)lambdaParser.Eval("true && NOT( false )", varContext));
            Assert.IsTrue((bool)lambdaParser.Eval("true && !( false )", varContext));
            Assert.IsFalse((bool)lambdaParser.Eval("!Yes", varContext));

            Assert.IsTrue((bool)lambdaParser.Eval("null == nullVar", varContext));
            Assert.IsTrue((bool)lambdaParser.Eval("5>nullVar", varContext));
            Assert.IsTrue((bool)lambdaParser.Eval("testObj!=null", varContext));
            Assert.AreEqual(0, LambdaParser.GetExpressionParameters(lambdaParser.Parse("20 == null")).Length);

            lambdaParser = new LambdaParser(new ValueComparer()
            {
                NullComparison = ValueComparer.NullComparisonMode.Sql
            });
            Assert.IsFalse((bool)lambdaParser.Eval("null == nullVar", varContext));
            Assert.IsFalse((bool)lambdaParser.Eval("nullVar<5", varContext));
            Assert.IsFalse((bool)lambdaParser.Eval("nullVar>5", varContext));
        }