public GroupedConnectionKey(IConnection connection, GroupedConnectionKeyLevel level) { Level = level; if (connection == null) { throw new ArgumentNullException(nameof(connection)); } var hashCode = Concat(GroupedConnectionKeyLevel.Host, connection.Host).GetHashCode(); if (level == GroupedConnectionKeyLevel.AuthorisationKey) { hashCode = (hashCode * 397) ^ Concat(GroupedConnectionKeyLevel.AuthorisationKey, connection.AuthorisationKey).GetHashCode(); } if (level == GroupedConnectionKeyLevel.DatabaseId) { hashCode = (hashCode * 397) ^ Concat(GroupedConnectionKeyLevel.DatabaseId, connection.DatabaseId).GetHashCode(); } if (level == GroupedConnectionKeyLevel.CollectionId) { hashCode = (hashCode * 397) ^ Concat(GroupedConnectionKeyLevel.CollectionId, connection.CollectionId).GetHashCode(); } _hashCode = hashCode; }
public static IDisposable BuildChildNodes <TNode>( this IExplicitConnectionCache explicitConnectionCache, IImplicitConnectionCache implicitConnectionCache, GroupedConnectionKey parentKey, GroupedConnectionKeyLevel childKeyLevel, Func <GroupedConnection, TNode> childNodeFactory, IComparer <TNode> sortComparer, IScheduler scheduler, out ReadOnlyObservableCollection <TNode> nodes) { return(explicitConnectionCache.Connect() //user could dupe the connections, so we group em all .Filter(FilterBuilder <ExplicitConnection>(parentKey)) .Group(explicitCn => new GroupedConnectionKey(explicitCn, childKeyLevel)) .FullJoin( implicitConnectionCache.Connect() .Filter(FilterBuilder <ImplicitConnection>(parentKey)) .Group( implicitCn => new GroupedConnectionKey(implicitCn, childKeyLevel)), implicitGroup => implicitGroup.Key, (key, left, right) => new GroupedConnection(key, left.GetOptionalConnections(), right.GetOptionalConnections())) .Filter(gc => !string.IsNullOrEmpty(gc[childKeyLevel])) .Transform(childNodeFactory) .DisposeMany() .Sort(sortComparer) .ObserveOn(scheduler) .Bind(out nodes) .Subscribe()); }
private static string Concat(GroupedConnectionKeyLevel level, string value) { return(level + (value ?? "")); }
public string this[GroupedConnectionKeyLevel keyLevel] => _valueIndex[keyLevel];