Esempio n. 1
0
        public WhereClause(
            string formula,
            List <Entity> fields,
            Entity[] fieldsThenNonAggregatedFormulas)
        {
            _formula = EntityFormula.CreateEvaluator(formula, fields);
            var usedIndexes = _formula.GetVariableIndexes();

            IsBasedOnAggregation = EntityFormula.IsEvaluatorBasedOnAggregation(usedIndexes, fields);
            if (IsBasedOnAggregation)
            {
                return;
            }

            var usedResultIndexes = usedIndexes.Where(_ => _ < fields.Count).Select(_ => fields[_].ResultSetIndex).ToList();

            UsedEntities   = new List <Entity>();
            UnusedEntities = fieldsThenNonAggregatedFormulas.ToList();
            foreach (var ri in usedResultIndexes)
            {
                use(UnusedEntities.Single(_ => _.ResultSetIndex == ri));
            }

            foreach (var entity in UsedEntities.ToList())
            {
                foreach (var ri in entity.ReliesOnIndexes)
                {
                    use(fields.Single(_ => _.ResultSetIndex == ri));
                }
            }

            EntityClass.SortWithFormulasLast(UsedEntities);
            EntityClass.SortWithFormulasLast(UnusedEntities);
        }
        public void TestNotEqualOpStr()
        {
            var rpn   = new Rpn("''hej'!='då'");
            var eval  = new EvaluateRpn(rpn);
            var value = eval.Eval();

            Assert.AreEqual(1, value.Numeric);
        }
        public void TestNotEqualOp2()
        {
            var rpn   = new Rpn("85!=85");
            var eval  = new EvaluateRpn(rpn);
            var value = eval.Eval();

            Assert.AreEqual(0, value.Numeric);
        }
        public void TestFirstFunction()
        {
            var rpn   = new Rpn("(12)/(first(0?1,0?2,0?3,1?4,1?5))");
            var eval  = new EvaluateRpn(rpn);
            var value = eval.Eval();

            Assert.AreEqual(3, value.Numeric);
        }
        public void TestOrderEvaluation()
        {
            var rpn   = new Rpn("12/2/3");
            var eval  = new EvaluateRpn(rpn);
            var value = eval.Eval();

            Assert.AreEqual(2, value.Numeric);
        }
        public void TestBasicAddition()
        {
            var rpn   = new Rpn("3+4");
            var eval  = new EvaluateRpn(rpn);
            var value = eval.Eval();

            Assert.AreEqual(7, value.Numeric);
        }
        public void TestThatNullIsFalse()
        {
            var rpn   = new Rpn("null?1");
            var eval  = new EvaluateRpn(rpn);
            var value = eval.Eval();

            Assert.AreEqual(null, value.String);
        }
        public void TestSubtraction()
        {
            var rpn   = new Rpn("100-10-10-10");
            var eval  = new EvaluateRpn(rpn);
            var value = eval.Eval();

            Assert.AreEqual(70, value.Numeric);
        }
        public void TestEqLtParsing()
        {
            var rpn   = new Rpn("5<=2+3");
            var eval  = new EvaluateRpn(rpn);
            var value = eval.Eval();

            Assert.AreEqual(1, value.Numeric);
        }
Esempio n. 10
0
        public void TestNullParsing()
        {
            var rpn   = new Rpn("null");
            var eval  = new EvaluateRpn(rpn);
            var value = eval.Eval();

            Assert.AreEqual(null, value.String);
        }
Esempio n. 11
0
        public void TestDivision3()
        {
            var rpn   = new Rpn("1000/10*2/10");
            var eval  = new EvaluateRpn(rpn);
            var value = eval.Eval();

            Assert.AreEqual(20, value.Numeric);
        }
Esempio n. 12
0
        public void TestStringAddition()
        {
            var rpn   = new Rpn("\"3\"+\"3\"");
            var eval  = new EvaluateRpn(rpn);
            var value = eval.Eval();

            Assert.AreEqual("33", value.String);
        }
Esempio n. 13
0
        public void TestDivision()
        {
            var rpn   = new Rpn("3+4/2");
            var eval  = new EvaluateRpn(rpn);
            var value = eval.Eval();

            Assert.AreEqual(5, value.Numeric);
        }
Esempio n. 14
0
        public override void ParentInitialized(EntityClass parent, int index)
        {
            Evaluator = CreateEvaluator(Spec.formula, parent.Fields);
            FieldType = Evaluator.ResultingType is RpnItemOperandNumeric
                ? typeof(double)
                : typeof(string);
            var variableIndexes = Evaluator.GetVariableIndexes();

            ReliesOnIndexes.UnionWith(variableIndexes);
            _isBasedOnAggregation = IsEvaluatorBasedOnAggregation(variableIndexes, parent.Fields);
        }
Esempio n. 15
0
        public void CanWorkWithGuids()
        {
            var id  = Guid.NewGuid();
            var rpn = new Rpn($"id=='{id}'");

            var eval = new EvaluateRpn(rpn, new List <NameAndType> {
                new NameAndType("id", typeof(Guid))
            });
            var value = eval.Eval(new object[] { id });

            Assert.AreEqual(1, value.Numeric);
        }
