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); }
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); } }
private void RemoveFacts(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts) { foreach (var fact in facts) { _sortedFactCollection.RemoveFact(fact); } }
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); } }
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) }); }
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); }
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); } }
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()) }); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); } }
public object Invoke(AggregationContext context, ITuple tuple, IFact fact) { return(_compiledExpression.Invoke(context.ExecutionContext, context.NodeInfo, tuple as Tuple, fact as Fact)); }
public IEnumerable <AggregationResult> Remove(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts) { RemoveFacts(facts); return(new[] { AggregationResult.Modified(_items, _items, _items.Facts) }); }
public IEnumerable <AggregationResult> Remove(AggregationContext context, ITuple tuple, IEnumerable <IFact> facts) { RemoveFacts(context, tuple, facts); return(new[] { AggregationResult.Modified(_sortedFactCollection, _sortedFactCollection, _sortedFactCollection.GetFactEnumerable()) }); }