コード例 #1
0
        public IEnumerable <AggregationResult> Modify(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
        {
            var keys         = new List <TKey>();
            var resultLookup = new DefaultKeyMap <TKey, AggregationResult>();
            var removedKeys  = new HashSet <TKey>();

            foreach (var fact in facts)
            {
                var key        = (TKey)_keySelector.Invoke(context, tuple, fact);
                var element    = (TElement)_elementSelector.Invoke(context, tuple, fact);
                var oldKey     = _sourceToKey[fact];
                var oldElement = _sourceToElement[fact];
                _sourceToKey[fact]     = key;
                _sourceToElement[fact] = element;

                if (Equals(key, oldKey))
                {
                    var result = Modify(fact, key, element);
                    if (!resultLookup.ContainsKey(key))
                    {
                        keys.Add(key);
                        resultLookup[key] = result;
                    }
                }
                else
                {
                    var result1 = RemoveElementOnly(fact, oldKey, oldElement);
                    if (!resultLookup.ContainsKey(oldKey))
                    {
                        keys.Add(oldKey);
                    }
                    if (result1.Action == AggregationAction.Removed)
                    {
                        removedKeys.Add(oldKey);
                    }
                    resultLookup[oldKey] = result1;

                    var result2 = Add(fact, key, element);
                    if (!resultLookup.TryGetValue(key, out var previousResult))
                    {
                        keys.Add(key);
                        resultLookup[key] = result2;
                    }
                    else if (previousResult.Action == AggregationAction.Removed)
                    {
                        resultLookup[key] = result2;
                        removedKeys.Remove(key);
                    }
                }
            }

            foreach (var removedKey in removedKeys)
            {
                _groups.Remove(removedKey);
            }

            var results = GetResults(keys, resultLookup);

            return(results);
        }
コード例 #2
0
        public object Invoke(AggregationContext context, ITuple tuple, IFact fact)
        {
            var args  = new object[_compiledExpression.ArrayArgumentCount];
            int index = tuple.Count - 1;

            foreach (var tupleFact in tuple.Facts)
            {
                IndexMap.SetElementAt(args, _factMap[index], tupleFact.Value);
                index--;
            }
            IndexMap.SetElementAt(args, _factMap[tuple.Count], fact.Value);

            Exception exception = null;
            object    result    = null;

            try
            {
                result = _compiledExpression.Delegate(args);
                return(result);
            }
            catch (Exception e)
            {
                exception = e;
                bool isHandled = false;
                context.EventAggregator.RaiseLhsExpressionFailed(context.Session, e, _expression, args, tuple, fact, context.NodeInfo, ref isHandled);
                throw new ExpressionEvaluationException(e, _expression, isHandled);
            }
            finally
            {
                context.EventAggregator.RaiseLhsExpressionEvaluated(context.Session, exception, _expression, args, result, tuple, fact, context.NodeInfo);
            }
        }
コード例 #3
0
ファイル: SortedAggregator.cs プロジェクト: zhlf1987/NRules
 private void RemoveFacts(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
 {
     foreach (var fact in facts)
     {
         _sortedFactCollection.RemoveFact(fact);
     }
 }
コード例 #4
0
ファイル: SortedAggregator.cs プロジェクト: zhlf1987/NRules
 private void AddFacts(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
 {
     foreach (var fact in facts)
     {
         var key = (TKey)_keySelector.Invoke(context, tuple, fact);
         _sortedFactCollection.AddFact(key, fact);
     }
 }
コード例 #5
0
 public IEnumerable <AggregationResult> Add(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
 {
     AddFacts(facts);
     if (!_created)
     {
         _created = true;
         return(new[] { AggregationResult.Added(_items, _items.Facts) });
     }
     return(new[] { AggregationResult.Modified(_items, _items, _items.Facts) });
 }
コード例 #6
0
        private object[] GetKey(AggregationContext context, ITuple tuple, IFact fact)
        {
            var key = new object[_sortConditions.Length];

            for (int i = 0; i < _sortConditions.Length; i++)
            {
                key[i] = _sortConditions[i].KeySelector.Invoke(context, tuple, fact);
            }
            return(key);
        }
コード例 #7
0
        private void ModifyFacts(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
        {
            foreach (var fact in facts)
            {
                _sortedFactCollection.RemoveFact(fact);

                var key = GetKey(context, tuple, fact);
                _sortedFactCollection.AddFact(key, fact);
            }
        }
コード例 #8
0
ファイル: SortedAggregator.cs プロジェクト: zhlf1987/NRules
 public IEnumerable <AggregationResult> Add(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
 {
     AddFacts(context, tuple, facts);
     if (!_created)
     {
         _created = true;
         return(new[] { AggregationResult.Added(_sortedFactCollection, _sortedFactCollection.GetFactEnumerable()) });
     }
     return(new[] { AggregationResult.Modified(_sortedFactCollection, _sortedFactCollection, _sortedFactCollection.GetFactEnumerable()) });
 }
コード例 #9
0
        public IEnumerable <AggregationResult> Add(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                var value = _selector.Invoke(context, tuple, fact);
                _sourceToValue[fact] = value;
                results.Add(AggregationResult.Added(value, Enumerable.Repeat(fact, 1)));
            }
            return(results);
        }
コード例 #10
0
        public IEnumerable <AggregationResult> Remove(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                var oldValue = _sourceToValue[fact];
                _sourceToValue.Remove(fact);
                results.Add(AggregationResult.Removed(oldValue));
            }
            return(results);
        }
コード例 #11
0
        public IEnumerable <AggregationResult> Remove(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                var oldList = _sourceToList[fact];
                _sourceToList.Remove(fact);
                foreach (var item in oldList)
                {
                    if (RemoveRef(item) == 0)
                    {
                        results.Add(AggregationResult.Removed(item));
                    }
                }
            }
            return(results);
        }
コード例 #12
0
        public IEnumerable <AggregationResult> Add(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                var list = new OrderedHashSet <TResult>();
                _sourceToList[fact] = list;
                var value = (IEnumerable <TResult>)_selector.Invoke(context, tuple, fact);
                foreach (var item in value)
                {
                    if (list.Add(item) &&
                        AddRef(item) == 1)
                    {
                        results.Add(AggregationResult.Added(item, Enumerable.Repeat(fact, 1)));
                    }
                }
            }
            return(results);
        }
コード例 #13
0
        public IEnumerable <AggregationResult> Remove(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
        {
            var keys         = new List <TKey>();
            var resultLookup = new DefaultKeyMap <TKey, AggregationResult>();

            foreach (var fact in facts)
            {
                var oldKey     = _sourceToKey[fact];
                var oldElement = _sourceToElement[fact];
                _sourceToKey.Remove(fact);
                _sourceToElement.Remove(fact);
                var result = Remove(fact, oldKey, oldElement);
                if (!resultLookup.ContainsKey(oldKey))
                {
                    keys.Add(oldKey);
                }
                resultLookup[oldKey] = result;
            }
            var results = GetResults(keys, resultLookup);

            return(results);
        }
コード例 #14
0
        public IEnumerable <AggregationResult> Add(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
        {
            var keys         = new List <TKey>();
            var resultLookup = new DefaultKeyMap <TKey, AggregationResult>();

            foreach (var fact in facts)
            {
                var key     = (TKey)_keySelector.Invoke(context, tuple, fact);
                var element = (TElement)_elementSelector.Invoke(context, tuple, fact);
                _sourceToKey[fact]     = key;
                _sourceToElement[fact] = element;
                var result = Add(fact, key, element);
                if (!resultLookup.ContainsKey(key))
                {
                    keys.Add(key);
                    resultLookup[key] = result;
                }
            }
            var results = GetResults(keys, resultLookup);

            return(results);
        }
コード例 #15
0
        public IEnumerable <AggregationResult> Modify(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                var list    = new OrderedHashSet <TResult>();
                var oldList = _sourceToList[fact];
                _sourceToList[fact] = list;

                var value = (IEnumerable <TResult>)_selector.Invoke(context, tuple, fact);
                foreach (var item in value)
                {
                    list.Add(item);
                }

                foreach (var item in oldList)
                {
                    if (!list.Contains(item) &&
                        RemoveRef(item) == 0)
                    {
                        results.Add(AggregationResult.Removed(item));
                    }
                }
                foreach (var item in list)
                {
                    if (oldList.Contains(item))
                    {
                        results.Add(AggregationResult.Modified(item, item, Enumerable.Repeat(fact, 1)));
                    }
                    else if (AddRef(item) == 1)
                    {
                        results.Add(AggregationResult.Added(item, Enumerable.Repeat(fact, 1)));
                    }
                }
            }
            return(results);
        }
コード例 #16
0
        public object Invoke(AggregationContext context, ITuple tuple, IFact fact)
        {
            var       factValue = fact.Value;
            Exception exception = null;
            object    result    = null;

            try
            {
                result = _compiledExpression.Delegate(factValue);
                return(result);
            }
            catch (Exception e)
            {
                exception = e;
                bool isHandled = false;
                context.EventAggregator.RaiseLhsExpressionFailed(context.Session, e, _expression, factValue, tuple, fact, context.NodeInfo, ref isHandled);
                throw new ExpressionEvaluationException(e, _expression, isHandled);
            }
            finally
            {
                context.EventAggregator.RaiseLhsExpressionEvaluated(context.Session, exception, _expression, factValue, result, tuple, fact, context.NodeInfo);
            }
        }
コード例 #17
0
ファイル: AggregateExpression.cs プロジェクト: zhjrate/NRules
 public object Invoke(AggregationContext context, ITuple tuple, IFact fact)
 {
     return(_compiledExpression.Invoke(context.ExecutionContext, context.NodeInfo, tuple as Tuple, fact as Fact));
 }
コード例 #18
0
 public IEnumerable <AggregationResult> Remove(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
 {
     RemoveFacts(facts);
     return(new[] { AggregationResult.Modified(_items, _items, _items.Facts) });
 }
コード例 #19
0
ファイル: SortedAggregator.cs プロジェクト: zhlf1987/NRules
 public IEnumerable <AggregationResult> Remove(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts)
 {
     RemoveFacts(context, tuple, facts);
     return(new[] { AggregationResult.Modified(_sortedFactCollection, _sortedFactCollection, _sortedFactCollection.GetFactEnumerable()) });
 }