Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        /// <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;
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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);
        }