示例#1
0
文件: Session.cs 项目: zhrjin/NRules
        public void RetractLinked(Activation activation, object key, object fact)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }
            if (fact == null)
            {
                throw new ArgumentNullException(nameof(fact));
            }
            var factWrapper = _workingMemory.GetFact(fact);

            if (factWrapper == null)
            {
                throw new ArgumentException($"Linked fact does not exist. Key={key}", nameof(fact));
            }
            _network.PropagateRetract(_executionContext, new List <Fact> {
                factWrapper
            });
            _workingMemory.RemoveLinkedFact(activation, key, factWrapper);
        }
示例#2
0
        public void Fire()
        {
            while (_agenda.HasActiveRules())
            {
                Activation    activation    = _agenda.NextActivation();
                ICompiledRule rule          = activation.Rule;
                var           actionContext = new ActionContext(rule.Definition, this);

                _eventAggregator.RaiseRuleFiring(this, activation);
                foreach (IRuleAction action in rule.Actions)
                {
                    action.Invoke(_executionContext, actionContext, activation.Tuple, activation.TupleFactMap, rule.Dependencies);
                }
                _eventAggregator.RaiseRuleFired(this, activation);

                if (actionContext.IsHalted)
                {
                    break;
                }
            }
        }
示例#3
0
        public int Fire(int maxRulesNumber)
        {
            int ruleFiredCount = 0;

            while (!_agenda.IsEmpty && ruleFiredCount < maxRulesNumber)
            {
                Activation     activation    = _agenda.Pop();
                IActionContext actionContext = new ActionContext(this, activation);

                _actionExecutor.Execute(_executionContext, actionContext);
                ruleFiredCount++;

                UnlinkFacts();

                if (actionContext.IsHalted)
                {
                    break;
                }
            }
            return(ruleFiredCount);
        }
示例#4
0
文件: Agenda.cs 项目: zhrjin/NRules
 private bool AcceptActivation(Activation activation)
 {
     foreach (var filter in _globalFilters)
     {
         if (!filter.Accept(activation))
         {
             return(false);
         }
     }
     if (!_ruleFilters.TryGetValue(activation.Rule, out var ruleFilters))
     {
         return(true);
     }
     foreach (var filter in ruleFilters)
     {
         if (!filter.Accept(activation))
         {
             return(false);
         }
     }
     return(true);
 }
示例#5
0
文件: Session.cs 项目: zhrjin/NRules
        public void InsertLinked(Activation activation, object key, object fact)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }
            if (fact == null)
            {
                throw new ArgumentNullException(nameof(fact));
            }
            var factWrapper = _workingMemory.GetLinkedFact(activation, key);

            if (factWrapper != null)
            {
                throw new ArgumentException($"Linked fact already exists. Key={key}", nameof(fact));
            }
            factWrapper = new Fact(fact);
            _workingMemory.AddLinkedFact(activation, key, factWrapper);
            _network.PropagateAssert(_executionContext, new List <Fact> {
                factWrapper
            });
        }
示例#6
0
        public void UpdateLinked(Activation activation, IEnumerable <KeyValuePair <object, object> > keyedFacts)
        {
            var toUpdate    = new List <Tuple <object, Fact, object> >();
            var toPropagate = new List <Fact>();

            foreach (var keyedFact in keyedFacts)
            {
                var key         = keyedFact.Key;
                var factWrapper = _workingMemory.GetLinkedFact(activation, key);
                if (factWrapper == null)
                {
                    throw new ArgumentException($"Linked fact does not exist. Key={key}");
                }
                factWrapper.Source = new LinkedFactSource(activation);
                toUpdate.Add(System.Tuple.Create(key, factWrapper, keyedFact.Value));
                toPropagate.Add(factWrapper);
            }
            foreach (var item in toUpdate)
            {
                _workingMemory.UpdateLinkedFact(activation, item.Item1, item.Item2, item.Item3);
            }
            _network.PropagateUpdate(_executionContext, toPropagate);
        }
示例#7
0
        public void Execute(IExecutionContext executionContext, IActionContext actionContext)
        {
            ISession   session    = executionContext.Session;
            Activation activation = actionContext.Activation;

            var invocations = CreateInvocations(executionContext, actionContext);

            executionContext.EventAggregator.RaiseRuleFiring(session, activation);
            var interceptor = session.ActionInterceptor;

            if (interceptor != null)
            {
                interceptor.Intercept(actionContext, invocations);
            }
            else
            {
                foreach (var invocation in invocations)
                {
                    invocation.Invoke();
                }
            }
            executionContext.EventAggregator.RaiseRuleFired(session, activation);
        }
