コード例 #1
0
        private AggregationResult Modify(TKey key, TElement element)
        {
            var group = _groups[key];

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

            foreach (var fact in facts)
            {
                var collection = (IEnumerable <TElement>)fact.Value;
                foreach (var value in collection)
                {
                    if (_firstElements.TryGetValue(fact, out var oldFirst))
                    {
                        if (Equals(oldFirst, value))
                        {
                            results.Add(AggregationResult.Modified(value, value, Enumerable.Repeat(fact, 1)));
                        }
                        else
                        {
                            results.Add(AggregationResult.Removed(oldFirst));
                            results.Add(AggregationResult.Added(value, Enumerable.Repeat(fact, 1)));
                        }
                    }
                    else
                    {
                        results.Add(AggregationResult.Added(value, Enumerable.Repeat(fact, 1)));
                    }
                    _firstElements[fact] = value;
                    break;
                }
            }
            return(results);
        }
コード例 #3
0
ファイル: GroupByAggregator.cs プロジェクト: sscctech/NRules
        private IEnumerable <AggregationResult> Add(TKey key, TElement element)
        {
            if (Equals(key, _defaultKey))
            {
                if (_defaultGroup == null)
                {
                    _defaultGroup = new Grouping(key);
                    _defaultGroup.Add(element);
                    return(new[] { AggregationResult.Added(_defaultGroup) });
                }
                _defaultGroup.Add(element);
                return(new[] { AggregationResult.Modified(_defaultGroup) });
            }

            Grouping group;

            if (!_groups.TryGetValue(key, out group))
            {
                group        = new Grouping(key);
                _groups[key] = group;

                group.Add(element);
                return(new[] { AggregationResult.Added(group) });
            }

            group.Add(element);
            return(new[] { AggregationResult.Modified(group) });
        }
コード例 #4
0
        public IEnumerable <AggregationResult> Remove(object fact)
        {
            var item = (TElement)fact;

            _items.Remove(item);
            return(new[] { AggregationResult.Modified(_items) });
        }
コード例 #5
0
 public IEnumerable <AggregationResult> Add(ITuple tuple, IEnumerable <IFact> facts)
 {
     AddFacts(facts);
     if (!_created)
     {
         _created = true;
         return(new[] { AggregationResult.Added(_items) });
     }
     return(new[] { AggregationResult.Modified(_items) });
 }
コード例 #6
0
        private AggregationResult Remove(TKey key, TElement element)
        {
            var group = _groups[key];

            group.Remove(element);
            if (group.Count == 0)
            {
                _groups.Remove(key);
                return(AggregationResult.Removed(group));
            }
            return(AggregationResult.Modified(group));
        }
コード例 #7
0
        public IEnumerable <AggregationResult> Modify(ITuple tuple, IEnumerable <IFact> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                var value    = _selector.Invoke(tuple, fact);
                var oldValue = (TResult)_sourceToValue[fact];
                _sourceToValue[fact] = value;
                results.Add(AggregationResult.Modified(value, oldValue));
            }
            return(results);
        }
コード例 #8
0
ファイル: GroupByAggregator.cs プロジェクト: sscctech/NRules
        private IEnumerable <AggregationResult> Modify(TKey key, TElement element)
        {
            if (Equals(key, _defaultKey))
            {
                _defaultGroup.Modify(element);
                return(new[] { AggregationResult.Modified(_defaultGroup) });
            }

            var group = _groups[key];

            group.Modify(element);
            return(new[] { AggregationResult.Modified(group) });
        }
