Added support for unlimited inputs (#76)

* Added support for unlimited inputs
pull/77/head v3.0.0-preview.3
Abbas Cyclewala 2020-12-11 14:48:52 +05:30 committed by GitHub
parent fc77d65d68
commit b39591eac1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 48 additions and 7 deletions

View File

@ -7,6 +7,7 @@
<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.12.1" />
<!--<PackageReference Include="RulesEngine" Version="3.0.0-preview.2" />-->
</ItemGroup>
<ItemGroup>

View File

@ -36,16 +36,18 @@ namespace RulesEngine.ExpressionBuilders
}
private Expression<Func<object[],T>> WrapExpression<T>(Expression expression, ParameterExpression[] parameters){
private Expression<Func<object[],T>> WrapExpression<T>(LambdaExpression expression, ParameterExpression[] parameters){
var argExp = Expression.Parameter(typeof(object[]),"args");
var paramExps = parameters.Select((c,i) => {
var arg = Expression.ArrayAccess(argExp,Expression.Constant(i));
return Expression.Convert(arg,c.Type);
IEnumerable<Expression> paramExps = parameters.Select((c, i) => {
var arg = Expression.ArrayAccess(argExp, Expression.Constant(i));
return (Expression)Expression.Assign(c, Expression.Convert(arg, c.Type));
});
var invokeExp = Expression.Invoke(expression,paramExps);
return Expression.Lambda<Func<object[],T>>(invokeExp, argExp);
var blockExpSteps = paramExps.Concat(new List<Expression> { expression.Body });
var blockExp = Expression.Block(parameters, blockExpSteps);
return Expression.Lambda<Func<object[],T>>(blockExp, argExp);
}
public T Evaluate<T>(string expression, RuleParameter[] ruleParams)
{
var func = Compile<T>(expression, ruleParams);

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<Version>3.0.0-preview.2</Version>
<Version>3.0.0-preview.3</Version>
<Copyright>Copyright (c) Microsoft Corporation.</Copyright>
<PackageLicenseFile>LICENSE</PackageLicenseFile>
<PackageProjectUrl>https://github.com/microsoft/RulesEngine</PackageProjectUrl>

View File

@ -62,6 +62,44 @@ namespace RulesEngine.UnitTest
Assert.Contains(result,c => c.IsSuccess);
}
[Theory]
[InlineData("rules2.json")]
public async Task ExecuteRule_ManyInputs_ReturnsListOfRuleResultTree(string ruleFileName)
{
var re = GetRulesEngine(ruleFileName);
dynamic input1 = GetInput1();
dynamic input2 = GetInput2();
dynamic input3 = GetInput3();
dynamic input4 = GetInput1();
dynamic input5 = GetInput2();
dynamic input6 = GetInput3();
dynamic input7 = GetInput1();
dynamic input8 = GetInput2();
dynamic input9 = GetInput3();
dynamic input10 = GetInput1();
dynamic input11 = GetInput2();
dynamic input12 = GetInput3();
dynamic input13 = GetInput1();
dynamic input14 = GetInput2();
dynamic input15 = GetInput3();
dynamic input16 = GetInput1();
dynamic input17 = GetInput2();
dynamic input18 = GetInput3();
List<RuleResultTree> result = await re.ExecuteAllRulesAsync("inputWorkflow", input1, input2, input3,input4, input5, input6, input7, input8, input9, input10, input11, input12, input13, input14, input15, input16, input17, input18);
Assert.NotNull(result);
Assert.IsType<List<RuleResultTree>>(result);
Assert.Contains(result, c => c.IsSuccess);
}
[Theory]
[InlineData("rules2.json")]
public async Task ExecuteRule_CalledMultipleTimes_ReturnsSameResult(string ruleFileName)