Esempio n. 16
0
        public void TestNullCoalescing(string var1, string var2, string expected)
        {
            var rpn = new Rpn("var1??var2");

            Assert.AreEqual("var1 var2 ??", rpn.ToString());

            var eval = new EvaluateRpn(rpn, new List <NameAndType>
            {
                new NameAndType("var1", typeof(string)), new NameAndType("var2", typeof(string))
            });
            var value = eval.Eval(new object[] { var1, var2 });

            Assert.AreEqual(expected, value.String);
        }
Esempio n. 17
0
        public void TestThatNullabelsWorks1()
        {
            var rpn = new Rpn("var1??-1");

            Assert.AreEqual("var1 -1 ??", rpn.ToString());

            var eval = new EvaluateRpn(rpn, new List <NameAndType>
            {
                new NameAndType("var1", typeof(double))
            });
            var value = eval.Eval(new object[] { null });

            Assert.AreEqual(-1, value.Numeric);
        }
Esempio n. 18
0
        public void TestThatStringIsAutomaticallyConvertedToNumber()
        {
            var rpn = new Rpn("var1*2");

            Assert.AreEqual("var1 2 *", rpn.ToString());

            var eval = new EvaluateRpn(rpn, new List <NameAndType>
            {
                new NameAndType("var1", typeof(string))
            });
            var value = eval.Eval(new object[] { -1 });

            Assert.AreEqual(-2, value.Numeric);
        }
Esempio n. 19
0
        public void TestEquality(object var1, object var2, int expected)
        {
            var rpn = new Rpn("var1==var2");

            Assert.AreEqual("var1 var2 ==", rpn.ToString());

            var eval = new EvaluateRpn(rpn, new List <NameAndType>
            {
                new NameAndType("var1", typeof(string)), new NameAndType("var2", typeof(string))
            });
            var value = eval.Eval(new object[] { var1, var2 });

            Assert.AreEqual(expected, value.Numeric);
        }
Esempio n. 20
0
        public void TestEqualOp(double variableValue, double expected)
        {
            var rpn = new Rpn("Url==42");

            Assert.AreEqual("Url 42 ==", rpn.ToString());

            var eval = new EvaluateRpn(rpn, new List <NameAndType>
            {
                new NameAndType("Url", typeof(double))
            });
            var value = eval.Eval(new object[] { variableValue });

            Assert.AreEqual(expected, value.Numeric);
        }
Esempio n. 21
0
        public void TestVariables()
        {
            var rpn = new Rpn("3+(a+q)/(2+2)+3");

            Assert.AreEqual("3 a q + 2 2 + / + 3 +", rpn.ToString());
            var eval = new EvaluateRpn(rpn, new List <NameAndType>
            {
                new NameAndType("a", typeof(double)), new NameAndType("q", typeof(double))
            });
            var variables = new object[] { 3.0, 5.0 };
            var value     = eval.Eval(variables);

            Assert.AreEqual(8, value.Numeric);
        }
Esempio n. 22
0
        public void TestNotEqualOp2Str(string variableValue, double expected)
        {
            var rpn = new Rpn("Url!='www'");

            Assert.AreEqual("Url \"www\" !=", rpn.ToString());

            var eval = new EvaluateRpn(rpn, new List <NameAndType>
            {
                new NameAndType("Url", typeof(string))
            });
            var value = eval.Eval(new object[] { variableValue });

            Assert.AreEqual(expected, value.Numeric);
        }
        public void Test()
        {
            var rpn = new Rpn("3+(dbl+len(str))/7.0");

            Assert.AreEqual("3 dbl str len( + 7 / +", rpn.ToString());
            var eval = new EvaluateRpn(rpn, new List <NameAndType>
            {
                new NameAndType("dbl", typeof(double)), new NameAndType("str", typeof(string))
            });

            var rnd = new Random();

            Enumerable.Range(0, 10000).AsParallel().ForAll(_ =>
            {
                var vars     = new object[] { rnd.NextDouble() * 100, new string(' ', rnd.Next(10)) };
                var expected = 3 + ((double)vars[0] + ((string)vars[1]).Length) / 7.0;
                Assert.AreEqual(expected, eval.Eval(vars).Numeric);
            });
        }
 public EntityAggregation(entitySpec entitySpec, Action <string> log)
     : base(entitySpec)
 {
     if (string.IsNullOrEmpty(entitySpec.aggregationtype))
     {
         AggregationType = AggregationType.Sum;
     }
     else
     {
         AggregationType = (AggregationType)Enum.Parse(typeof(AggregationType), entitySpec.aggregationtype, true);
     }
     if (string.IsNullOrEmpty(entitySpec.formula))
     {
         return;
     }
     _evaluator = new EvaluateRpn(new Rpn(entitySpec.formula), new List <NameAndType>
     {
         new NameAndType("@", typeof(double))
     });
 }