コード例 #9
0
        public IEnumerable <AggregationResult> Modify(IEnumerable <object> facts)
        {
            var keys         = new List <TKey>();
            var resultLookup = new DefaultKeyMap <TKey, AggregationResult>();

            foreach (var fact in facts)
            {
                var source     = (TSource)fact;
                var key        = _keySelector(source);
                var element    = _elementSelector(source);
                var oldKey     = _sourceToKey[fact];
                var oldElement = _sourceToElement[fact];
                _sourceToKey[fact]     = key;
                _sourceToElement[fact] = element;

                if (Equals(key, oldKey))
                {
                    var result = Modify(key, element);
                    if (!resultLookup.ContainsKey(key))
                    {
                        keys.Add(key);
                        resultLookup[key] = result;
                    }
                }
                else
                {
                    var result1 = Remove(oldKey, oldElement);
                    if (!resultLookup.ContainsKey(oldKey))
                    {
                        keys.Add(oldKey);
                    }
                    resultLookup[oldKey] = result1;

                    var result2 = Add(key, element);
                    AggregationResult previousResult;
                    if (!resultLookup.TryGetValue(key, out previousResult))
                    {
                        keys.Add(key);
                        resultLookup[key] = result2;
                    }
                    else if (previousResult.Action == AggregationAction.Removed ||
                             result2.Action == AggregationAction.Added)
                    {
                        resultLookup[key] = AggregationResult.Modified(previousResult.Aggregate);
                    }
                }
            }
            var results = GetResults(keys, resultLookup);

            return(results);
        }
コード例 #10
0
        private AggregationResult Modify(TKey key, TElement oldElement, TElement element)
        {
            var group = _groups[key];

            if (Equals(oldElement, element))
            {
                group.Modify(element);
            }
            else
            {
                group.Remove(oldElement);
                group.Add(element);
            }
            return(AggregationResult.Modified(group));
        }
コード例 #11
0
        private AggregationResult Add(TKey key, TElement element)
        {
            Grouping group;

            if (!_groups.TryGetValue(key, out group))
            {
                group        = new Grouping(key);
                _groups[key] = group;

                group.Add(element);
                return(AggregationResult.Added(group));
            }

            group.Add(element);
            return(AggregationResult.Modified(group));
        }
コード例 #12
0
        public IEnumerable <AggregationResult> Modify(object fact)
        {
            var source   = (TSource)fact;
            var value    = _selector(source);
            var oldValue = _sourceToValue[source];

            _sourceToValue[source] = value;

            if (Equals(oldValue, value))
            {
                return new[] { AggregationResult.Modified(value) }
            }
            ;

            return(new[] { AggregationResult.Removed(oldValue), AggregationResult.Added(value) });
        }
コード例 #13
0
        public IEnumerable <AggregationResult> Modify(ITuple tuple, IEnumerable <IFact> facts)
        {
            var results = new List <AggregationResult>();

            foreach (var fact in facts)
            {
                var source   = (TSource)fact.Value;
                var value    = _selector.Invoke(tuple, fact);
                var oldValue = (TResult)_sourceToValue[source];
                _sourceToValue[source] = value;

                if (Equals(oldValue, value))
                {
                    results.Add(AggregationResult.Modified(value));
                }
                else
                {
                    results.Add(AggregationResult.Removed(oldValue));
                    results.Add(AggregationResult.Added(value));
                }
            }
            return(results);
        }
コード例 #14
0
ファイル: GroupByAggregator.cs プロジェクト: sscctech/NRules
        private IEnumerable <AggregationResult> Remove(TKey key, TElement element)
        {
            if (Equals(key, _defaultKey))
            {
                _defaultGroup.Remove(element);
                if (_defaultGroup.Count == 0)
                {
                    var removedGroup = _defaultGroup;
                    _defaultGroup = null;
                    return(new[] { AggregationResult.Removed(removedGroup) });
                }
                return(new[] { AggregationResult.Modified(_defaultGroup) });
            }

            var group = _groups[key];

            group.Remove(element);
            if (group.Count == 0)
            {
                _groups.Remove(key);
                return(new[] { AggregationResult.Removed(group) });
            }
            return(new[] { AggregationResult.Modified(group) });
        }
コード例 #15
0
 public IEnumerable <AggregationResult> Remove(ITuple tuple, IEnumerable <IFact> facts)
 {
     RemoveFacts(facts);
     return(new[] { AggregationResult.Modified(_items) });
 }
コード例 #16
0
 public IEnumerable <AggregationResult> Modify(IEnumerable <object> facts)
 {
     ModifyFacts(facts);
     return(new[] { AggregationResult.Modified(_items) });
 }