private void CompileRule(ReteBuilder reteBuilder, IRuleDefinition ruleDefinition) { var transformation = new RuleTransformation(); var transformedRule = transformation.Transform(ruleDefinition); var ruleDeclarations = transformedRule.LeftHandSide.Declarations.ToList(); var ruleDependencies = transformedRule.DependencyGroup.Dependencies.Select(x => x.Declaration).ToList(); IEnumerable <IRuleDependency> dependencies = CompileDependencies(transformedRule); IEnumerable <ITerminalNode> terminals = reteBuilder.AddRule(transformedRule); var rightHandSide = transformedRule.RightHandSide; var actions = new List <IRuleAction>(); foreach (var action in rightHandSide.Actions) { var factIndexMap = IndexMap.CreateMap(action.References, ruleDeclarations); var dependencyIndexMap = IndexMap.CreateMap(action.References, ruleDependencies); var ruleAction = new RuleAction(action.Expression, factIndexMap, dependencyIndexMap); actions.Add(ruleAction); } var rule = new CompiledRule(ruleDefinition, actions, dependencies); BuildRuleNode(rule, terminals); }
/// <summary> /// Compiles a collection of rules into a session factory. /// </summary> /// <param name="ruleDefinitions">Rules to compile.</param> /// <param name="cancellationToken">Enables cooperative cancellation of the rules compilation.</param> /// <returns>Session factory.</returns> /// <exception cref="RuleCompilationException">Any fatal error during rules compilation.</exception> /// <seealso cref="IRuleRepository"/> public ISessionFactory Compile(IEnumerable <IRuleDefinition> ruleDefinitions, CancellationToken cancellationToken) { IReteBuilder reteBuilder = new ReteBuilder(_aggregatorRegistry); var compiledRules = new List <ICompiledRule>(); foreach (var ruleDefinition in ruleDefinitions) { try { var compiledRule = CompileRule(reteBuilder, ruleDefinition); compiledRules.AddRange(compiledRule); } catch (Exception e) { throw new RuleCompilationException("Failed to compile rule", ruleDefinition.Name, e); } if (cancellationToken.IsCancellationRequested) { break; } } INetwork network = reteBuilder.Build(); var factory = new SessionFactory(network, compiledRules); return(factory); }
public ISessionFactory Compile(IEnumerable <IRuleDefinition> ruleDefinitions) { var rules = new List <ICompiledRule>(); var reteBuilder = new ReteBuilder(); foreach (var ruleDefinition in ruleDefinitions) { var context = new ReteBuilderContext(); ITerminalNode terminalNode = reteBuilder.AddRule(context, ruleDefinition); ICompiledRule compiledRule = CompileRule(context, ruleDefinition); BuildRuleNode(compiledRule, terminalNode); rules.Add(compiledRule); } INetwork network = reteBuilder.GetNetwork(); var factory = new SessionFactory(network); return(factory); }
/// <summary> /// Compiles a collection of rules into a session factory. /// </summary> /// <param name="ruleDefinitions">Rules to compile.</param> /// <returns>Session factory.</returns> /// <exception cref="RuleCompilationException">Any fatal error during rules compilation.</exception> /// <seealso cref="IRuleRepository"/> public ISessionFactory Compile(IEnumerable<IRuleDefinition> ruleDefinitions) { var reteBuilder = new ReteBuilder(); foreach (var ruleDefinition in ruleDefinitions) { try { CompileRule(reteBuilder, ruleDefinition); } catch (Exception e) { throw new RuleCompilationException("Failed to compile rule", ruleDefinition.Name, e); } } INetwork network = reteBuilder.Build(); var factory = new SessionFactory(network); return factory; }
/// <summary> /// Compiles a collection of rules into a session factory. /// </summary> /// <param name="ruleDefinitions">Rules to compile.</param> /// <returns>Session factory.</returns> /// <exception cref="RuleCompilationException">Any fatal error during rules compilation.</exception> /// <seealso cref="IRuleRepository"/> public ISessionFactory Compile(IEnumerable <IRuleDefinition> ruleDefinitions) { IReteBuilder reteBuilder = new ReteBuilder(); foreach (var ruleDefinition in ruleDefinitions) { try { CompileRule(reteBuilder, ruleDefinition); } catch (Exception e) { throw new RuleCompilationException("Failed to compile rule", ruleDefinition.Name, e); } } INetwork network = reteBuilder.Build(); var factory = new SessionFactory(network); return(factory); }
private ICompiledRule CompileRule(ReteBuilder reteBuilder, IRuleDefinition ruleDefinition) { var transformation = new RuleTransformation(); var transformedRule = transformation.Transform(ruleDefinition); var ruleDeclarations = transformedRule.LeftHandSide.Declarations.ToList(); IEnumerable <ITerminalNode> terminals = reteBuilder.AddRule(transformedRule); var rightHandSide = transformedRule.RightHandSide; var actions = new List <IRuleAction>(); foreach (var action in rightHandSide.Actions) { var factIndexMap = FactIndexMap.CreateMap(action.References, ruleDeclarations); var ruleAction = new RuleAction(action.Expression, factIndexMap); actions.Add(ruleAction); } var rule = new CompiledRule(ruleDefinition, actions); BuildRuleNode(rule, terminals); return(rule); }
private void CompileRule(ReteBuilder reteBuilder, IRuleDefinition ruleDefinition) { var transformation = new RuleTransformation(); var transformedRule = transformation.Transform(ruleDefinition); var ruleDeclarations = transformedRule.LeftHandSide.Declarations.ToList(); var ruleDependencies = transformedRule.DependencyGroup.Dependencies.Select(x => x.Declaration).ToList(); IEnumerable<IRuleDependency> dependencies = CompileDependencies(transformedRule); IEnumerable<ITerminalNode> terminals = reteBuilder.AddRule(transformedRule); var rightHandSide = transformedRule.RightHandSide; var actions = new List<IRuleAction>(); foreach (var action in rightHandSide.Actions) { var factIndexMap = IndexMap.CreateMap(action.References, ruleDeclarations); var dependencyIndexMap = IndexMap.CreateMap(action.References, ruleDependencies); var ruleAction = new RuleAction(action.Expression, factIndexMap, dependencyIndexMap); actions.Add(ruleAction); } var rule = new CompiledRule(ruleDefinition, actions, dependencies); BuildRuleNode(rule, terminals); }