示例#8
0
        public void Execute(IExecutionContext executionContext, IActionContext actionContext)
        {
            ISession   session    = executionContext.Session;
            Activation activation = actionContext.Activation;

            var invocations = CreateInvocations(executionContext, actionContext);

            executionContext.EventAggregator.RaiseRuleFiring(session, activation);
            var interceptor = session.ActionInterceptor;

            if (interceptor != null)
            {
                interceptor.Intercept(actionContext, invocations);
            }
            else
            {
                foreach (var invocation in invocations)
                {
                    try
                    {
                        invocation.Invoke();
                    }
                    catch (Exception e)
                    {
                        bool isHandled  = false;
                        var  expression = invocation.RuleAction.Expression;
                        executionContext.EventAggregator.RaiseActionFailed(executionContext.Session, e, expression, actionContext.Activation, ref isHandled);
                        if (!isHandled)
                        {
                            throw new RuleActionEvaluationException("Failed to evaluate rule action",
                                                                    actionContext.Rule.Name, expression.ToString(), e);
                        }
                    }
                }
            }
            executionContext.EventAggregator.RaiseRuleFired(session, activation);
        }
示例#9
0
        public void InsertLinked(Activation activation, IEnumerable <KeyValuePair <object, object> > keyedFacts)
        {
            var toAdd       = new List <Tuple <object, Fact> >();
            var toPropagate = new List <Fact>();

            foreach (var keyedFact in keyedFacts)
            {
                var key         = keyedFact.Key;
                var factWrapper = _workingMemory.GetLinkedFact(activation, key);
                if (factWrapper != null)
                {
                    throw new ArgumentException($"Linked fact already exists. Key={key}");
                }
                factWrapper        = new SyntheticFact(keyedFact.Value);
                factWrapper.Source = new LinkedFactSource(activation);
                toAdd.Add(System.Tuple.Create(key, factWrapper));
                toPropagate.Add(factWrapper);
            }
            foreach (var item in toAdd)
            {
                _workingMemory.AddLinkedFact(activation, item.Item1, item.Item2);
            }
            _network.PropagateAssert(_executionContext, toPropagate);
        }
示例#10
0
文件: Session.cs 项目: zhrjin/NRules
        public object GetLinked(Activation activation, object key)
        {
            var factWrapper = _workingMemory.GetLinkedFact(activation, key);

            return(factWrapper?.Object);
        }
示例#11
0
文件: Session.cs 项目: zhrjin/NRules
        public IEnumerable <object> GetLinkedKeys(Activation activation)
        {
            var keys = _workingMemory.GetLinkedKeys(activation);

            return(keys);
        }
示例#12
0
 public ActionContext(ISession session, Activation activation)
 {
     _session    = session;
     _activation = activation;
     _isHalted   = false;
 }
示例#13
0
 public LinkedFactSource(Activation activation)
 {
     _activation = activation;
 }
示例#14
0
 public void Remove(Activation activation)
 {
     activation.IsEnqueued = false;
 }
示例#15
0
 public void Activate(Activation activation)
 {
     _activationQueue.Enqueue(activation.Rule.Priority, activation);
 }
示例#16
0
文件: Agenda.cs 项目: zhrjin/NRules
        public IMatch Peek()
        {
            Activation activation = _activationQueue.Peek();

            return(activation);
        }
示例#17
0
文件: Agenda.cs 项目: zhrjin/NRules
 public void Remove(IExecutionContext context, Activation activation)
 {
     _activationQueue.Remove(activation);
     UnlinkFacts(context.Session, activation);
 }
示例#18
0
 public void Deactivate(Activation activation)
 {
     _activationQueue.Remove(activation);
 }
示例#19
0
 public ActivationEventArgs(Activation activation)
 {
     Activation = activation;
 }
示例#20
0
 public ActionContext(ISessionInternal session, Activation activation)
 {
     _session   = session;
     Activation = activation;
     IsHalted   = false;
 }
示例#21
0
        public Activation NextActivation()
        {
            Activation activation = _activationQueue.Dequeue();

            return(activation);
        }
示例#22
0
 public void Remove(Activation activation)
 {
     _activations.Remove(activation);
     _refractions.Remove(activation);
 }
示例#23
0
        public Activation Peek()
        {
            Activation activation = _queue.Peek();

            return(activation);
        }
示例#24
0
文件: Agenda.cs 项目: zhrjin/NRules
        public Activation Pop()
        {
            Activation activation = _activationQueue.Dequeue();

            return(activation);
        }
示例#25
0
 public void Enqueue(int priority, Activation activation)
 {
     _activations.Add(activation);
     _queue.Enqueue(priority, activation);
 }