コード例 #1
0
        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]);
        }
コード例 #2
0
        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();
        }
コード例 #3
0
        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]);
        }