updated wrapped code to static method call

abbasc52/optimize-rule-params
Abbas Cyclewala (from Dev Box) 2024-01-28 15:28:20 +05:30
parent 942cf31b88
commit 32fb4be391
4 changed files with 66 additions and 56 deletions

View File

@ -15,7 +15,7 @@ namespace RulesEngineBenchmark
public class REBenchmark
{
private readonly RulesEngine.RulesEngine rulesEngine;
private readonly object ruleInput;
private readonly List<Workflow> workflow;
private class ListItem
@ -41,7 +41,16 @@ namespace RulesEngineBenchmark
EnableScopedParams = false
});
ruleInput = new {
}
[Params(1000, 10000)]
public int N;
[Benchmark]
public void RuleExecutionDefault()
{
var ruleInput = new {
SimpleProp = "simpleProp",
NestedProp = new {
SimpleProp = "nestedSimpleProp",
@ -61,14 +70,6 @@ namespace RulesEngineBenchmark
}
};
}
[Params(1000, 10000)]
public int N;
[Benchmark]
public void RuleExecutionDefault()
{
foreach (var workflow in workflow)
{
_ = rulesEngine.ExecuteAllRulesAsync(workflow.WorkflowName, ruleInput).Result;

View File

@ -7,7 +7,7 @@
<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.12" />
<!--<PackageReference Include="RulesEngine" Version="3.0.2" />-->
<!--<PackageReference Include="RulesEngine" Version="5.0.3" />-->
</ItemGroup>
<ItemGroup>

View File

@ -17,34 +17,38 @@ namespace RulesEngine.HelperFunctions
{
internal static RuleFunc<RuleResultTree> ToResultTree(ReSettings reSettings, Rule rule, IEnumerable<RuleResultTree> childRuleResults, Func<object[], bool> isSuccessFunc, string exceptionMessage = "")
{
return (inputs) => {
var isSuccess = false;
var inputsDict = new Dictionary<string, object>();
try
{
inputsDict = inputs.ToDictionary(c => c.Name, c => c.Value);
isSuccess = isSuccessFunc(inputs.Select(c => c.Value).ToArray());
}
catch (Exception ex)
{
exceptionMessage = GetExceptionMessage($"Error while executing rule : {rule?.RuleName} - {ex.Message}", reSettings);
HandleRuleException(new RuleException(exceptionMessage,ex), rule, reSettings);
isSuccess = false;
}
return new RuleResultTree {
Rule = rule,
Inputs = inputsDict,
IsSuccess = isSuccess,
ChildResults = childRuleResults,
ExceptionMessage = exceptionMessage
};
return (inputs) => {
return ToResultTreeInternal(reSettings, rule, childRuleResults, isSuccessFunc, ref exceptionMessage, inputs);
};
}
}
private static RuleResultTree ToResultTreeInternal(ReSettings reSettings, Rule rule, IEnumerable<RuleResultTree> childRuleResults, Func<object[], bool> isSuccessFunc, ref string exceptionMessage, RuleParameter[] inputs)
{
var isSuccess = false;
var inputsDict = new Dictionary<string, object>();
try
{
inputsDict = inputs.ToDictionary(c => c.Name, c => c.Value);
isSuccess = isSuccessFunc(inputs.Select(c => c.Value).ToArray());
}
catch (Exception ex)
{
exceptionMessage = GetExceptionMessage($"Error while executing rule : {rule?.RuleName} - {ex.Message}", reSettings);
HandleRuleException(new RuleException(exceptionMessage, ex), rule, reSettings);
isSuccess = false;
}
return new RuleResultTree {
Rule = rule,
Inputs = inputsDict,
IsSuccess = isSuccess,
ChildResults = childRuleResults,
ExceptionMessage = exceptionMessage
};
}
internal static RuleFunc<RuleResultTree> ToRuleExceptionResult(ReSettings reSettings, Rule rule,Exception ex)
{
HandleRuleException(ex, rule, reSettings);

View File

@ -243,27 +243,32 @@ namespace RulesEngine
}
var paramDelegate = CompileScopedParams(rule.RuleExpressionType,ruleParameters, ruleExpParams);
return (ruleParams) => {
var inputs = ruleParams.Select(c => c.Value).ToArray();
IEnumerable<RuleParameter> scopedParams;
try
{
var scopedParamsDict = paramDelegate(inputs);
scopedParams = scopedParamsDict.Select(c => new RuleParameter(c.Key, c.Value));
}
catch(Exception ex)
{
var message = $"Error while executing scoped params for rule `{rule.RuleName}` - {ex}";
var resultFn = Helpers.ToRuleExceptionResult(_reSettings, rule, new RuleException(message, ex));
return resultFn(ruleParams);
}
var extendedInputs = ruleParams.Concat(scopedParams);
var result = ruleFunc(extendedInputs.ToArray());
return result;
return (ruleParams) => {
return GetWrappedRuleFuncInternal(rule, ruleFunc, ruleParams, paramDelegate);
};
}
}
private RuleResultTree GetWrappedRuleFuncInternal(Rule rule, RuleFunc<RuleResultTree> ruleFunc, RuleParameter[] ruleParams, Func<object[], Dictionary<string, object>> paramDelegate)
{
var inputs = ruleParams.Select(c => c.Value).ToArray();
IEnumerable<RuleParameter> scopedParams;
try
{
var scopedParamsDict = paramDelegate(inputs);
scopedParams = scopedParamsDict.Select(c => new RuleParameter(c.Key, c.Value));
}
catch (Exception ex)
{
var message = $"Error while executing scoped params for rule `{rule.RuleName}` - {ex}";
var resultFn = Helpers.ToRuleExceptionResult(_reSettings, rule, new RuleException(message, ex));
return resultFn(ruleParams);
}
var extendedInputs = ruleParams.Concat(scopedParams);
var result = ruleFunc(extendedInputs.ToArray());
return result;
}
private RuleExpressionBuilderBase GetExpressionBuilder(RuleExpressionType expressionType)
{
return _expressionBuilderFactory.RuleGetExpressionBuilder(expressionType);