public GraphSubject EnsureGraphSubject(GraphIssuer graphIssuer, string subjectId) { var index = EnsureGraphIssuer(subjectId).Index; if (!graphIssuer.Subjects.ContainsKey(index)) { var graphSubject = CreateGraphSubject(subjectId); graphIssuer.Subjects.Add(index, graphSubject); } return(graphIssuer.Subjects[index]); }
protected void SearchIssuer(QueryContext context, GraphIssuer issuer) { var tracker = new GraphTracker(issuer); context.Tracker.Push(tracker); // Set the Issuer to visited bit, avoiding re-searching the issuer context.Visited.SetFast(issuer.Index, true); // Process current level if (context.Tracker.Count == context.Level) { context.IssuerCount++; // Run though all targets foreach (var targetIndex in context.Targets.Keys) { // Check the current issuer if it has trusted the target! if (!issuer.TryGetSubject(targetIndex, out GraphSubject graphSubject)) { continue; } tracker.SubjectKey = targetIndex; context.SubjectCount++; SearchSubject(context, tracker, graphSubject); } } else { // Otherwise continue down! if (issuer.SubjectsCount() > 0) { foreach (var subjectEntry in issuer.Subjects) // Need only to iterate subjects that are entities not things { tracker.SubjectKey = subjectEntry.Key; if (context.Visited.GetFast(subjectEntry.Value.TargetIssuer.Index)) { continue; } if (FollowIssuer(context, subjectEntry.Value)) { SearchIssuer(context, subjectEntry.Value.TargetIssuer); } } } } context.Tracker.Pop(); }
public GraphIssuer EnsureGraphIssuer(string issuerId) { if (!Graph.IssuerIndex.TryGetValue(issuerId, out int index)) { index = Graph.Issuers.Count; var issuer = new GraphIssuer { Id = issuerId, Index = index }; Graph.Issuers.Add(issuer); Graph.IssuerIndex.Add(issuerId, index); return(issuer); } return(Graph.Issuers[index]); }