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); }
public void TestNullParsing() { var rpn = new Rpn("null"); var eval = new EvaluateRpn(rpn); var value = eval.Eval(); Assert.AreEqual(null, value.String); }
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); }
public void TestStringAddition() { var rpn = new Rpn("\"3\"+\"3\""); var eval = new EvaluateRpn(rpn); var value = eval.Eval(); Assert.AreEqual("33", value.String); }
public void TestDivision() { var rpn = new Rpn("3+4/2"); var eval = new EvaluateRpn(rpn); var value = eval.Eval(); Assert.AreEqual(5, value.Numeric); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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)) }); }