public int Update(Peer peer, BindingKey subscription, UpdateAction action) { if (IsLeaf(subscription)) { var update = UpdateList(peer, action); _peerCountIncludingChildren += update; return(update); } var nextPart = subscription.GetPart(_nextPartIndex); if (subscription.IsSharp(_nextPartIndex) || nextPart == null) { var sharpNode = GetOrCreateSharpNode(); return(UpdateChildNode(sharpNode, peer, subscription, action, null, _removeSharpNode)); } if (subscription.IsStar(_nextPartIndex)) { var starNode = GetOrCreateStarNode(); return(UpdateChildNode(starNode, peer, subscription, action, null, _removeStarNode)); } var childNode = GetOrAddChildNode(nextPart); return(UpdateChildNode(childNode, peer, subscription, action, nextPart, _removeNode)); }
public void Accept(PeerCollector peerCollector, BindingKey routingKey) { if (IsLeaf(routingKey) || _matchesAll) { peerCollector.Offer(_peers); return; } _sharpNode?.Accept(peerCollector, routingKey); _starNode?.Accept(peerCollector, routingKey); var nextPart = routingKey.GetPart(_nextPartIndex); if (nextPart == null) { return; } if (_childrenNodes == null) { return; } SubscriptionNode childNode; if (_childrenNodes.TryGetValue(nextPart, out childNode)) { childNode.Accept(peerCollector, routingKey); } }
public static Func <IMessage, bool> GetPredicate(Type messageType, BindingKey bindingKey) { if (bindingKey.IsEmpty) { return(_ => true); } var cacheItem = GetOrCreateCacheItem(messageType); var count = Math.Min(cacheItem.MembersToStringExpressions.Count, bindingKey.PartCount); var subPredicates = new List <Expression>(); for (var index = 0; index < count; index++) { if (bindingKey.IsSharp(index)) { break; } if (bindingKey.IsStar(index)) { continue; } var part = bindingKey.GetPart(index); var memberToStringExpression = cacheItem.MembersToStringExpressions[index]; subPredicates.Add(Expression.MakeBinary(ExpressionType.Equal, memberToStringExpression, Expression.Constant(part))); } if (!subPredicates.Any()) { return(_ => true); } var finalExpression = subPredicates.Aggregate((Expression)null, (final, exp) => final == null ? exp : Expression.AndAlso(final, exp)); return((Func <IMessage, bool>)Expression.Lambda(finalExpression, cacheItem.ParameterExpression).Compile()); }
public bool Matches(BindingKey routingKey) { if (BindingKey.IsEmpty) { return(true); } for (var i = 0; i < routingKey.PartCount; i++) { var evaluatedPart = BindingKey.GetPart(i); if (evaluatedPart == "#") { return(true); } if (evaluatedPart != "*" && routingKey.GetPart(i) != evaluatedPart) { return(false); } } return(routingKey.PartCount == BindingKey.PartCount); }